1

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);
          }            
        }
4

1 に答える 1

0

私がすることは、procをスタブに置き換えることです。

次に、パラメーターの半分をバイナリ チョップして、int に対応できる長さにします。エラーが解消された場合は、半分だけバイナリ チョップして、もう一度確認します。エラーが解消されない場合は、残りの半分を実行します。

それを見つけるのに最大で10回未満の試行しかかからないと思います。

于 2012-06-30T13:15:01.753 に答える