2010-08-13 66 views
1

我在嘗試使用VB.NET,SQL命令和參數再次執行DELETE查詢SQL Server表時遇到一個奇怪的問題。Sqlcommand參數未執行

我有以下代碼:

Try  
    sqlCommand.Transaction = transaction1 
    sqlCommand.Connection = conn 
    sqlCommand.CommandText = sqlQuery 
    sqlCommand.Parameters.Add("@userID", SqlDbType.Int).Value = Convert.ToInt32(userID) 
    sqlCommand.Parameters.Add("@groupID", SqlDbType.Int).Value = Convert.ToInt32(groupID) 
    ''#Delete the user from the group. 
    MessageBox.Show("User: " + Convert.ToString(userID) + " Group: " + Convert.ToString(groupID)) 
    MessageBox.Show("Param, UserID: " + sqlCommand.Parameters.Item(0).Value.ToString) 
    MessageBox.Show("Param, GroupID: " + sqlCommand.Parameters.Item(1).Value.ToString) 
    return_deleteUser = sqlCommand.ExecuteNonQuery() 
Catch ex As Exception 
    transaction1.Rollback() 
    Dim hr As Integer = Marshal.GetHRForException(ex) 
    MsgBox("Removal of user from group has failed: " + ex.Message() & hr) 
End Try 

它執行下面的SQL查詢:

Dim sqlQuery As String = "DELETE FROM MHGROUP.GROUPMEMS WHERE USERNUM [email protected] AND GROUPNUM [email protected]" 

我的問題是,代碼執行時,沒有在所有報告的錯誤。我運行了SQL事件探查器,查詢沒有出現在跟蹤列表中。我添加的三個消息框全部返回正確的值,並且如果我要使用查詢成功的值對錶執行SQL查詢。用戶ID和組ID都是3位整數。

任何人都可以提出爲什麼代碼不按預期工作,或任何進一步的調試,我可以用來逐步通過代碼?理想情況下,我很想看到已完成的參數的完成SQL查詢,但我還沒有發現如何做到這一點。

編輯: 我在後面的代碼下面來檢查執行的所有成功處理:

If return_insertEvent > 0 And return_updateUser > 0 And return_nextSID > 0 And return_deleteUser > 0 Then 
    MessageBox.Show("Success") 
    return_removeADGroup = RemoveUserFromGroup(userID, groupName) 
    MessageBox.Show("Remove FS User from AD Group: " + return_removeADGroup) 
    transaction1.Commit() 
    transaction2.Commit() 
    transaction3.Commit() 
    transaction4.Commit() 
    returnResult = 1 
Else 
    transaction1.Rollback() 
    transaction2.Rollback() 
    transaction3.Rollback() 
    transaction4.Rollback() 
    returnResult = 0 
End If 

如果您需要任何進一步的信息,請不要在我接觸猶豫。

+0

你有驗證器transaction.commit叫? – 2010-08-14 03:17:20

回答

4

你缺少一個Transaction.Commit

更新輸入反應中要加入到問題的更多信息:

爲什麼你有4個交易?由於它們的提交和回滾都是一起執行的,所以只需要一個事務。我建議你使用一個TransactionScope

到ADO.NET Command對象您可以指定當前事務:

ADO.NET and System.Transactions

Transaction Processing in ADO.NET 2.0

+0

這些在代碼後面出現,它們被包含在IF ... ELSE中,以確保事務僅在所有事務成功時才被提交。 – Lima 2010-08-14 03:10:17

+0

@利馬 - 不要混合多個這樣的交易。您可以並應該跨多個命令使用相同的事務。 – 2010-08-14 04:03:17

+0

您能否提供信息/鏈接以瞭解我如何才能實現四個查詢的一個交易?我更喜歡這個,因爲它是更整潔的代碼,但不知道如何實現這一點。 – Lima 2010-08-14 04:37:14

1

我可以猜測您的通話PROC有用戶ID的值和羣落倒退。如果DELETE找不到匹配的記錄,則它將成功完成,但不會執行任何操作。我建議將你的刪除包裝在存儲過程中。然後你可以添加代碼來測試參數值是否正確。

Create Procedure UserDelete 
@userid int, @groupID int 
As 
BEGIN 
    Select @userid as UID, @groupID as GID INTO TESTTABLE; 
    DELETE FROM MHGROUP.GROUPMEMS WHERE USERNUM [email protected] AND GROUPNUM [email protected]; 
END 

運行你的代碼,然後去檢查TESTTABLE的內容。

FWIW:我不喜歡試圖在一行中獲取整個參數聲明。對我而言太多了。我喜歡這個...

Dim pUID as New Parameter("@userid", SqlDbType.Int) 
pUID.Value = userid 
cmd.Parameters.Add(pUID) 
+0

@userID和@groupID都是正確的值,並且在使用管理工作室時查詢執行得很好。我寧願不爲這些查詢創建一個新的SP,因爲我最終會得到大量的SP(我對這個項目計數至少爲16)。 – Lima 2010-08-14 04:39:33

0

經過一段時間的調試和SQL跟蹤,我發現,該數據庫屬於不同的治療組成員愚蠢的程序,該組駐留在管理數據庫,但該組的用戶成員身份駐留在另一個數據庫中。

非常感謝上面提到的每個人,他們在那裏提供了時間和想法來協助代碼。我已經改變了代碼,建議只使用兩個事務和兩個連接(1個用於管理員和子數據庫)。代碼現在更好,並且易於閱讀。再次

感謝,

馬特