2016-09-29 146 views
1

我試圖通過ArtikelnrarticleNr荷蘭語)從我的數據庫中刪除某些行。在存儲過程中刪除失敗時從VBA中調用時會失敗

當我嘗試從訪問中執行我的代碼時,它不會拋出錯誤,但它也不會刪除任何東西。

我在這裏錯過了什麼嗎?

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 

而且從訪問嘗試執行存儲過程我的代碼:

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 

可能有人能幫我解決這個問題?

+1

對於一個整數,我會說你需要'執行(「EXEC spVerwijderArtikel」&TxTArtikelNr)' – Andre

+1

@Andre這並不重要。 SQL將隱式轉換它。 但是,OP確定TxTArtikelNr與命令連接時實際上是一個int嗎?此外,你應該看看使用SQL查詢參數化來避免SQL注入攻擊(這也是一個好習慣) –

+0

你應該看看你的sql中使用try/catch。它不會解決這個問題,但是你的代碼會更清晰。並在bobby表訪問之前參數化您的查詢。 http://bobby-tables.com/ –

回答

0

添加語句

SET NOCOUNT ON; 

爲您的存儲過程的第一個語句(前BEGIN Transaction)。如果在執行存儲過程時發生錯誤,這將允許將RAISERROR傳回給VBA代碼。

其他建議:

不要使用Recordset因爲存儲過程不返回行。

考慮使用ADODB.Command對象與.CommandType = adCmdStoredProc和適當的ADODB.Parameter來指定@ArtikelNr值。