【问题标题】:Entity Framework 6 BulkInsert receiving an invalid column length from the client SQL SERVER 2012 Express实体框架 6 BulkInsert 从客户端 SQL SERVER 2012 Express 接收到无效的列长度
【发布时间】:2019-02-22 09:26:05
【问题描述】:

我对 Entity Framework 6 有一点问题。

我的应用程序是 WPF C# 应用程序,我使用 SQL SERVER 2012 Express。

我尝试将数据插入到我的 Person 表中。

它工作了很长时间。今天我遇到了一个错误:从客户端 46 接收到无效的列长度。

我搜索并找到了一些文章,他们在谈论列大小等,但就我而言,这不是问题。

此代码有效:dc.BulkInsert(listToInsert, options);

  **using EntityFramework.BulkInsert.Extensions;**


     //I have a list of person object to insert.
     var listToInsert = PersonList.Where(ro => !ExistingPerson.Contains(ro.Pers_Code.ToLower())).ToList();


 using(MyEntities dc = new MyEntities())
 {
   *//If I add items one by one, it works*
   foreach (var item in listToInsert)
   {
     dc.Person.Add(item);
   }
   dc.SaveChanges(); //Success.


    //But If I use Bulkinsert, I have an error message 

   BulkInsertOptions options = new BulkInsertOptions();
   options.BatchSize = 1000;
   dc.BulkInsert<Person>(listToInsert, options); // at this moment I have this error message : receiving an invalid column length from the client 46.


    dc.SaveChanges();
 }

我检查了items的数据长度,没有发现任何问题。

有人有想法吗?

谢谢。

【问题讨论】:

  • 您确定数据库和类之间没有一些不匹配?能不能加上Entity Class + Create Sql Table语句?
  • 这段代码运行了很长时间。今天只有新数据。没想到错配,因为使用实体框架,一一添加,就可以了。
  • 看不到您的桌子,几乎不可能为您指明正确的方向。但正如@jonathan 所提到的,很可能是某个字符串现在比您的数据库预期的要长,并且使用 SQL 语句很可能会被截断。

标签: c# entity-framework-6 sql-server-2012-express


【解决方案1】:

SaveChanges 使用 SqlCommand。如果名称长于数据库限制,它将被静默截断,因此不会抛出错误。

BulkInsert 使用SqlBulkCopy,如果名称长于数据库限制,则会抛出错误。

这解释了为什么在一种情况下会出错,而在另一种情况下却没有。

SqlBulkCopy 不会为了好玩而引发此错误,因此我会根据您的列大小仔细检查您的长度。

  • 可能类型是char(xyz),最后有空格?
  • 也许开头有一些空间?

.NET Fiddle 支持 Entity FrameworkNuGet 包。因此,如果您可以在线复制它,就可以准确地说明为什么会发生这种情况。

示例:https://dotnetfiddle.net/35mQ0W

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多