C# 海量數據瞬間插入到數據庫的方法

C# 海量數據瞬間插入到數據庫的方法

當咱們在數據庫中進行大量的數據追加時,是否是常常由於數據量過大而苦惱呢?
而所謂的海量數據,通常也是上萬級的數據,好比咱們要添加一百萬條數據,應該如何提升它的效率呢?

Oracle數據庫:

普通肉墊式 

sql

    什麼叫批量插入呢,就是一次性插入一批數據,咱們能夠把這批數據理解爲一個大的數組,而這些所有隻經過一個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秒左右。spa

 

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那麼變態,可是插入百萬條數據也不過只用了幾秒時間,比起咱們平時的添加速度,無疑已經讓人很是興奮了吧,呵呵。code

相關文章
相關標籤/搜索