——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,最后得到的结果截图如下

——2秒内向数据库中插入十万条数据?——2秒内向数据库中插入十万条数据?——2秒内向数据库中插入十万条数据?

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页面上,这里也不再写,直接上图

——2秒内向数据库中插入十万条数据?

 

转载自:http://www.cnblogs.com/shixudong/p/3627424.html

你可能感兴趣的:(数据库)