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 Profiler,并定义以下要监视的事件:

在此处输入图像描述

在此处输入图像描述

现在我可以看到电子邮件太长了。

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

You can check data before saving, using EF metadata, and raise appropriate error.

于 2014-04-13T06:10:51.387 回答
0

不确定具体的截断,但这里有一个提示,当您遇到一个告诉您检查 EntityValidationErrors 的异常时。通常在调试时它不会让您看到该属性(除非您已经明确捕获)。但是,您可以打开快速手表并输入$exception. 现在您应该能够深入并找到该属性。您也可以只键入以下内容:

(System.Data.Entity.Validation.DbEntityValidationException)$exception
于 2015-03-09T14:34:34.653 回答
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 回答
-1

I have got that problem twice, and the problem is that when EF creates the table in the database, it sets varchar(1) to string attributes, so when i try to insert information it is not possible because of the length, I recommend you to check the fields in the table

于 2020-09-29T18:23:51.713 回答