【发布时间】:2012-10-01 17:13:42
【问题描述】:
我们正在使用 SQL 批量复制将近 1000 万行插入到 SQL Server 表中。
我们在 7400000 次插入后收到此异常:
链接服务器“(null)”的 OLE DB 提供程序“STREAM”返回无效 列“[!BulkInsert].Amount”的数据。
如果可以解决,请告诉我们。
还有内存泄漏问题。
下面是我们的代码:
try
{
using (SqlConnection SQlConn = new SqlConnection(Common.SQLConnectionString))
{
DataTable dt1 = FillEmptyDateFields(dtDestination);
//SqlTableCreator ObjTbl = new SqlTableCreator(SQlConn);
//ObjTbl.DestinationTableName = DestinationTable;
using (System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn,SqlBulkCopyOptions.TableLock,null))
{
//bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn);
bulkCopy.DestinationTableName = DestinationTable;
bulkCopy.BulkCopyTimeout = 0;
bulkCopy.BatchSize = dt1.Rows.Count; // Batch Size Added.
Logger.Log("DATATABLE FINAL :" + dt1.Rows.Count.ToString(), Logger.LogType.Info);
if (SQlConn.State == ConnectionState.Closed || SQlConn.State == ConnectionState.Broken)
SQlConn.Open();
bulkCopy.WriteToServer(dt1);
SQlConn.Close();
SQlConn.Dispose();
bulkCopy.Close();
if (bulkCopy != null)
{
((IDisposable)bulkCopy).Dispose();
}
}
dt1.Dispose();
dt1 = null;
}
dtDestination.Dispose();
System.GC.Collect();
dtDestination = null;
}
catch (Exception ex)
{
Logger.Log(ex, Logger.LogType.Error);
throw ex;
}
【问题讨论】:
-
分批插入较少的记录
-
我怀疑异常是由于我的内存泄漏引起的,我宁愿把赌注放在定位有问题的行上(看起来确实有一个)。就像之前的 cmets 建议的那样,您应该将 BatchSize 降低到一个低得多的值,甚至可能降低到 100。这样,当发生异常时,您就会知道您的违规行位于 (Exception +- 100) 行。我会将源数据从 (ExceptionPoint-100) 拆分到最后,然后从拆分后的数据中恢复导入。当一切都很好时,你可能会回到你现在的方法。希望这会有所帮助:D
-
作为对先前评论的补充,请查看 Nick Tompson 在social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/…对自己问题的回答
-
这个 (stackoverflow.com/questions/578235/…) 可能会让您更直接地了解解决方案,因为它可以更快地检查