SQL Server 2014でストアドプロシージャを実行するC#で書かれた自動スクリプトがあります。ストアドプロシージャは複数のselectステートメント、updateステートメント、insertステートメントを実行しています。例外が発生したときにトランザクション全体をキャッチしてロールバックします。C#キャッチにSql例外が渡されない
それは次のようになります。プロシージャを呼び出す
BEGIN TRY
BEGIN TRANSACTION TransName
--Lots of SQL!
COMMIT TRANSACTION TransName
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION TransName;
THROW
END CATCH
私のC#は、このようになります。
using (SqlCommand Command = new SqlCommand(query, Connection))
{
// Retry several times if the query fails.
for (var retry = 0; retry < 5 && !Success; ++retry)
{
try
{
Command.ExecuteNonQuery();
Success = true;
}
catch (SqlException e)
{
// Handling for Timeout or deadlocks.
// If not a timeout or deadlock and retry hasn't happened 4 times already.
if (!(e.Number == 1205 || e.Number == 1204 || e.Number == -2) || retry == 4)
{
LogException(e);
}
else if (e.Number == 1205 || e.Number == 1204)
{
// Wait to avoid hammering the database.
Thread.Sleep(500);
}
else if (e.Number == -2)
{
// Wait to avoid hammering the database.
Thread.Sleep(5000);
}
Success = false;
}
}
}
私はそれが存在する場合、SQLが通過することを確認するためにループしています自動化されたスクリプトなので、デッドロックやタイムアウトが発生します。
はそれが可能です:私は、ストアドプロシージャが例外をログに記録しませんでしたが、データのどれも私の質問に私をもたらし手続きタッチテーブルに存在しないことを確認することができますスクリプトの私のログに
例外がT-SQLで捕捉された後にT-SQL THROW
ステートメントを使用して再びスローされますが、例外はC#クライアントにスローされません。
何かを明確にすることができるかどうか教えてください。ありがとう!
上記のコードは、SQLクエリの実行を容易にする方法に含まれています。このメソッドが呼び出されると、スローされた可能性がある他のものを記録する 'try {} catch(Exception ex){}'にラップされるので、C#コードで捕捉される例外はありません。私はInvalidOperationExceptionを調べます。ありがとう! – Shmoman
この場合、何も記録されない理由はわかりません。キャッチブロック内のスローで例外が再スローされます(少なくとも、私はそれがない状況を認識していません:))。 InvalidOperationExceptionを処理すると、潜在的にコードをより弾力的にする必要がありますが、ログに何も含まれていない理由は説明されません。おそらくあなたが提供したコードスニペットの外にあるものが問題の原因になっています。 – shurik