Sql命令参数未执行

发布于 2024-09-14 13:36:55 字数 2021 浏览 3 评论 0原文

当尝试使用 VB.NET、SQL 命令和参数对 SQL Server 表执行 DELETE 查询时,我遇到了一个奇怪的问题。

我有以下代码:

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 =@userID AND GROUPNUM =@groupID"

我的问题是,当代码执行时,根本没有报告错误。我已运行 SQL Profiler,但查询未出现在跟踪列表中。我添加的三个消息框都返回正确的值,如果我要使用这些值对表执行 SQL 查询,查询就会成功。 userID和groupID都是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

如果您需要任何进一步的信息,请随时与我联系。

I am encountering a strange problem when attempting to execute a DELETE query agains a SQL Server table using VB.NET, SQL Command, and Parameters.

I have the following code:

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

Which executes the following SQL Query:

Dim sqlQuery As String = "DELETE FROM MHGROUP.GROUPMEMS WHERE USERNUM =@userID AND GROUPNUM =@groupID"

My problem is that when the code executes, there is no error reported at all. I have ran SQL Profiler and the query doesn't appear in the trace list. The three messageboxes that I have added all return the correct values, and if I was to execute the SQL query against the table with the values the query succeeds. Both the userID and groupID are 3-digit integers.

Can anyone suggest why the code is not working as intended, or any further debugging that I can use to step through the code? Ideally I would love to see the completed SQL query with the parameters completed, but I haven't found out how to do this.

EDIT:
I have the following later in the code to check if the execute's all processed successfully:

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

If you require any further information please don't hesitate in contacting me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

筱武穆 2024-09-21 13:36:55

您缺少 Transaction.Commit

Update 来响应添加到问题中的附加信息:

为什么您有 4 笔交易?由于它们的提交和回滚都是一起执行的,因此您只需要一个事务。我建议您使用 TransactionScope

您可以分配ADO.NET Command 对象的当前事务:

ADO.NET 和 System.Transactions

ADO.NET 2.0 中的事务处理

You are missing a Transaction.Commit

Update in respone to additional info added to question:

Why do you have 4 transactions? Since their commit and rollbacks are all executed together, you only need one transaction. I suggest you use a TransactionScope

You can assign the current transaction to ADO.NET Command objects:

ADO.NET and System.Transactions

Transaction Processing in ADO.NET 2.0

反话 2024-09-21 13:36:55

我可能猜测您的调用过程具有向后的 userid 和 groupid 值。如果 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 =@userID AND GROUPNUM =@groupID;
END

运行您的代码,然后检查 TETTABLE 的内容。

FWIW:我不喜欢尝试在一行中获取整个参数声明。对我来说发生的事情太多了。我喜欢这个...

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

I might guess that your calling proc has the values of userid and groupid backwards. If the DELETE doesn't find a matching record, it will complete successfully, but not do anything. I suggest wrapping your delete up in a stored procedure. Then you can add code to test if the parameter values are getting through correctly.

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

Run your code then go check the contents of TESTTABLE.

FWIW: I don't like trying to get the whole parameter declaration in one line. Too much going on for me. I like this...

Dim pUID as New Parameter("@userid", SqlDbType.Int)
pUID.Value = userid
cmd.Parameters.Add(pUID)
夜巴黎 2024-09-21 13:36:55

经过一段时间的调试和 SQL 跟踪,我发现数据库所属的愚蠢应用程序以不同的方式对待组成员,组驻留在管理数据库中,但该组的用户成员身份驻留在另一个数据库中。

感谢上面所有提供时间和想法来协助编写代码的人。我已按照建议更改了代码,仅使用两个事务和两个连接(1 个用于管理和子数据库)。现在代码好多了并且更容易阅读。

再次感谢,

马特

After some time debugging and sql tracing, I have found out that the stupid application that the DB belongs to treats the group members differently, the groups reside in a administration database, but the users membership to the group resides in another database.

Thank you to everyone above who provided there time and thoughts in assisting with the code. I have changed the code as recomended to use only two transactions and two connections (1 for the admin and sub-database). The code is much nicer now and is that bit easier to read.

Thanks again,

Matt

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文