2秒內向數據庫中插入十萬條數據?


怎么向數據庫中快速插入十萬條數據呢,當然得需要對比才能看到效果,今天給大家親身測了兩種方法對比,差別25倍左右

1,數據庫用sql server 2008 r2,表結構非常簡單,四個字段,建數據表的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,用最基本的方法來實現,循環遍歷向數據庫中插入十萬條數據,為了模擬,細節地方沒有修改

       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,代碼如下

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,開始大批量插入數據了,關鍵地方就在此

/// <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頁面上,這里也不再寫,直接上圖

9,兩者的差別是不是很大,這個方法是不是很好用,如果是的話請您點個贊啊,如果有更好的方法請留言,讓大家共同學習。

shixudong3@yeah.net

 


免責聲明!

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



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