5

.NET アプリケーション (VB / VS2010) があり、データベース クエリのために SQL Server 2008 で多くのストアド プロシージャを呼び出しています。これらのストアド プロシージャがデータベース テーブルを変更すると、自動的に実行されるかなりの数の更新/挿入/削除トリガーもあります。

ストアド プロシージャが呼び出され、エラーが発生せず、.NET アプリが通常どおり続行されるため、正常に実行されているように見える状況がよくあります。ただし、内部を調べて SQL Server クライアント経由でストアド プロシージャの呼び出しを手動で実行すると、ストアド プロシージャが失敗した直後にトリガーが実行され、すべての変更がロールバックされることがわかります。

だから私の質問は: .NET でエラーを検出して通過する最良の方法は何ですか?-> ストアド プロシージャ -> .NET アプリでエラーが発生した場合にすべてが成功したかどうかを確実に知るためのシナリオをトリガーしますか?

よろしくお願いします、スティーブ


更新: 私は今家にいて、週末はデスク (およびコード ベース) から離れているため、ストアド プロシージャの詳細を確認する機会がありません。これまでの回答に感謝します。来週またコードを見ることができます。

しかし、その間...

1 つの質問は、MS SQL Server のバージョンに関するもので、2008 です。

私が頭のてっぺんから知っていることから、ストアドプロシージャ(少なくともデータを読み取らず、データを「単に」更新、削除、または挿入するもの)を次のように呼び出しています。

Using connection As New SqlConnection("connectionString")
    Dim command As New SqlCommand("EXEC STORED_PROCEDUR_ENAME), connection)
    command.Connection.Open()
    command.ExecuteNonQuery()
End Using

上記のコードの背後にある仮定は、ストアド プロシージャまたは関連するトリガー内で何かが失敗した場合に、

command.ExecuteNonQuery()

その後失敗します。それが私の最初の問題かもしれません。つまり、このコードを変更する必要がありますか? 以下の 1 つの質問は、私が ExecuteDataReader を使用するかどうかでした。したがって、少なくとも今のところ、答えはノーです...

以下の SQL 固有の質問と提案についてコメントします。

4

3 に答える 3

1

実は今日、同じ問題がありました。

それを解決するために、出力 @msg を使用し、sproc の各関数の後に配置しました。

SET @msg = 'Test print 1'

各セクションに1つ追加したので、最後に印刷された番号がsprocが失敗した場所であったことがわかります。次に、トリガーが失敗しているテーブルに行き、最後の数字を出力して合格するまで調整しました。

于 2012-08-08T03:54:21.930 に答える
0

各ステートメントの後に @@error を確認し、存在する場合はエラーを返す必要があります。

ここにあなたのための良い記事があります。「エラーが発生しない理由」セクションを確認してください。問題になる可能性のあるシナリオについて説明します。

http://www.sommarskog.se/error-handling-II.html

XACT_ABORT をオンにすることもできます。これにより、ほとんどのエラーでストアド プロシージャが失敗します。

編集:これを説明するのに役立つ別のリンクがあります。

http://www.novicksoftware.com/tipsandtricks/tips-erorr-handling-in-a-stored-procedure.htm

@@error をチェックして != 0 を見つけた場合は、プロシージャからエラーを返すか、RAISERROR を使用することができます。これにより、呼び出しコードで確実に例外が発生します。

http://msdn.microsoft.com/en-us/library/ms178592.aspx

于 2012-06-29T18:11:21.857 に答える
0

あなたがSQL Server 2008を使用していると述べたように。これにより、try..catchを使用する能力が得られます。ここに記事があります。

http://msdn.microsoft.com/en-us/library/ms175976.aspx

このフォーラムも見てください。

http://social.msdn.microsoft.com/Forums/eu/transactsql/thread/03eae70e-d478-44a7-90f3-8e1d27d9f22e

私はtry..catchが仕事をすると思います。.net側でも、次のコードを使用します。

try
{
   // your stored procedure execution code.
}
Catch (sqlexception e)
{
  // do something with sql exception.
}

このシナリオを試して、問題が解決するかどうかを確認してください。

于 2012-06-29T21:36:07.097 に答える