C# EF异常:字符串或二进制数据将被截断。该声明已被终止。?
我读过很多关于这个问题的帖子,但都找不到答案。 我正在尝试将大量数据从Excel加载到SQL Server。 数千张唱片。我得到一个例外: 字符串或二进制数据将被截断。声明已被修改 终止 显然,有些值超过了数据库中的字段大小。 错误来自SQL Server AFIKC# EF异常:字符串或二进制数据将被截断。该声明已被终止。?,c#,sql-server,entity-framework,exception,C#,Sql Server,Entity Framework,Exception,我读过很多关于这个问题的帖子,但都找不到答案。 我正在尝试将大量数据从Excel加载到SQL Server。 数千张唱片。我得到一个例外: 字符串或二进制数据将被截断。声明已被修改 终止 显然,有些值超过了数据库中的字段大小。 错误来自SQL Server AFIK 我的问题-我怎么可能知道是什么记录和什么字段值导致了这种情况? EF exception中没有具体的细节,除了我提到的那个 感谢您的帮助 有些人要求提供代码片段,但实际上非常简单,问题不在于代码: // employees is
我的问题-我怎么可能知道是什么记录和什么字段值导致了这种情况? EF exception中没有具体的细节,除了我提到的那个 感谢您的帮助 有些人要求提供代码片段,但实际上非常简单,问题不在于代码:
// employees is a List<Employee> collection loaded from Excel
using (var context = new Entities())
{
employees.ForEach(e => context.Employee.AddObject(e));
context.SaveChanges();
}
到目前为止,我找到的唯一解决方案是使用SQL Server Profiler,并定义以下要监视的事件:
现在我可以看到电子邮件太长了
catch (DbEntityValidationException ex)
{
foreach (var item in ex.EntityValidationErrors)
{
//... inspect here
}
}
您可以在foreach循环中找到所需的信息
希望这能有所帮助。你不能达到那种程度。SQL Server正在拒绝整个查询 我会根据数据库对字符串大小、日期格式等的限制,对数据添加一些预检查
或者,在尝试插入之前,您可以将原始数据中的每个字符串字段修剪为相应的字段大小。您可以在保存之前使用EF元数据检查数据,并提出相应的错误。不确定具体的截断,但这里有一个提示,当您遇到异常时,它会告诉您检查EntityValidationErrors。通常在调试时,它不会让您看到该属性(除非您已经有显式捕获)。但是,您可以打开QuickWatch并键入
$exception
。现在,您应该能够钻取并找到该属性。您也可以只键入以下内容:
(System.Data.Entity.Validation.DbEntityValidationException)$exception
如果responseBuilder不是空的,那么它包含字段名、允许的长度和错误消息。我有两次遇到这个问题,问题是当EF在数据库中创建表时,它会将
varchar(1)
设置为字符串属性,因此当我尝试插入信息时,由于长度的原因,这是不可能的,我建议您逐个记录检查表中的字段,直到找到违规者,并对照db列检查记录的每个字段?请提供更多信息,例如您尝试导入的字段的代码示例、数据结构和数据类型。。在我看来,这将使提供某种指导变得更容易。您无法使用EF逐个调试记录。它是作为一个事务执行的。我想对你的答案进行投票,但这是问题的一部分:)无论如何,这项技术对我来说非常有效。谢谢你的帮助!SQL Server Profiler适合我。谢谢。谢谢,刚刚尝试过,但是with catch没有拦截异常。如果DbEntityValidationException中没有引发此错误,则表示模型与数据库不同步。尝试从数据库中重新创建模型,因为这仍然是确定有问题字段的最简单方法。此处相同。在EF6.01中的SaveChanges中,有一个字段太长,我在DbUpdateException中的UpdateException中得到一个SqlException作为内部异常。我的模型是同步的。减去1-因为返回的异常不是DbEntityValidationException
类型,所以答案对这个问题没有帮助。我无法执行任何数据清理或更正。我所需要的就是找到导致问题的值,并展开数据库中相应的字段。您可以获取数据中每个字符串的长度,以查看哪些字符串比目标字段长吗?这与任何标准的EF行为都不符,因此它与您未提及的情况有关,因此不适合作为答案。“检查表中的字段”之前已经说过了(而且太明显了,不值得一提)。
(System.Data.Entity.Validation.DbEntityValidationException)$exception
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);
}
}