2012-10-11 14 views
5

SQL Server tablosuna yaklaşık 10 milyon satır eklemek için SQL toplu kopyasını kullanıyoruz.SQL Toplu Kopyadaki Özel Durum ve Bellek Sayısı

OLE DB sağlayıcı bağlantılı sunucu için 'STREAM' '(null)' sütun için döndürülen geçersiz veri '.Amount [BulkInsert!]':

Biz 7400000 eklemeleri sonra bu durum aldı.

Lütfen bu sorunun çözülüp çözülmeyeceğini bildirin.

Ayrıca bellek sızıntısı sorunu da var. Eğer Datatable, tahminen 10 milyon satır boyutuna BatchSize ayarı anlaşıldığından kodunuzu

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

Daha az kayıt içeren gruplar halinde ekleme – dotNETbeginner

+0

İstisna durumun bellek sızıntısına neden olduğundan kuşkuluydum, bunun yerine bahsi geçen satırın yerini belirlemeye karar verdim (gerçekten bir tane var gibi görünüyor). Önceki yorumların önerdiği gibi, BatchSize'i çok daha düşük bir değere, hatta 100'e bile indirmelisiniz. Bu şekilde, istisna oluştuğunda, satırın (istisna + - 100) satırların hatalı olduğunu bilirsiniz. Kaynak verileri son noktaya kadar (ExceptionPoint-100) ayırır ve içe aktarılan verilerden içe aktarma işlemimi sürdürürüm. Her şey yolunda olduğunda, mevcut yaklaşımınıza geri dönebilirsiniz. Umarım bu yardımcı olur: D –

+0

Önceki yorumun pekiştirdiği gibi, Nick Tompson'un kendi sorusuna yanıtını http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/d7d3d2aa-c5b6- adresinde bulabilirsiniz. 4a96-9d17-354e498c487c? Prof = gerekli –

cevap

0

Tabanlı:

Aşağıda kodudur. 5000.

0

gibi bir değeri kullanmayı denemek isteyebilirsiniz Belki de bir float alanına bir NaN değeri eklemeye çalıştığınız için?

Son zamanlarda bu sorunu yaşadım ve neyin yanlış olduğunu anlamak için her şeyi veri türünün NVARCHAR (MAX) olduğu bir tabloya ekledim ve sonra bir değerin NaN olduğunu fark ettim.