文章出處

使用場景:

一個數據庫中的表數據,導入到另一個數據庫中的表中,這兩個表的表結構不一樣,如果表結構一樣的時候,導入非常簡單,直接讀取導入就行了,表結構不一樣,就意味著需要加入一些判斷,SqlBulkCopy 提供了 ColumnMappings,但這只是列名的映射,而不像 AutoMapper 那樣可以自定義映射轉換,那如何判斷導入呢?答案就是在導入之前對原數據集進行驗證,得到和目標表一致的表數據,我們可以使用 case when 進行判斷。比如 table1 中有兩列:State1 和 State2,對應 table1 中的 State,值對應關系為:

  1. State1 0 && State2 0 對應 State 0
  2. State1 1 && State2 0 對應 State 1
  3. State1 0 && State2 1 對應 State 2
  4. State1 1 && State2 1 對應 State 3

代碼示例:


        /// <summary>
        /// 數據庫中的表復制到另一個數據庫中的表
        /// </summary>
        private static void SqlBulkCopyMethod()
        {
            TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
            try
            {
                SqlConnection connetionPub = new SqlConnection("Server=.; Database=DB1; User ID=sa;Password=sa; MultipleActiveResultSets=True;");
                using (connetionPub)
                {
                    SqlCommand commandPub = connetionPub.CreateCommand();
                    using (commandPub)
                    {
                        commandPub.CommandText = @"select 
                                                    *,
                                                    (case when (State1 = 0 and State2=0)
                                                    then 0
                                                    when (State1 = 0 and State2=1)
                                                    then 1
                                                    when (State1 = 1 and State2=0)
                                                    then 2
                                                    when (State1 = 1 and State2=1)
                                                    then 3
                                                    else 4 end
                                                    ) State
                                                    from table1";
                        commandPub.CommandType = System.Data.CommandType.Text;
                        connetionPub.Open();

                        SqlConnection connectionBulkCopy = new SqlConnection("Server=.; Database=DB2; User ID=sa;Password=sa; MultipleActiveResultSets=True;");
                        using (connectionBulkCopy)
                        {
                            connectionBulkCopy.Open();
                            SqlDataReader dataReader = commandPub.ExecuteReader();
                            SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionBulkCopy);
                            using (bulkCopy)
                            {
                                bulkCopy.BatchSize = 1000;
                                bulkCopy.ColumnMappings.Add("id", "ID");
                                bulkCopy.ColumnMappings.Add("name", "Name");
                                bulkCopy.ColumnMappings.Add("State", "State");
                                bulkCopy.DestinationTableName = "table2";
                                bulkCopy.WriteToServer(dataReader);
                            }
                        }
                    }
                }
                TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
                TimeSpan ts3 = ts1.Subtract(ts2).Duration();
                Console.WriteLine(string.Format("執行時間:{0}秒", ts3.TotalSeconds.ToString()));
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()