批量數據導入(SqlBulkCopy)和(SqlDataApter.Update)對比


      由於要錄入大量的數據,使用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)方法快。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM