最近在進行專案的優化。現在部分資料的拷貝時間過長。需要進行上線前的優化,嘗試,批次的數量和拷貝次數的之間的合理數值關係。
最近專案中使用到了SqlBulkCopy實現批量複製,在這裡,我把部分程式碼篩選出來簡單說明一下,希望對大家研究和使用SqlBulkCopy 有幫助.因為是篩選的程式碼,不是完整的方法,請大家儘量不要直接拷貝使用,這篇文章的目的上幫大家簡單的理解SqlBulkCopy.

/*******************呼叫SqlBulkCopy實現DataTable到SQL的批量拷貝******************/

if (SqlConn.State == ConnectionState.Closed)

{

SqlConn.Open();

}


//定義SQL事務並嵌入到批量拷貝的工作中

SqlTransaction objSqlTran = SqlConn.BeginTransaction();


//定義SqlBulkCopy:SqlConn為SqlConnection,SqlBulkCopyOptions列舉型別,objSqlTran為呼叫的事務

SqlBulkCopy objSqlCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, objSqlTran);


//分批次拷貝的行數

objSqlCopy.BatchSize = 10;

objSqlCopy.BulkCopyTimeout = 240;

//目標表名

objSqlCopy.DestinationTableName = "DetailAccountReport";


//源表對目標表欄位的對映,因為預設是按順序以及名字匹配,所以這步很重要

objSqlCopy.ColumnMappings.Add("ProjectDefID", "ProjectDefID");

objSqlCopy.ColumnMappings.Add("Num", "SumNum");

objSqlCopy.ColumnMappings.Add("Money", "SumMoney");

objSqlCopy.ColumnMappings.Add("Explain", "Explain");


try

{

//將DataTabel型別的objDT作為源拷貝到目標表

objSqlCopy.WriteToServer(objDT);

objSqlTran.Commit();

}

catch

{

objSqlTran.Rollback();

}

finally

{

objSqlCopy.Close();

SqlConn.Close();

}


return objDT;
說明://源表對目標表欄位的對映,因為預設是按順序以及名字匹配,所以這步很重要
objSqlCopy.ColumnMappings.Add("ProjectDefID", "ProjectDefID");
objSqlCopy.ColumnMappings.Add("Num", "SumNum");
objSqlCopy.ColumnMappings.Add("Money", "SumMoney");
objSqlCopy.ColumnMappings.Add("Explain", "Explain");
注意這裡,前面是源表字段,後面是目標表欄位.預設是按照順序和名稱匹配的形式,所以要求兩個資料集的結構完全一致,但是在現實使用中,很少有完全一致的情況出現,所以這段程式碼尤其重要.
objSqlCopy.WriteToServer(objDT);
objDT是我們專案中在之前經過處理的DataTable, WriteToServer()支援對DataTable,DataReader,DataRow[]的操作,大家可以靈活運用.