EF例外:字符串或二进制数据将被截断。该语句已终止。?

时间:2012-11-14 14:41:24

标签: c# sql-server entity-framework exception

我已阅读了很多与此问题相关的帖子,但无法找到答案。 我正在尝试将大量数据从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

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

6 个答案:

答案 0 :(得分:5)

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

您可以在foreach循环中找到所需的信息。

希望有所帮助。

答案 1 :(得分:5)

你不能达到那个水平。 SQL Server拒绝整个查询。

我会根据数据库约束为字符串大小,日期格式等添加一些预检数据。

或者,在尝试插入之前,您可以将原始数据中的每个字符串字段TRIM添加到相应的字段大小。

答案 2 :(得分:1)

您可以使用EF元数据检查保存前的数据,并引发相应的错误。

答案 3 :(得分:0)

不确定特定的截断,但这里有一个提示,当你得到一个异常,告诉你检查EntityValidationErrors。在调试它时,通常不会让你看到那个属性(除非你已经有了明确的catch)。但是,您可以打开快速监视并输入$exception。现在您应该可以钻取并找到该属性。您也可以输入以下内容:

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

答案 4 :(得分: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不为空,则它包含字段名称,允许的长度和错误消息。

答案 5 :(得分:-1)

我有两次遇到这个问题,问题是当EF在数据库中创建表时,它将varchar(1)设置为字符串属性,因此当我尝试插入信息时,由于长度原因,建议您检查表格中的字段