我已阅读了很多与此问题相关的帖子,但无法找到答案。 我正在尝试将大量数据从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,并定义要监控的以下事件:
现在我可以看到电子邮件太长了。
答案 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)
设置为字符串属性,因此当我尝试插入信息时,由于长度原因,建议您检查表格中的字段