1

ID を指定して特定のテーブルから行を削除するストアド プロシージャを持つ SQL Server 2000 データベースがあります。VB.NET からストアド プロシージャを呼び出すと、行は削除されませんが、SSMS を介してデータベース上で同じスクリプトを直接実行すると機能します。

これが私の一連のイベントです:

  1. SQL Server プロファイラーを起動して、データベースへのすべての呼び出しを監視します。ストアド プロシージャの開始、完了、さらにはそのストアド プロシージャ内での SQL ステートメントの開始/完了を追跡するようにセットアップしました。
  2. VB.NET dll 経由でストアド プロシージャを呼び出します。
  3. プロファイラー トレースを停止して、過剰なデータを掘り下げないようにします。
  4. テーブルから選択し、行がまだ存在することを確認します。
  5. RPC:Starting、SP:Starting、RPC:Completed のみを示すプロファイラー トレースを表示します。内部ステートメントはトレースされません。これにより、delete ステートメントが起動されなかったために行が削除されなかった理由が検証されます。
  6. VB.NET 経由で呼び出されたときの RPC:Starting トレース エントリから、EXEC 呼び出しを直接コピーして、同じ資格情報を持つ同じデータベースを指す SQL Server Management Studio クエリ ウィンドウに貼り付けます。
  7. プロファイラーを再起動します。
  8. SSMS で箇条書き 6 の EXEC ステートメントを実行します。
  9. プロファイラーを停止します。
  10. テーブルから選択し、行が適切に削除されていることを確認します。
  11. 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は、NULLを渡していた別のパラメーターについて、「nvarchar is incompatible with image」という例外をスローしました。SSMS は型を気にしませんでしたが、VB.NET は画像型であることを明示的に伝えなかったので心配しました。そのパラメーターを定義すると、機能しました。ただし、プロファイラーがエラーがあることを教えてくれたらよかったのにと思います。

どんな助けでも大歓迎です、

グレッグ

4

2 に答える 2

4

これは、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 ステートメントと混在してはなりません。1 つのメッセージに複数の RPC を含めることができます。詳細については、セクション 2.2.6.5 を参照してください。

代わりにSQL:BatchCompletedイベントを監視すると、SSMS ステートメントが表示されます。

于 2012-10-09T18:45:45.817 に答える
0

アプリケーションが SQL への接続に使用しているユーザーは、ストアド プロシージャを実行する権限を持っていますか? それが私が最初に確認することです。

于 2012-10-09T18:41:52.910 に答える