0

さまざまなソースからデータを収集し、そのデータを SQL Server データベースに格納する C# プロジェクトに取り組んでいます。String or binary data would be truncated.非常に迷惑なエラーが発生することがあります。このエラーの原因となっている列を特定し、ログに記録したいと考えています。パラメータの長さをチェックする以外の方法はありますか?

私がしたことは、列がvarchar(50)である場合、データ長が 50 を超えているかどうかを確認することです。

編集

  if(data1.Length>50) logIt("col1, data1, condition");
    else if(data2.Length>80) logIt("col2, data2, condition");
else {
    SqlParameter p1 = (new SqlParameter("@p1", DbType.String));
                 p1.Value = string.IsNullOrEmpty(data1) ? SqlString.Null : (object)data1;
                 s1.Parameters.Add(p1);

    SqlParameter p2 = (new SqlParameter("@p2", DbType.String));
                 p2.Value = string.IsNullOrEmpty(data2) ? SqlString.Null : (object)data2;
                 s1.Parameters.Add(p2);

    s1.ExecuteNonQuery("UPDATE mytable SET col1=@p1,col2=@p2 WHERE condition=@condition");
    }


void logIt(string p){
     using (StreamWriter writer = new StreamWriter("log.txt"))
            {
              writer.WriteLine("Caused by:"+ p);
              writer.WriteLine(DateTime.Now);
              writer.WriteLine("--------------------------------------------");
            }
            }
4

2 に答える 2

0

あなたが述べたように、INSERT ステートメントの 1 つで、長すぎる文字列を文字列 (varchar (50)) 列に挿入しようとしています。

この問題を解決するには、列のサイズを 50 以上または 100 に増やす必要があります。この問題の原因となっている列を見つけるには、いくつかのログを配置するか、SQL プロファイラーを実行するか、VS -> デバッグ メニュー -> 例外 (すべての例外を確認) からすべての例外を有効にします。

于 2013-09-10T14:22:33.870 に答える
0

個人的には、すべてのパラメーターを、それらが使用されるデータを含むテーブルに対して常にチェックします。テーブルに varchar (50) と表示されている場合、パラメーターは 50 を超えないようにする必要があります。これを行わずにストアド プロシージャを作成することはありません。 C#側でパラメータ定義を同様に制限できると仮定します。テーブル フィールドに入力できる以上の情報をユーザーが入力できないようにします。

他のデータベースまたは Excel スプレッドシートからデータを取得している場合は、さまざまな問題が発生する可能性があります。

まず、受信データを注意深く調べて、現在の列のサイズが必要なコンテンツに対して小さすぎるかどうかを判断する必要があります。データが大きすぎる場合、フィールド内の情報がゴミであり、破棄する必要があることがよくあります (たとえば、電子メールではなく電子メール フィールドに配置されている連絡先に関するメモなど)。一部のフィールドで入力データを検証する必要があるかどうかを検討することもできます。

サイズを維持する必要があり、余分な文字を失うことを気にしない場合は、データベースに挿入する前にデータを正しいサイズにキャストするか、レコードを引き出す例外プロセスを作成する必要がありますこれはデータベースの例外テーブルに送信できず、元のデータを所有する人に返されて修正されます。

于 2013-09-10T14:30:50.190 に答える