2012-10-11 89 views
5

Estamos utilizando la copia masiva de SQL para insertar casi 10 millones de filas en una tabla de SQL Server.Excepción y problema de la memoria en SQL Bulk Copy

Nos recibieron esta excepción después 7400000 inserciones:

proveedor OLE DB 'STREAM' para el servidor vinculado '(null)' devueltos datos no válidos para la columna '.Amount [BulkInsert!].

Háganos saber si puede resolver esto.

También hay un problema de pérdida de memoria.

continuación es nuestro código:

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

inserte en lotes de menos registros – dotNETbeginner

+0

Dudo que la excepción haya sido la causa de la fuga de mi memoria, sino que apostaría a ubicar la fila problemática (realmente parece que hay una). Al igual que en los comentarios anteriores, debe disminuir BatchSize a un valor mucho más bajo, quizás incluso a 100. De esta forma, cuando ocurra una excepción, sabrá que su fila ofensiva está (Excepción + - 100) filas ubicadas. Me gustaría dividir los datos de origen de (ExceptionPoint-100) hasta el final y reanudé mi importación desde datos splited. Cuando todo está bien, puede volver a su enfoque actual. Espero que esto ayude: D –

+0

Como refuerzos del comentario anterior, eche un vistazo a la respuesta de Nick Tompson a su propia pregunta en http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/d7d3d2aa-c5b6- 4a96-9d17-354e498c487c? Prof = required –

Respuesta

0

Sobre la base de su código parece que se está configurando el BatchSize al tamaño de DataTable, presumiblemente de 10 millones de filas. Puede intentar usar un valor de 5000.

0

¿Quizás porque está tratando de insertar un valor NaN en un campo flotante?

Tuve este problema recientemente, y para descubrir qué estaba mal, simplemente inserté todo en una tabla donde el tipo de datos era NVARCHAR (MAX) y luego noté que un valor era NaN.