前些日子,公司要求做一個數(shù)據(jù)導(dǎo)入程序,要求將Excel數(shù)據(jù),大批量的導(dǎo)入到數(shù)據(jù)庫中,盡量少的訪問數(shù)據(jù)庫,高性能的對數(shù)據(jù)庫進(jìn)行存儲。于是在網(wǎng)上進(jìn)行查找,發(fā)現(xiàn)了一個比較好的解決方案,就是采用SqlBulkCopy來處理存儲數(shù)據(jù)。SqlBulkCopy存儲大批量的數(shù)據(jù)非常的高效,就像這個方法的名字一樣,可以將內(nèi)存中的數(shù)據(jù)表直接的一次性的存儲到數(shù)據(jù)庫中,而不需要一次一次的向數(shù)據(jù)庫Insert數(shù)據(jù)。初次實驗,百萬級別的數(shù)據(jù)表,也只需幾秒時間內(nèi)就可以完全的存入數(shù)據(jù)庫中,其速度,比傳統(tǒng)的Insert方法不止快很多倍。下面,我將用代碼,介紹其用法。
需要引入:system.data.sql /// <summary> /// LaborReport Data Import To Database /// </summary> /// <param name="laborReport">laborReport data table</param> /// <param name="laborReportDetail">laborReportDetail data table</param> public void LaborReportInsert(DataTable laborReport, DataTable laborReportDetail) { using (SqlConnection conn = new SqlConnection(this.Connection)) { if (conn.State != ConnectionState.Open) conn.Open(); using (SqlBulkCopy sqlBCLaborReport = new SqlBulkCopy(conn)) { sqlBCLaborReport.BatchSize = laborReport.Rows.Count; sqlBCLaborReport.BulkCopyTimeout = 60; sqlBCLaborReport.DestinationTableName = "LaborReport";//數(shù)據(jù)庫上的目標(biāo)表名 sqlBCLaborReport.WriteToServer(laborReport); } using (SqlBulkCopy sqlBCLaborReportDetails = new SqlBulkCopy(conn)) { sqlBCLaborReportDetails.BatchSize = laborReportDetail.Rows.Count; sqlBCLaborReportDetails.BulkCopyTimeout = 60; sqlBCLaborReportDetails.DestinationTableName = "LaborReportDetails";//數(shù)據(jù)庫上的目標(biāo)表名 sqlBCLaborReportDetails.WriteToServer(laborReportDetail); } if (conn.State != ConnectionState.Closed) conn.Close(); } } 上邊的示例代碼,將內(nèi)存中的兩個DataTable 數(shù)據(jù)一次性的存入數(shù)據(jù)庫中,只要內(nèi)存中的數(shù)據(jù)表格的結(jié)構(gòu)跟數(shù)據(jù)庫中的表格結(jié)構(gòu)一樣,就可以了,如果數(shù)據(jù)庫中包含自增列字段,我們可以不需要在內(nèi)存表中定義,當(dāng)數(shù)據(jù)保存到數(shù)據(jù)庫中的時候,自增列會自動生成數(shù)據(jù)的。 //數(shù)據(jù)批量導(dǎo)入sqlserver,創(chuàng)建實例 |
|
來自: 悟靜 > 《.net和asp.net》