簡體   English   中英

從RPC運行時,SQL Server存儲過程沒有語句運行

[英]SQL Server stored procedure no statements run when from RPC

我有一個帶有存儲過程的SQL Server 2000數據庫,該存儲過程在給定其id的情況下從特定表中刪除一行。 當我從VB.NET調用存儲過程時,它不會刪除該行,而是通過SSMS直接在數據庫上運行相同的腳本,它可以工作。

這是我的一系列事件:

  1. 啟動SQL Server Profiler以查看對數據庫的所有調用。 我有它設置跟蹤存儲過程何時啟動,完成,甚至在該存儲過程中啟動/完成SQL語句。
  2. 通過VB.NET DLL調用存儲過程。
  3. 停止探查器跟蹤以避免過多的數據挖掘。
  4. 從表中選擇,並看到該行仍然存在。
  5. 查看探查器跟蹤,該跟蹤僅顯示RPC:Starting,SP:Starting,RPC:Completed。 沒有跟蹤內部語句,這會驗證為什么行沒有被刪除,因為delete語句從未被觸發。
  6. 直接從RPC復制/粘貼EXEC調用:從通過VB.NET調用它時啟動跟蹤條目到指向具有相同憑據的同一數據庫的SQL Server Management Studio查詢窗口。
  7. 再次啟動探查器。
  8. 在SSMS中執行子彈6中的EXEC語句。
  9. 停止探查器。
  10. 從表中選擇,並看到GOT DELETED行應該如此。
  11. 查看分析器跟蹤,其中顯示SP:Starting,所有語句的開始/完成(包括DELETE語句)和SP:已完成。

為什么通過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確實沒有明確告訴它它是類型圖像。 一旦我定義了那個參數,它就起作用了。 我希望探查者會告訴我有一個錯誤。

任何幫助,將不勝感激,

格雷格

那是因為SSMS不會調用RPC而是調用批處理。 實際上無法從SSMS調用RPC,因為您無法聲明參數 ,這是區分RPC調用與TDS中的批調用的區別:

2.2.1.3 SQL批處理要發送SQL語句或一批SQL語句,將由Unicode字符串表示的SQL批處理復制到TDS數據包的數據部分,然后發送到支持SQL的數據庫服務器。 SQL批處理可能跨越多個TDS數據包。 有關其他詳細信息,請參見第2.2.6.6節

2.2.1.5遠程過程調用要在服務器上執行遠程過程調用(RPC),客戶端會將RPC消息數據流發送到服務器。 這是一個二進制流,包含RPC名稱或數字標識符,選項和參數 RPC必須位於單獨的TDS消息中,而不是與SQL語句混合。 一條消息中可以有多個RPC。 有關其他詳細信息,請參見第2.2.6.5節。

因此,請監視SQL:BatchCompleted事件,您將看到您的SSMS語句。

應用程序用於連接到sql的用戶是否有權執行存儲過程? 這是我要驗證的第一件事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM