【问题标题】:ASP.NET SqlBulkCopy does not insert all records on serverASP.NET SqlBulkCopy 不会在服务器上插入所有记录
【发布时间】:2013-12-29 12:52:24
【问题描述】:

我不知道为什么 SqlBulkCopy 不插入来自阅读器的所有记录。代码:

using (OleDbDataReader dr1 = cmd.ExecuteReader())
   {
       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ss, SqlBulkCopyOptions.TableLock, null))
       {
            bulkCopy.BulkCopyTimeout = 0;
            bulkCopy.BatchSize = 500;
            bulkCopy.DestinationTableName = tableName;
            try
            {
                bulkCopy.WriteToServer(dr1);
            }
            catch (Exception ex)
            {
                Log.LogSystemLog(ex.ToString());
                return false;
            }

       }

       GC.Collect();
       dr1.Close();
   }              

我想批量复制大约 30 万条记录。当我从本地主机运行它到同一个数据库时它可以工作,但是当我从服务器运行它时 - 它总是插入〜7k记录......并且没有错误或异常。服务器上有 4GB 可用 RAM。在本地主机上 ~ 1,5GB。

我不知道为什么它在本地主机上正常工作,但在服务器上却不行。

【问题讨论】:

  • SqlBulkCopy 没有问题。也许您的日志记录已损坏,或者您错过了日志消息。取下锁扣,让错误冒泡。不要使用布尔返回值来传播错误。这导致不容易注意到它们。或者,您的阅读器返回的行数比您认为的要少。
  • 但是为什么在我调试时(在本地主机上)相同的代码可以正常工作?
  • 可能是数据不同、批次超时或网络中断。我们永远不会发现您是否不能 100% 确定自己会出错(如果有的话,这很可能)。在你做到之前,没有人能帮助你。如果没有错误消息,您将不会收到有用的答案。

标签: asp.net sql .net database sqlbulkcopy


【解决方案1】:

我遇到了同样的问题,通过在我的连接字符串中添加以下内容解决了。

IMEX=1

示例:

字符串 connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +“数据源=”+ Server.MapPath(rutacom)+“;” + "扩展属性='Excel 12.0 Xml;HDR=YES;IMEX=1'";

在我的本地主机上运行良好,但在服务器上却不行。

试试看:)

注意事项:

“HDR=是的;”表示第一行包含列名,而不是数据。 “HDR=否;”表示相反。

始终使用 IMEX=1 是检索混合数据列数据的一种更安全的方法。考虑这样一种情况:一个 Excel 文件可能工作正常,导致该文件的数据导致驱动程序猜测一种数据类型,而另一个包含其他数据的文件导致驱动程序猜测另一种数据类型。这可能会导致您的应用崩溃。

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2014-11-19
    • 2019-08-31
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多