55

この問題に関連する多くの投稿を読みましたが、答えが見つかりませんでした。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 プロファイラーを使用し、監視する次のイベントを定義することです。

ここに画像の説明を入力

ここに画像の説明を入力

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

4

6 に答える 6

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

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

それが役立つことを願っています。

于 2012-11-14T14:58:10.660 に答える
5

そのレベルではありえない。SQL Server はクエリ全体を拒否しています。

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

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

于 2012-11-14T15:02:37.193 に答える
1

保存する前にEF メタデータを使用してデータをチェックし、適切なエラーを発生させることができます。

于 2014-04-13T06:10:51.387 に答える
0
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 が空でない場合は、フィールド名、許容される長さ、およびエラー メッセージが含まれます。

于 2016-08-12T04:20:14.297 に答える
0

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

(System.Data.Entity.Validation.DbEntityValidationException)$exception
于 2015-03-09T14:34:34.653 に答える