web-dev-qa-db-ja.com

EF例外:文字列またはバイナリデータは切り捨てられます。ステートメントは終了されました。?

この問題に関連する多くの投稿を読みましたが、答えが見つかりませんでした。 ExcelからSQL Serverに大量のデータをロードしようとしています。数千のレコード。そして、私はこの例外を受け取っています:

文字列型やバイナリは省略されます。ステートメントは終了されました。

明らかに、いくつかの値はデータベースのフィールドサイズを超えています。エラーはSQL Server AFIKから発生します。


私の質問-どのレコードとどのフィールド値がこれを引き起こしたかをどのようにして知ることができますか?

私が言及したものを除いて、EF例外には特定の詳細はありません。

どんな助けも大歓迎です。

一部の人はコードの断片を要求しましたが、実際には非常に簡単です。問題はコードにありません。

// employees is a List<Employee> collection loaded from Excel
using (var context = new Entities())
{
    employees.ForEach(e => context.Employee.AddObject(e));
    context.SaveChanges();
}

また、DbEntityValidationException(Entity Framework 5.0でのみ使用可能)を使用するための推奨アプローチが機能していません。catchブロックは例外をキャッチしませんでした。

try
{
    ImportData();
}
catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //...
    }
}

私が見つけた唯一の解決策これまでのところ、SQL Server Profilerを使用し、監視する次のイベントを定義することです。

enter image description here

enter image description here

メールが長すぎることがわかりました。

35
monstro
catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //... inspect here 
    }
}

Foreachループ内で必要な情報を見つけることができます。

お役に立てば幸いです。

5
Cuong Nguyen

そのレベルではできません。 SQL Serverはクエリ全体を拒否しています。

文字列サイズ、日付形式などのデータベースの制約に対してデータに事前チェックを追加します。

または、挿入を試みる前に、未加工データの各文字列フィールドを対応するフィールドサイズにTRIMすることができます。

5
D Stanley

データを確認できますbefore保存、EFメタデータを使用して、適切なエラーを発生させます。

1
Ben
private static string FindLongStrings(object testObject)
    {
        foreach (PropertyInfo propInfo in testObject.GetType().GetProperties())
        {
            foreach (ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(ColumnAttribute), true))
            {
                if (attribute.DbType.ToLower().Contains("varchar"))
                {
                    string dbType = attribute.DbType.ToLower();
                    int numberStartIndex = dbType.IndexOf("varchar(") + 8;
                    int numberEndIndex = dbType.IndexOf(")", numberStartIndex);
                    string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex));
                    int maxLength = 0;
                    int.TryParse(lengthString, out maxLength);

                    string currentValue = (string)propInfo.GetValue(testObject, null);

                    if (!string.IsNullOrEmpty(currentValue) && currentValue.Length > maxLength && lengthString!="max")
                        return testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength;

                }
            }
        }
        return "";
    }


foreach (object insert in dtx.GetChangeSet().Inserts)
            {
                string result = FindLongStrings(insert);
                if (string.IsNullOrEmpty(result) == false)
                {
                    responseBuilder.Append(result);
                }
            }

ResponseBuilderが空でない場合、フィールド名、許容される長さ、およびエラーメッセージが含まれます。

0
Ali

具体的には切り捨てについてはわかりませんが、EntityValidationErrorsを調べるように指示する例外が発生した場合のヒントを次に示します。通常、デバッグ時にそのプロパティが表示されることはありません(明示的なキャッチが既にない場合)。ただし、クイックウォッチを開き、$exception。これで、ドリルインしてそのプロパティを見つけることができるはずです。次のように入力することもできます。

(System.Data.Entity.Validation.DbEntityValidationException)$exception
0
ShawnFumo