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;
                    }
                }
            }
        }
复制代码

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

原文地址:https://www.cnblogs.com/dinggf/p/10995789.html