我們正在使用SQL批量複製將近1000萬行插入到SQL Server表中。SQL批量複製中的異常和內存問題
OLE DB提供程序 'STREAM' 鏈接服務器「(null)的返回無效 數據列 '.Amount [BulkInsert!]':
我們以後7400000個插入收到此異常。
請讓我們知道,如果這樣可以解決。
還有內存泄漏問題。
下面是我們的代碼:基於您的代碼
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;
}
插入在較少的記錄 – dotNETbeginner
批我懷疑該例外是引起了我的內存泄漏,我反而把我的賭注押在定位違規行(它似乎真的有一個)。就像之前的評論所暗示的那樣,你應該將BatchSize降低到一個更低的值,甚至可以降低到100.這樣,當發生異常時,你會知道你的違規行是(Exception + - 100)行。我將從(ExceptionPoint-100)中分離源數據直到結束,然後恢復從分割數據導入。當一切都很好時,你可能會回到你目前的態度。希望這有助於:d –
正如前面的評論reinforcemente,看看尼克湯普森的回答了自己的問題在http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/d7d3d2aa-c5b6- 4a96-9d17-354e498c487c?教授=所需 –