We use the CqlBulk Copy class in C #. Insert bulk data in sql. We have a table with 10 million records.
We insert data into a packet of 10,000 in a loop
We are facing a physical memory problem. Memory is increasing and not decreasing.
Below is our code. How can we free memory when a bulk copy of sql is used, or is there any other way to do bulk insertion.
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; 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); //DataTable SQlConn.Close(); SQlConn.Dispose(); bulkCopy.Close(); if (bulkCopy != null) { ((IDisposable)bulkCopy).Dispose(); } }
The full code is updated here.
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; 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(); } } } dtDestination.Dispose(); System.GC.Collect(); dtDestination = null; } catch (Exception ex) { Logger.Log(ex, Logger.LogType.Error); throw ex; }
source share