zoukankan      html  css  js  c++  java
  • C# Insert批量插入

    最近项目需要做一个批量导入的功能,每次导入最少的记录数都达到1万,之前写了一个通过循环Insert的方法,结果我自己都看不下了。太慢了,所以用了SqlBulkCopy,很快,100万条数据,1分钟都不到。

    class Program
        {
            /// <summary>
            /// 批量插入
            /// </summary>
            /// <param name="dt">数据集</param>
            public static void BulkToDB(DataTable dt)
            {
                using (SqlConnection sqlConn = new SqlConnection("Data Source=.;uid=sa;pwd=123456;Initial Catalog=Test"))
                {
                    SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);
                    bulkCopy.DestinationTableName = "UserInfo";  //要插入数据的表名
                    bulkCopy.BatchSize = dt.Rows.Count;          //插入的条数
    
                    try
                    {
                        sqlConn.Open();
                        if (dt != null && dt.Rows.Count != 0)
                            bulkCopy.WriteToServer(dt);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        sqlConn.Close();
                        if (bulkCopy != null)
                            bulkCopy.Close();
                    }
                }
            }
    
            /// <summary>
            /// 创建表结构,(Id(自增),LoginName,LoginPwd)
            /// </summary>
            /// <returns></returns>
            public static DataTable GetTableSchema()
            {
                DataTable dt = new DataTable();
                dt.Columns.AddRange(new DataColumn[]{  
                    new DataColumn("Id",typeof(int)),  
                    new DataColumn("LoginName",typeof(string)),  
                    new DataColumn("LoginPwd",typeof(string))
                });
    
                return dt;
            }
    
            static void Main(string[] args)
            {
                //100万条数据
                Stopwatch sw = new Stopwatch();
                for (int multiply = 0; multiply < 10; multiply++)
                {
                    DataTable dt = GetTableSchema();
                    for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++)
                    {
                        DataRow r = dt.NewRow();
                       // r[0] = 1;//因为该列是自增列,所以可以不赋值
                        r[1] = string.Format("Name-{0}", count * multiply);
                        r[2] = string.Format("Pwd-{0}", count * multiply);
                        dt.Rows.Add(r);
                    }
                    sw.Start();
                    BulkToDB(dt);
                    sw.Stop();
                    Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
                }
                Console.ReadLine();
            }
        }

    执行结果:

  • 相关阅读:
    VMware虚拟机网络桥接模式下无法与主机ping通解决办法
    (一)编写Bootloader程序应该注意的一些问题
    使用TrueSTUDIO和MDK编译器生成.bin文件
    Linux开发板通过串口与电脑上位机通信
    STM32知识点
    仿真器SWD可不接复位引脚的原因
    ARM内核常用缩写含义
    三大范式(转)
    修改主键示例
    ROW_NUMBER用法详解
  • 原文地址:https://www.cnblogs.com/haibing0107/p/7601907.html
Copyright © 2011-2022 走看看