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

數據正常導入數據庫,但是存在數據問題,順序錯亂。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM