【C#常用方法】3.将DataTable一次性插入数据库表中(使用SqlBulkCopy)

将DataTable一次性插入数据库表中(使用SqlBulkCopy)

1.SqlBulkCopy简介


 

  SqlBulkCopy类是ADO.NET中专门用于数据库批量插入数据的类,其批量插入的执行速度是其他类似操作类中最快的。SqlBulkCopy类在批量插入数据时,不用去像传统插入操作那样先拼写出sql语句再对sql语句进行执行,而是可以直接将一个DataTable插入数据库的目标表中。

  关于SqlBulkCopy类的用法详见下面例子2。

 

2.将DataTable一次性插入数据表中


 

(1)方法代码

  直接上功能代码,代码中的注释很详细:

    class DBHelper
    {
        /// <summary>
        /// 使用sqlBulkCopy将DataTable一次性插入数据库
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="tableName">要插入的数据库表名称</param>
        /// <param name="colMapping">DataTable与数据库表中列的对应关系,key:为DataTable的列名,value:数据库表的列名</param>
        /// <returns></returns>
        public static bool InsertDataTableToDB(DataTable dt, string tableName, Dictionary<string, string> colMapping)
        {
            try
            {
                string connStr = "Server=.;Database=TestDB;uid=sa;pwd=songge";//连接字符串

                //使用SqlBulkCopy可省略SqlConnection,直接将连接字符串赋给它(当然也可以不省略),第二个参数表示打开事物(一步操作失败那么所有操作回滚)
                using (SqlBulkCopy bc = new SqlBulkCopy(connStr, SqlBulkCopyOptions.UseInternalTransaction))
                {
                    //添加DataTable每列与数据表每列的对应关系
                    foreach (var item in colMapping)
                    {
                        bc.ColumnMappings.Add(item.Key, item.Value);
                    }
                    bc.BatchSize = dt.Rows.Count;//设置每次插入的数据量
                    bc.DestinationTableName = tableName;//设置目标表(要插入到哪个数据库表)
                    bc.WriteToServer(dt);//执行插入
                    return true;
                }
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }

 

(2)使用方法

  首先在数据库新建一个测试表,名称为TestTable1,表结构如下所示:

  

  重点解释:将一个DataTable插入数据库时,如果设置了ColumnMappings(即设置了DataTable列与数据库表列的对应关系),那么在插入时只插入绑定了的列,如果不设置ColumnMappings,那么如果想用SqlBulkCopy将DataTable插入数据库,那么这个DataTable的结构必须与数据库表的结构相同(列名相同,好像顺序与列的数量也得相同,我没测试)。

        private void button_Click(object sender, RoutedEventArgs e)
        {
            //初始化一个要插入数据表的DataTable
            DataTable dt = new DataTable();
            dt.Columns.Add("a", typeof(string));
            dt.Columns.Add("b", typeof(string));
            dt.Columns.Add("c", typeof(int));
            dt.Columns.Add("x", typeof(string));
            dt.Columns.Add("Cc", typeof(string));
            //设置与数据库表的对应关系,因为DataTable只绑定了数据库表的三列,所以在插入时,只插入绑定的这三列
            Dictionary<string, string> colMapping = new Dictionary<string, string>();
            colMapping.Add("c", "Cf");
            colMapping.Add("b", "Ca");
            colMapping.Add("a", "Cb");
            //插入10条测试数据
            for (int i=0;i<10;i++)
            {
                dt.Rows.Add(dt.NewRow().ItemArray = new object[] { "a", "b" , i, "x","Cc"});
            }
            
            //执行方法
            DBHelper.InsertDataTableToDB(dt, "TestTable1", colMapping);
        }

  执行结果:

  

 

posted @ 2019-11-04 17:15  裤兜  阅读(2238)  评论(0编辑  收藏  举报