2010-08-13 35 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个用于管理员和子数据库)。代码现在更好,并且易于阅读。再次

感谢,

马特