2012-10-11 67 views
5

我們正在使用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; 
} 
+0

插入在較少的記錄 – dotNETbeginner

+0

批我懷疑該例外是引起了我的內存泄漏,我反而把我的賭注押在定位違規行(它似乎真的有一個)。就像之前的評論所暗示的那樣,你應該將BatchSize降低到一個更低的值,甚至可以降低到100.這樣,當發生異常時,你會知道你的違規行是(Exception + - 100)行。我將從(ExceptionPoint-100)中分離源數據直到結束,然後恢復從分割數據導入。當一切都很好時,你可能會回到你目前的態度。希望這有助於:d –

+0

正如前面的評論reinforcemente,看看尼克湯普森的回答了自己的問題在http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/d7d3d2aa-c5b6- 4a96-9d17-354e498c487c?教授=所需 –

回答

0

它看起來像你設置BATCHSIZE到DataTable,大概是1千萬行的大小。您可能需要使用像5000

0

也許是因爲你想插入NaN值轉換爲一個float字段中的值來試試呢?

最近我有這個問題,要弄清楚什麼是錯的,我剛插入一切都變成一個表,其中的數據類型爲NVARCHAR(MAX),然後我注意到一個值NaN的。