我有一个带有存储过程的 SQL Server 2000 数据库,它根据其 ID 从特定表中删除一行。当我从 VB.NET 调用存储过程时,它不会删除该行,而是通过 SSMS 直接在数据库上运行相同的脚本,它可以工作。
这是我的一系列事件:
- 启动 SQL Server Profiler 以监视对数据库的所有调用。我设置它来跟踪存储过程何时启动、完成,甚至在该存储过程中启动/完成 SQL 语句。
- 通过 VB.NET dll 调用存储过程。
- 停止探查器跟踪以避免挖掘过多的数据。
- 从表中选择,并查看该行仍然存在。
- 查看分析器跟踪,它只显示 RPC:Starting、SP:Starting、RPC:Completed。没有跟踪内部语句,这验证了为什么没有删除该行,因为删除语句从未触发。
- 直接从 RPC 复制/粘贴 EXEC 调用:从通过 VB.NET 调用它时开始的跟踪条目到 SQL Server Management Studio 查询窗口,该窗口指向具有相同凭据的相同数据库。
- 再次启动分析器。
- 执行 SSMS 中项目符号 6 中的 EXEC 语句。
- 停止探查器。
- 从表中选择,并看到该行 GOT DELETED 应该是这样。
- 查看分析器跟踪,其中显示 SP:Starting、所有开始/完成的语句(包括 DELETE 语句)和 SP:Completed。
为什么通过 RPC 运行它会使其不执行 proc 中的任何语句,而是直接运行它应该执行的操作?
编辑:下面是我的 VB.NET 代码。这是我们在其他 100 多个地方使用的相同代码:
Dim paramRowID As New SqlParameter("@RowID", sRowID)
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(oConn, "spDeleteRow", paramRowID)
请参阅此处的SqlHelper 源代码。
编辑:我现在讨厌自己。:) SQL 抛出异常“nvarchar 与图像不兼容”关于我传递 NULL 的另一个参数。SSMS 不担心类型,但 VB.NET 担心,因为我没有明确告诉它它是 image 类型。一旦我定义了那个参数,它就起作用了。我希望分析器会告诉我有一个错误。
任何帮助,将不胜感激,
格雷格