由於要錄入大量的數據,使用sqlcommand.executenonquery()方法向數據庫中插入數據,使得程序運行緩慢,無法滿足程序使用要求,就在考慮什么方法能夠進行數據的批量處理,最后發現了另外兩種性能優異的方法,解決了速度的問題。那么現在就介紹一下兩種方法,一種是SqlDataAdapter的Update(dataTable)方法,另一種是SqlBulkCopy類。
下面我們通過兩種方法進行測試,以錄入1萬條數據來檢測運行效率和注意事項
· 引用的命名空間
1 using System.Data; 2 using System.Data.SqlClient;
· 創建數據庫
//create database TestDB //CREATE TABLE [dbo].[t_Data]( // [ID] [int] IDENTITY(1,1) NOT NULL, // [Name] [nvarchar](50) NULL, // [Address] [nvarchar](50) NULL //) ON [PRIMARY]
· SqlBulkCopy類
private void btnTest_Click(object sender, EventArgs e) { // 定義與目標表的結構一致的內存表 排除自增id列 DataTable dtSource = new DataTable(); //列名稱如果和目標表設置為一樣,則后面可以不用進行字段映射 dtSource.Columns.Add("NameS", typeof(string)); dtSource.Columns.Add("AddressS", typeof(string)); // 向dt中增加1W條測試數據 DataRow dr; for (int i = 0; i < 100 * 100; i++) { // 創建與dt結構相同的DataRow對象 dr = dtSource.NewRow(); dr["NameS"] = "Name" + i; dr["AddressS"] = "Address" + i; // 將dr追加到dt中 dtSource.Rows.Add(dr); } //將內存表dt中的1W條數據一次性插入到t_Data表中的相應列中 System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); st.Start(); string connStr = "server=.;database=TestDB;uid=sa;pwd=123456;"; using (System.Data.SqlClient.SqlBulkCopy copy = new System.Data.SqlClient.SqlBulkCopy(connStr)) { //1 指定數據插入目標表名稱 copy.DestinationTableName = "t_Data"; //2 告訴SqlBulkCopy對象 內存表中的 OrderNO1和Userid1插入到OrderInfos表中的哪些列中 copy.ColumnMappings.Add("NameS", "Name"); copy.ColumnMappings.Add("AddressS", "Address"); //3 將內存表dt中的數據一次性批量插入到OrderInfos表中 copy.WriteToServer(dtSource); } st.Stop(); MessageBox.Show("數據插入成功,總耗時為:" + st.ElapsedMilliseconds + "毫秒"); }
經過運行,錄入1萬條數據所需時間為:
· SqldataAdapter.Update(dataset,tablename)
private void button1_Click(object sender, EventArgs e) { //1.0 定義與目標表的結構一致的內存表 排除自增id列 DataTable dtSource = new DataTable(); //列名稱如果和目標表設置為一樣,則后面可以不用進行字段映射 dtSource.Columns.Add("ID", typeof(string)); dtSource.Columns.Add("Name", typeof(string)); dtSource.Columns.Add("Address", typeof(string)); //2.0 向dt中增加1W條測試數據 DataRow dr; for (int i = 0; i < 100*100; i++) { //1.0 創建與dt結構相同的DataRow對象 dr = dtSource.NewRow(); dr["Name"] = "NameId" + i; dr["Address"] = "AddressId" + i; //2.0 將dr追加到dt中 dtSource.Rows.Add(dr); } System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); //計算時間 st.Start(); string conn = "server=.;database=TestDB;uid=sa;pwd=123456;"; //連接數據庫 string sqlText = "select * from t_Data"; //SQL語句,用於查出符合條件的數據庫數據 //當上述工作完成之后,我們調用SqlDataAdapter的Fill()方法,將查詢出來的數據表內容填充的一張DataTable里面 SqlDataAdapter SDA = new SqlDataAdapter(sqlText, conn); SDA.Fill(dtSource); //這個SqlCommandBuilder用來自動生成添加、刪除、修改的語句,注意這個參數是剛才建立的SqlDataAdapter。 SqlCommandBuilder SCB = new SqlCommandBuilder(SDA); SDA.Update(dtSource); //數據錄入 st.Stop(); MessageBox.Show("數據插入成功,總耗時為:" + st.ElapsedMilliseconds + "毫秒"); } }
注意:這個方法要求DataTable表數據結構和字段對應是相同的。
經過運行
,錄入1萬條數據所需時間為:

所以:經過對比發現,SqlBulkCopy類的執行效率明顯比SqlDataAdapter的Update(dataTable)方法快。