Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF异常:字符串或二进制数据将被截断。该声明已被终止。?_C#_Sql Server_Entity Framework_Exception - Fatal编程技术网

C# EF异常:字符串或二进制数据将被截断。该声明已被终止。?

C# EF异常:字符串或二进制数据将被截断。该声明已被终止。?,c#,sql-server,entity-framework,exception,C#,Sql Server,Entity Framework,Exception,我读过很多关于这个问题的帖子,但都找不到答案。 我正在尝试将大量数据从Excel加载到SQL Server。 数千张唱片。我得到一个例外: 字符串或二进制数据将被截断。声明已被修改 终止 显然,有些值超过了数据库中的字段大小。 错误来自SQL Server AFIK 我的问题-我怎么可能知道是什么记录和什么字段值导致了这种情况? EF exception中没有具体的细节,除了我提到的那个 感谢您的帮助 有些人要求提供代码片段,但实际上非常简单,问题不在于代码: // employees is

我读过很多关于这个问题的帖子,但都找不到答案。 我正在尝试将大量数据从Excel加载到SQL Server。 数千张唱片。我得到一个例外:

字符串或二进制数据将被截断。声明已被修改 终止

显然,有些值超过了数据库中的字段大小。 错误来自SQL Server AFIK


我的问题-我怎么可能知道是什么记录和什么字段值导致了这种情况?

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);
                }
            }