怎麼向數據庫中快速插入十萬條數據呢,固然得須要對比才能看到效果,今天給你們親身測了兩種方法對比,差異25倍左右web
1,數據庫用sql server 2008 r2,表結構很是簡單,四個字段,建數據表的sql代碼以下sql
USE [TestDB] GO /****** Object: Table [dbo].[User_1] Script Date: 03/27/2014 00:31:16 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[User_1]( [ID] [int] NULL, [Name] [nvarchar](20) NULL, [sex] [int] NULL, [phone] [nvarchar](20) NULL ) ON [PRIMARY] GO
2,十萬條數據從何而來?因爲是模擬實現,我就是用模擬數據,拼成一個具備十萬條記錄的DataTable數據庫
public DataTable GetData() { DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int));//爲新的Datatable添加一個新的列名 dt.Columns.Add("Name", typeof(string));//爲新的Datatable添加一個新的列名 dt.Columns.Add("sex", typeof(int));//爲新的Datatable添加一個新的列名 dt.Columns.Add("phone", typeof(string));//爲新的Datatable添加一個新的列名 for (int i = 0; i < 100000; i++) //開始循環賦值 { DataRow row = dt.NewRow(); //建立一個行 row["ID"] = i + 1; //從總的Datatable中讀取行數據賦值給新的Datatable row["Name"] = "sxd" + (i + 1).ToString(); row["sex"] = i % 2 == 0 ? 1 : 0; row["phone"] = (13500000000 + i + 1).ToString(); dt.Rows.Add(row);//添加次行 } return dt; }
3,用最基本的方法來實現,循環遍歷向數據庫中插入十萬條數據,爲了模擬,細節地方沒有修改app
public static bool MySqlBulkCopy(DataTable Table) { bool Bool = true; string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1"; using (SqlConnection con = new SqlConnection(ConnectionString)) { con.Open(); for (int i = 0; i < Table.Rows.Count; i++) { SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.CommandText = "insert into User_1 (ID,Name,sex,phone) values (" + Table.Rows[i][0] + ",'" + Table.Rows[i][1] + "'," + Table.Rows[i][2] + ",'" + Table.Rows[i][3] + "')"; cmd.ExecuteNonQuery(); } con.Close(); } return Bool; }
4,用的是webform作的測試,頁面中加了三個控件Label1,2,3,調用下面的方法得出結果學習
public string GetTimeSpan() { DataTable dt = GetData(); DateTime dt1 = DateTime.Now; Label1.Text = dt1.ToString(); MySqlBulkCopy(dt); DateTime dt2 = DateTime.Now; Label2.Text = dt2.ToString(); TimeSpan span = dt2 - dt1; string a= span.TotalSeconds.ToString(); Label3.Text = a; return a; }
5,最後獲得的結果截圖以下測試
6,有了上面的結果之後,咱們開始用另外一種方法,微軟自帶的SqlBulkCopy,獲取十萬條數據跟上面的例子同樣,這裏再也不重複,直接用,而後開始拼SqlBulkCopyColumnMapping,代碼以下ui
public SqlBulkCopyColumnMapping[] GetMapping() { SqlBulkCopyColumnMapping[] mapping = new SqlBulkCopyColumnMapping[4]; mapping[0] = new SqlBulkCopyColumnMapping("ID", "ID"); mapping[1] = new SqlBulkCopyColumnMapping("Name", "Name"); mapping[2] = new SqlBulkCopyColumnMapping("sex", "sex"); mapping[3] = new SqlBulkCopyColumnMapping("phone", "phone"); return mapping; }
7,開始大批量插入數據了,關鍵地方就在此spa
/// <summary> /// DataTable批量添加(有事務) /// </summary> /// <param name="Table">數據源</param> /// <param name="DestinationTableName">目標表即須要插入數據的數據表名稱如"User_1"</param> public static bool MySqlBulkCopy(DataTable Table, string DestinationTableName) { bool Bool = true; string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1"; using (SqlConnection con = new SqlConnection(ConnectionString)) { con.Open(); using (SqlTransaction Tran = con.BeginTransaction())//應用事物 { using (SqlBulkCopy Copy = new SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, Tran)) { Copy.DestinationTableName = DestinationTableName;//指定目標表 SqlBulkCopyColumnMapping[] Mapping = GetMapping();//獲取映射關係 if (Mapping != null) { //若是有數據 foreach (SqlBulkCopyColumnMapping Map in Mapping) { Copy.ColumnMappings.Add(Map); } } try { Copy.WriteToServer(Table);//批量添加 Tran.Commit();//提交事務 } catch { Tran.Rollback();//回滾事務 Bool = false; } } } } return Bool; }
8,跟上面例子同樣,開始調用方法,展示在webform頁面上,這裏也再也不寫,直接上圖.net
9,二者的差異是否是很大,這個方法是否是很好用,若是是的話請您點個贊啊,若是有更好的方法請留言,讓你們共同窗習。code
shixudong3@yeah.net