100 を少し超えるパラメーターを持つストアド プロシージャを介して SQL サーバーにデータを永続化する C# 関数があります。(はい、私は知っています、それはおそらく良い設計ではありませんが、レガシー コードであり、ここでは触れません。) ;-)
何らかの理由で、このコードで次のエラーが発生するようになりました。
System.Data.SqlClient.SqlException was unhandled
Message=Error converting data type int to tinyint.
ここで、パラメーターと変数のペアを最初に調べましたが、明らかな原因はありません。(パラメーターは tinyint だけでなく、多くのデータ型です)
では、不正な変数を特定する最速の方法は何でしょうか? そして、実行時にC#側でパラメーターに対して変数を検証するか、エラーメッセージを拡張してどのパラメーターが失敗しているかを正確に伝えることにより、これを積極的に処理する良い方法を知っている人はいますか?
この段階では、ORM の実装はオプションではありません。
編集:CheckParameters
最初にパラメーターをループし、パラメーターと対応する値を単にリストする関数の作成を開始しました。さまざまなデータ型の実際の知識で拡張できると考えていますが、今のところ、悪い変数を見つけるのに役立つようにしたいだけです。
構造は次のとおりです。
try
{
cmdStat.ExecuteNonQuery();
}
catch(SqlException)
{
CheckParameters(cmdStat.Parameters);
//re-throw
}
private void CheckParameters(SqlParameterCollection parameterCollection)
{
foreach (SqlParameter parameter in parameterCollection)
{
Trace.Write("{0}, {1}, {2}, {3}", parameter.ParameterName, parameter.DbType, parameter.SqlDbType, parameter.Value);
}
}