SqlBulkCopy計算字段

.net c# ms-access sqlbulkcopy sql-server

我正在努力將數據庫從MS Access移動到sql server。為了將數據移動到新表中,我決定編寫一個同步例程,因為模式已經發生了很大變化,它允許我對運行它的程序運行測試,並在需要新的測試數據時重新同步。然後最終我將進行最後一次同步並在新的sql server版本上啟動。

不幸的是我遇到了麻煩,我的方法是從Access到SQLServer的複制

public static void BulkCopyAccessToSQLServer
        (string sql, CommandType commandType, DBConnection sqlServerConnection,
            string destinationTable, DBConnection accessConnection, int timeout)
    {
        using (DataTable dt = new DataTable())
        using (OleDbConnection conn = new OleDbConnection(GetConnection(accessConnection)))
        using (OleDbCommand cmd = new OleDbCommand(sql, conn))
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
        {
            cmd.CommandType = commandType;
            cmd.Connection.Open();
            adapter.SelectCommand.CommandTimeout = timeout;
            adapter.Fill(dt);

            using (SqlConnection conn2 = new SqlConnection(GetConnection(sqlServerConnection)))
            using (SqlBulkCopy copy = new SqlBulkCopy(conn2))
            {
                conn2.Open();

                copy.DestinationTableName = destinationTable;
                copy.BatchSize = 1000;
                copy.BulkCopyTimeout = timeout;
                copy.WriteToServer(dt);
                copy.NotifyAfter = 1000;
            }
        }
    }

基本上,這使用輸入sql字符串查詢數據的訪問權限,這具有所有正確的字段名稱,因此我不需要設置columnmappings。

這一直有效,直到我到達一個帶有計算字段的表。 SQLBulkCopy似乎不知道跳過該字段並嘗試更新失敗的列,錯誤“列'columnName'無法修改,因為它是計算列或者是union運算符的結果。”

是否有一種簡單的方法可以跳過計算字段?

我希望不必指定完整的列映射。

一般承認的答案

有兩種方法可以避免這種情況:

  • 使用ColumnMappings正式定義列關係(你注意到你不想這樣)
  • 將數據推送到臨時表 - 一個基本表,而不是核心事務表的一部分,其整個目的是看起來與此數據導入完全相同 ;然後使用TSQL命令將數據從登台表傳輸到真實表

由於各種原因,我總是讚成第二種選擇:

  • 我永遠不必亂用映射 - 這對我來說非常重要; p
  • 插入到真實表將被完全記錄( SqlBulkCopy 不一定登錄)
  • 我有最快的插入 - 沒有約束檢查,沒有索引等
  • 我在導入期間沒有佔用事務表,並且不存在針對部分導入的表運行不可重複查詢的風險
  • 如果導入失敗一半,我有一個安全的中止選項,而不必使用事務(此時沒有觸及事務系統)
  • 它允許在將其推入真實表時進行某種程度的數據處理,而無需緩衝應用層中DataTable中的所有內容,或實現自定義IDataReader


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow