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

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

  • 相关阅读:
    用js实现cookie的读、写、全部删除和删除指定cookie值的删除---源码
    JS手机号码格式验证
    vuex
    解决“此图片来自微信公众平台未经允许不可引用”的方法
    二叉树
    剑指 Offer 10- II. 青蛙跳台阶问题
    logrotate处理Gunicorn日志
    Linux日志切割神器logrotate原理介绍和配置详解
    Jenkins任务启动的后台进程被自动kill
    Flex、Grid、媒体查询实现响应式布局
  • 原文地址:https://www.cnblogs.com/ShaYeBlog/p/3627513.html
Copyright © 2020-2023  润新知