最近開発中のアプリでは、データベースへの挿入、更新、削除の影響を受ける行数を確認し、予期しない数の場合はエラーをログに記録しています。たとえば、1つの行の単純な挿入、更新、または削除で、ExecuteNonQuery()呼び出しから1つ以外の行が返された場合、エラーと見なしてログに記録します。また、これを入力すると、トランザクションが発生した場合にトランザクションをロールバックしようとさえしないことに気付きました。これはベストプラクティスではなく、確実に対処する必要があります。とにかく、これが私が何を意味するかを説明するためのコードです:
dbを呼び出すデータ層関数があります。
public static int DLInsert(Person person)
{
Database db = DatabaseFactory.CreateDatabase("dbConnString");
using (DbCommand dbCommand = db.GetStoredProcCommand("dbo.Insert_Person"))
{
db.AddInParameter(dbCommand, "@FirstName", DbType.Byte, person.FirstName);
db.AddInParameter(dbCommand, "@LastName", DbType.String, person.LastName);
db.AddInParameter(dbCommand, "@Address", DbType.Boolean, person.Address);
return db.ExecuteNonQuery(dbCommand);
}
}
次に、ビジネスレイヤーがデータレイヤー関数を呼び出します。
public static bool BLInsert(Person person)
{
if (DLInsert(campusRating) != 1)
{
// log exception
return false;
}
return true;
}
そして、コードビハインドまたはビュー(私はWebフォームとMVCプロジェクトの両方を行います):
if (BLInsert(person))
{
// carry on as normal with whatever other code after successful insert
}
else
{
// throw an exception that directs the user to one of my custom error pages
}
このタイプのコードを使用すればするほど、やり過ぎだと感じます。特にコードビハインド/ビューで。単純な挿入、更新、または削除では、データベース内の正しい行数が実際には変更されないと考える正当な理由はありますか?毎回影響を受ける行に対して単調なチェックを行うのではなく、実際のSqlExceptionをキャッチしてそれを処理することだけを心配する方が妥当ですか?
ありがとう。皆さんが私を助けてくれることを願っています。
アップデート
お時間を割いていただき、ありがとうございました。今後どの設定を使用するかはまだ100%決定していませんが、すべての回答から削除したものを次に示します。
- DBライブラリと.Netライブラリを信頼してクエリを処理し、設計どおりに機能します。
- ストアドプロシージャでトランザクションを使用して、エラーのクエリをロールバックし、
raiseerror
それらの例外をSqlExceptionとして.Netコードにスローバックするために使用する可能性があります。これにより、これらのエラーをtry/catchで処理できます。このアプローチは、問題のある戻りコードのチェックに取って代わります。
私が見逃している2番目の箇条書きに問題はありますか?