SQL批量复制中的异常和内存问题

时间:2012-10-11 05:28:15

标签: sql-server sqlbulkcopy

我们正在使用SQL批量复制将近1000万行插入到SQL Server表中。

我们在7400000次插入后收到此例外:

  

链接服务器'(null)'的OLE DB提供程序'STREAM'返回无效   列'[!BulkInsert] .Amount'。

的数据

如果可以解决,请告诉我们。

还有内存泄漏问题。

以下是我们的代码:

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

2 个答案:

答案 0 :(得分:0)

根据您的代码,您似乎将BatchSize设置为数据表的大小,大概是1000万行。您可能想尝试使用5000之类的值。

答案 1 :(得分:0)

也许是因为你试图将NaN值插入浮点字段?

我最近遇到了这个问题,为了弄清楚出了什么问题,我只是将所有内容插入到数据类型为NVARCHAR(MAX)的表中,然后我注意到一个值是NaN。