zoukankan      html  css  js  c++  java
  • C# SqlBulkCopy类批量导入 测试

    一、功能说明

    1、可以选择,只导入部分列,或者导入全部列。

    2、导入速度的确比一般sql要快。

    3、不用写sql语句

    ---------------------------------------------------------

    4、导入数据库 须 将字段对应关系做好配置,否则很有可能导入数据库的数据,字段顺序问题出错。

    ----------------------------------------------------------------------------------------

    二、C#导入代码

    复制代码
    /// <summary>
            /// 
            /// </summary>
            /// <param name="connectionString">目标连接字符</param>
            /// <param name="TableName">目标表</param>
            /// <param name="dt">源数据</param>
            private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    using (SqlBulkCopy sqlbulkcopy =new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        try
                        {
                            sqlbulkcopy.DestinationTableName = TableName;
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                            }
                            sqlbulkcopy.WriteToServer(dt);
                        }
                        catch (System.Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }
    复制代码

     三、测试

      3.1 数据库建表    

    复制代码
    CREATE TABLE temp 
    (
        test1 varchar(30),
        test2 varchar(30),
        test3 varchar(30),
        test4 varchar(30),
        test5 varchar(30),
        test6 varchar(30)
    )
    复制代码

     3.2 C# 代码,测试 DataTabe比数据库表少一个字段,执行插入数据库也少做一个对应关系。

    复制代码
        private void button1_Click(object sender, EventArgs e)
            {
                SqlBulkCopyByDatatable(dt);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                /*
                 * 这里 test1 字段不添加字段,待会看执行Copy 会出错
                 */
                dt = new DataTable();
                dt.Columns.Add("test2", System.Type.GetType("System.String"));
                dt.Columns.Add("test3", System.Type.GetType("System.String"));
                dt.Columns.Add("test4", System.Type.GetType("System.String"));
                dt.Columns.Add("test5", System.Type.GetType("System.String"));
                dt.Columns.Add("test6", System.Type.GetType("System.String"));
                //添加行数据
                for (int i = 0; i < 100; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["test2"] = "test2";
                    dr["test3"] = "test3";
                    dr["test4"] = "test4";
                    dr["test5"] = "test5";
                    dr["test6"] = "test6";
                    dt.Rows.Add(dr);
                }
                this.dataGridView1.DataSource = dt;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="connectionString">目标连接字符</param>
            /// <param name="TableName">目标表</param>
            /// <param name="dt">源数据</param>
            private void SqlBulkCopyByDatatable(DataTable dt)
            {
                using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;"))
                {
                    using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        try
                        {
                            sqlbulkcopy.DestinationTableName = "temp";
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                            }
                            sqlbulkcopy.WriteToServer(dt);
                        }
                        catch (System.Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }
    复制代码

    执行结果无异常。

     3.3  数据库表中 的“test1” 列 DataTable 没有,DataTable 中“test7” 数据库没有,对应关系 只关联双方共有的列。

    复制代码
       private void button1_Click(object sender, EventArgs e)
            {
                SqlBulkCopyByDatatable(dt);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                /*
                 * 这里 test1 字段不添加字段,待会看执行Copy 会出错
                 * 新增 test7 列 ,数据库中没有 ‘test7’ 这一列
                 */
                dt = new DataTable();
                dt.Columns.Add("test2", System.Type.GetType("System.String"));
                dt.Columns.Add("test3", System.Type.GetType("System.String"));
                dt.Columns.Add("test4", System.Type.GetType("System.String"));
                dt.Columns.Add("test5", System.Type.GetType("System.String"));
                dt.Columns.Add("test6", System.Type.GetType("System.String"));
                dt.Columns.Add("test7", System.Type.GetType("System.String"));
                //添加行数据
                for (int i = 0; i < 100; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["test2"] = "test2";
                    dr["test3"] = "test3";
                    dr["test4"] = "test4";
                    dr["test5"] = "test5";
                    dr["test6"] = "test6";                
                    dr["test7"] = "test7";
                    dt.Rows.Add(dr);
                }
                this.dataGridView1.DataSource = dt;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="connectionString">目标连接字符</param>
            /// <param name="TableName">目标表</param>
            /// <param name="dt">源数据</param>
            private void SqlBulkCopyByDatatable(DataTable dt)
            {
                using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;"))
                {
                    using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        try
                        {
                            /*
                             * 字段对应关系绑定,只绑定双方共有的。
                             */
                            sqlbulkcopy.DestinationTableName = "temp";
                            sqlbulkcopy.ColumnMappings.Add("test2", "test2");
                            sqlbulkcopy.ColumnMappings.Add("test3", "test3");
                            sqlbulkcopy.ColumnMappings.Add("test4", "test4");
                            sqlbulkcopy.ColumnMappings.Add("test5", "test5");
                            sqlbulkcopy.ColumnMappings.Add("test6", "test6");
                            //for (int i = 0; i < dt.Columns.Count; i++)
                            //{
                            //    sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                            //}
                            sqlbulkcopy.WriteToServer(dt);
                        }
                        catch (System.Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }
    复制代码

    sql数据库插入数据 正常,C#代码没有报错:

     3.4  打乱Datatable 列的顺序,不添加字段对应关系,数据库中导入数据错位。

      

    复制代码
         private void button1_Click(object sender, EventArgs e)
            {
                SqlBulkCopyByDatatable(dt);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                /*
                 * 这里 test1 字段不添加字段,待会看执行Copy 会出错
                 * 新增 test7 列 ,数据库中没有 ‘test7’ 这一列
                 * 打乱 每一列的对应关系
                 */
                dt = new DataTable();
                dt.Columns.Add("test5", System.Type.GetType("System.String"));
                dt.Columns.Add("test6", System.Type.GetType("System.String"));
                dt.Columns.Add("test7", System.Type.GetType("System.String"));
                dt.Columns.Add("test2", System.Type.GetType("System.String"));
                dt.Columns.Add("test3", System.Type.GetType("System.String"));
                dt.Columns.Add("test4", System.Type.GetType("System.String"));
                //添加行数据
                for (int i = 0; i < 100; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["test5"] = "test5";
                    dr["test6"] = "test6";                
                    dr["test7"] = "test7";
                    dr["test2"] = "test2";
                    dr["test3"] = "test3";
                    dr["test4"] = "test4";
                    dt.Rows.Add(dr);
                }
                this.dataGridView1.DataSource = dt;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="connectionString">目标连接字符</param>
            /// <param name="TableName">目标表</param>
            /// <param name="dt">源数据</param>
            private void SqlBulkCopyByDatatable(DataTable dt)
            {
                using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;"))
                {
                    using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        try
                        {
                            /*
                             * 字段对应关系绑定,只绑定双方共有的。
                             */
                            sqlbulkcopy.DestinationTableName = "temp";
                            //sqlbulkcopy.ColumnMappings.Add("test2", "test2");
                            //sqlbulkcopy.ColumnMappings.Add("test3", "test3");
                            //sqlbulkcopy.ColumnMappings.Add("test4", "test4");
                            //sqlbulkcopy.ColumnMappings.Add("test5", "test5");
                            //sqlbulkcopy.ColumnMappings.Add("test6", "test6");
                            //for (int i = 0; i < dt.Columns.Count; i++)
                            //{
                            //    sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                            //}
                            sqlbulkcopy.WriteToServer(dt);
                        }
                        catch (System.Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }
    复制代码

    数据正常导入数据库,但是存在数据问题,顺序错乱。

  • 相关阅读:
    ssh
    ssh免密码登陆
    滑雪[dp]
    Help Jimmy[dp]
    动态规划 [子序列问题]
    最佳加法表达式 [dp]
    求排列的逆序数[归并排序]
    输出前m大个数,时间复杂度O(n+mlog(m)) [快排]
    不会递归?五道例题教你如何递归
    函数模板的琐碎笔记
  • 原文地址:https://www.cnblogs.com/dinggf/p/10995789.html
Copyright © 2011-2022 走看看