国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:15:59
字體:
來源:轉載
供稿:網友

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 ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双牌县| 德兴市| 竹北市| 溧水县| 宁阳县| 崇左市| 张掖市| 英山县| 襄城县| 南部县| 称多县| 洛扎县| 达拉特旗| 宁都县| 黑山县| 容城县| 鲁甸县| 义马市| 称多县| 康平县| 双鸭山市| 雷波县| 贡嘎县| 波密县| 旌德县| 若尔盖县| 运城市| 明光市| 肥西县| 青田县| 平原县| 巴彦县| 武强县| 辽阳县| 调兵山市| 江口县| 贵阳市| 周口市| 金秀| 竹北市| 芒康县|