zoukankan      html  css  js  c++  java
  • 【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);
            }

      执行结果:

      

  • 相关阅读:
    数据库表数据传输到Oracle方案
    Pdnovel 在线阅读体验
    Metaweblog博客分发体验
    Liveqrcode活码系统设计
    Java Language Changes for Java SE 9
    利用“计算器”和公式做房贷计算
    阿里云SLB快速切换至https
    Charles 协助解决 metaweblog 排序问题
    Go语言网络通信---连续通信的UDP编程
    Go语言网络通信---一个简单的UDP编程
  • 原文地址:https://www.cnblogs.com/512kd/p/11793134.html
Copyright © 2011-2022 走看看