C# 海量資料瞬間插入到資料庫的方法

來源:互聯網
上載者:User

標籤:style   blog   color   使用   os   strong   

C# 海量資料瞬間插入到資料庫的方法

當我們在資料庫中進行大量的資料追加時,是不是經常因為資料量過大而苦惱呢?
而所謂的海量資料,一般也是上萬級的資料,比如我們要添加一百萬條資料,應該如何提高它的效率呢?

Oracle資料庫:

普通肉墊式 

    什麼叫批量插入呢,就是一次性插入一批資料,我們可以把這批資料理解為一個大的數組,而這些全部只通過一個SQL來實現,而在傳統方式下,需要調用很多次的SQL才可以完成,這就是著名的“數組綁定”的功能。我們先來看一下傳統方式下,插入多行記錄的操作方式:

 1 //設定一個資料庫的串連串,   2 string connectStr = "User Id=scott;Password=tiger;Data Source=";   3 OracleConnection conn = new OracleConnection(connectStr);   4 OracleCommand command = new OracleCommand();   5 command.Connection = conn;   6 conn.Open();   7 //通過迴圈寫入大量的資料,這種方法顯然是肉墊   8 for (int i = 0; i < recc; i++)   9 {  10     string sql = "insert into dept values(" + i.ToString() + "," + i.ToString() + "," + i.ToString() + ")";  11     command.CommandText = sql;  12     command.ExecuteNonQuery();  13 }   

使用ODP特性

 1 //設定一個資料庫的串連串   2 string connectStr = "User Id=scott;Password=tiger;Data Source=";   3 OracleConnection conn = new OracleConnection(connectStr);   4 OracleCommand command = new OracleCommand();   5 command.Connection = conn;   6 //到此為止,還都是我們熟悉的代碼,下面就要開始嘍   7 //這個參數需要指定每次批插入的記錄數   8 command.ArrayBindCount = recc;   9 //在這個命令列中,用到了參數,參數我們很熟悉,但是這個參數在傳值的時候  10 //用到的是數組,而不是單個的值,這就是它獨特的地方  11 command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";  12 conn.Open();  13 //下面定義幾個數組,分別表示三個欄位,數組的長度由參數直接給出  14 int[] deptNo = new int[recc];  15 string[] dname = new string[recc];  16 string[] loc = new string[recc];  17 // 為了傳遞參數,不可避免的要使用參數,下面會連續定義三個  18 // 從名稱可以直接看出每個參數的含義,不在每個解釋了  19 OracleParameter deptNoParam = new OracleParameter("deptno", OracleDbType.Int32);  20 deptNoParam.Direction = ParameterDirection.Input;  21 deptNoParam.Value = deptNo;  22 command.Parameters.Add(deptNoParam);  23 OracleParameter deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2);  24 deptNameParam.Direction = ParameterDirection.Input;  25 deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);  26 OracleParameter deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2);  27 deptLocParam.Direction = ParameterDirection.Input;  28 deptLocParam.Value = loc;  29 command.Parameters.Add(deptLocParam);  30 //在下面的迴圈中,先把數組定義好,而不是像上面那樣直接產生SQL  31 for (int i = 0; i < recc; i++)  32 {  33     deptNo[i] = i;  34     dname[i] = i.ToString();  35     loc[i] = i.ToString();  36 }  37 //這個調用將把參數數組傳進SQL,同時寫入資料庫  38 command.ExecuteNonQuery();  

當資料量達到100萬層級時,所用時間依然令人滿意,最快一次達到890毫秒,一般為1秒左右。

 

SqlServer資料庫

既然Oracle可以如此爽快,那麼在SqlServer中是否也可以這樣做呢?
但是在SqlServer中卻沒有諸如ArrayBindCount 這樣的操作屬性。
不過,我們卻可以藉助於BULK INSERT來進入海量資料的添加。
代碼:

 1 //設定一個資料庫的串連串   2             string connectStr = "……";   3             SqlConnection conn = new SqlConnection(connectStr);   4             SqlCommand command = new SqlCommand();   5             command.CommandTimeout = 0;   6             command.Connection = conn;   7             /*說明:  8              * “c:\\sql.txt”是一個預先產生的包含100條資料的檔案  9              * 每一個欄位的資訊以“,”分割 10              * 每一條資料以“|”符號分隔 11              * 每10萬條資料一個事務。 12              */  13             command.CommandText = "BULK INSERT TableB FROM ‘c:\\sql.txt‘ WITH (FIELDTERMINATOR = ‘,‘,ROWTERMINATOR =‘|‘,BATCHSIZE = 100000)";  14             conn.Open();  15             //System.Data.SqlClient.SqlBulkCopy sqlBC  16             command.ExecuteNonQuery();  17   18             conn.Close();  

雖然比不上Oracle那麼變態,但是插入百萬條資料也不過只用了幾秒時間,比起我們平時的添加速度,無疑已經讓人非常興奮了吧,呵呵。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.