SqlBulkCopy 批量导入数据

SqlBulkCopy 这个类用于数据库大批量的数据传递,通常用于新旧数据库之间的更新。关键的一点是,即使表结构不同,也可以通过表字段或者字段位置建立映射关系,将所需的数据导入到目标数据库

使用事务批量导入数据 ,注:datatable 的列的顺序要和数据库表的列的顺序一致
 public bool sqlbulkCopyDT(DataTable sqlbulkCopyDT, string TableName, string strConn)
        {
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction();

                try
                {
                    if (sqlbulkCopyDT != null && sqlbulkCopyDT.Rows.Count > 0)
                    {
                        SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tran);
                        bulkCopy.BulkCopyTimeout = 3600;
                        try
                        {

                            bulkCopy.DestinationTableName = TableName;//***代表要插入数据的表名
                            foreach (DataColumn dc in sqlbulkCopyDT.Columns)  //传入上述table
                            {
                                bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应
                            }
                            bulkCopy.WriteToServer(sqlbulkCopyDT);
                            bulkCopy.Close();

                        }
                        catch (Exception ex)
                        {
                            bulkCopy.Close();
                            tran.Rollback();
                            return false;
                        }
                    }
                    tran.Commit();
                    conn.Close();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    conn.Close();
                    return false;
                }

            }

            return true;
        }

/// <summary>
        /// SqlBulkCopy类的使用,批量更新数据
        /// </summary>
        public static void SqlBulkCopyDemo()
        {
            String connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
            //从数据库中获得表结构和数据
            DataTable student = new DataTable();
            SqlDataAdapter adapter = new SqlDataAdapter("select * from student", connStr);
            adapter.Fill(student);
            //向表中添加数据
            DataRow dr;
            Random r = new Random();
            Stopwatch st = new Stopwatch();
            for(int i = 0; i<1000000; i++)//一百万条数据
            {//数据表中的列:name,no,age,sex
                dr = student.NewRow();
                dr[0] = "小花" + i;
                dr[1] = 108 + i;
                dr[2] = r.Next(9, 40);//这里是因为数据表中有约束,
                dr[3] = (i % 2 == 0 ? "男" : "女");//这个也是有约束
                student.Rows.Add(dr);
            }
            SqlBulkCopy bulk = new SqlBulkCopy(connStr);
            bulk.DestinationTableName = "student";//设置目标表,这里是数据库中的student表
            bulk.ColumnMappings.Add(0, 0);//建立映射关系
            bulk.ColumnMappings.Add(1, 1);
            bulk.ColumnMappings.Add(2, 2);
            bulk.ColumnMappings.Add(3, 3);
            st.Start();//开始计时
            bulk.WriteToServer(student.GetChanges());
            st.Stop();//结束计时
            Console.WriteLine("数据插入成功,耗时为:" + st.ElapsedMilliseconds + "毫秒");
        }

参考:https://www.cnblogs.com/daimajun/archive/2017/03/16/6561682.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。