• 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;
                        }
                    }
                }
            }

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

  • 相关阅读:
    补结对编程四则运算(结对伙伴)
    alpha发布(技术随笔)
    第四周 更新Scrum站立会议
    第四周 技术随笔psp
    第四周 课堂Scrum站立会议
    更新-补四则运算(结对编程)
    补交git、ssh
    补第二周四人小组WBS/NABCD
    补充第二周燃尽图
    修改第二周站立会议
  • 原文地址:https://www.cnblogs.com/lanyubaicl/p/5863817.html
走看看 - 开发者的网上家园