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