Exception et problème de mémoire dans la copie en bloc SQL

sqlbulkcopy sql-server

Question

Nous utilisons une copie en bloc SQL pour insérer près de 10 millions de lignes dans une table SQL Server.

Nous avons reçu cette exception après 7400000 insertions:

Le fournisseur OLE DB 'STREAM' du serveur lié '(null)' a renvoyé des données non valides pour la colonne '[! BulkInsert] .Amount'.

S'il vous plaît laissez-nous savoir si cela peut être résolu.

Il y a aussi un problème de fuite de mémoire.

Voici notre code:

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;
}

Réponse populaire

Peut-être parce que vous essayez d'insérer une valeur NaN dans un champ float?

J'ai eu ce problème récemment, et pour comprendre ce qui n'allait pas, j'ai simplement inséré tout dans une table où le type de données était NVARCHAR (MAX), puis j'ai remarqué qu'une valeur était NaN.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi