我有一个带有存储过程的SQL Server 2000数据库,该存储过程在给定其id的情况下从特定表中删除一行。当我从VB.NET调用存储过程时,它不会删除该行,而是通过SSMS直接在数据库上运行相同的脚本,它可以工作。
这是我的一系列事件:
为什么通过RPC运行它会使它不执行proc中的任何语句,而是直接运行它应该起作用?
编辑:下面是我的VB.NET代码。这与我们在其他100多个地方使用的代码相同: Dim paramRowID As New SqlParameter("@RowID", sRowID)
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(oConn, "spDeleteRow", paramRowID)
请参阅SqlHelper源here。
编辑:我现在讨厌自己。 :) SQL抛出异常“nvarchar与图像不兼容”有关我传递NULL的另一个参数。 SSMS并不担心这种类型,但VB.NET确实没有明确告诉它它是类型图像。一旦我定义了那个参数,它就起作用了。我希望探查者会告诉我有一个错误。
任何帮助将不胜感激,
格雷格
答案 0 :(得分:3)
那是因为SSMS不会调用RPC而是调用批处理。实际上无法从SSMS调用RPC,因为您无法声明参数,这是区分RPC调用与TDS中批处理调用的区别:
2.2.1.3 SQL Batch要发送SQL语句或一批SQL语句,将由Unicode字符串表示的SQL批处理复制到TDS数据包的数据部分,然后发送到支持SQL的数据库服务器。 SQL批处理可能跨越多个TDS数据包。有关其他详细信息,请参阅第2.2.6.6节
2.2.1.5 Remote Procedure Call要在服务器上执行远程过程调用(RPC),客户端会将RPC消息数据流发送到服务器。这是一个二进制流,包含RPC名称或数字标识符,选项,和参数。 RPC必须位于单独的TDS消息中,而不是与SQL语句混合。一条消息中可以有多个RPC。有关其他详细信息,请参阅第2.2.6.5节。
因此,请监控SQL:BatchCompleted
事件,您将看到您的SSMS声明。
答案 1 :(得分:0)
应用程序用于连接到sql的用户是否有权执行存储过程?这是我要验证的第一件事。