2016-09-29 2 views
1

Ich versuche, bestimmte Zeilen aus meiner Datenbank durch eine Artikelnr (in Niederländisch) zu löschen.Gelöschte in einer gespeicherten Prozedur fehlgeschlagen beim Aufruf aus VBA

Wenn ich versuche, meinen Code vom Zugriff auszuführen, wird kein Fehler ausgegeben, aber es wird auch nichts gelöscht.

Fehle ich hier etwas?

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name =  'spVerwijderArtikel') 
    DROP PROCEDURE spVerwijderArtikel 
GO 

CREATE PROCEDURE spVerwijderArtikel 
    (@ArtikelNr integer) 
AS 
BEGIN Transaction 
    DELETE FROM artikelprijs 
    WHERE ArtikelNr = @ArtikelNr 

    DELETE FROM Artikel 
    WHERE ArtikelNr = @ArtikelNr 

    IF @@ERROR <> 0 
    BEGIN 
     ROLLBACK 
     RAISERROR ('Error tijdens het uitvoeren', 16 , 1) 
     RETURN 
    END 

    COMMIT 
GO 

Und mein Code aus dem Zugriff versucht, die gespeicherte Prozedur auszuführen:

Private Sub Command2_Click() 

Dim conn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim sConnString As String 
sConnString = "Provider=SQLOLEDB;Data Source=.\SQLEXPRESS;" & _ 
    "Initial Catalog=KlantArtikelOpdracht;" & _ 
    "Integrated Security=SSPI;" 

Set conn = New ADODB.Connection 
Set rs = New ADODB.Recordset 

conn.Open sConnString 
Set rs = conn.Execute("EXEC spVerwijderArtikel'" & TxTArtikelNr & "'") 

End Sub 

mir jemand bei diesem Problem helfen könnte?

+1

Mit einem Integer, würde ich sagen, Sie brauchen 'Execute (" EXEC spVerwijderArtikel "& TxTArtikelNr)' – Andre

+1

@Andre Das ist egal. SQL wird es implizit umwandeln. Allerdings ist das OP sicher, dass TxTArtikelNr beim Verketten mit dem Befehl eigentlich ein int ist? Auch sollten Sie SQL-Abfrage-Parametrisierung verwenden, um SQL-Injection-Angriffe zu vermeiden (auch es ist eine gute Angewohnheit) –

+0

Sie sollten in der Verwendung von versuchen/fangen in Ihrem SQL. Es wird dieses Problem nicht beheben, aber Ihr Code wird viel sauberer sein. Und parametriere deine Abfragen bevor Bobby Tische zu Besuch kommen. http://bobby-tables.com/ –

Antwort

0

die Anweisung hinzufügen

SET NOCOUNT ON; 

als erste Anweisung der gespeicherten Prozedur (vor BEGIN Transaction). Das ermöglicht das Zurückgeben des RAISERROR an den VBA-Code, wenn beim Ausführen der gespeicherten Prozedur ein Fehler auftritt.

Andere Vorschläge:

Sie keine Recordset verwenden, da die gespeicherte Prozedur keine Zeilen zurückgibt.

Betrachten sie ein ADODB.Command Objekt mit .CommandType = adCmdStoredProc und einer richtigen ADODB.Parameter mit dem @ArtikelNr Wert angeben.

Verwandte Themen