1
我正在將數據庫從MS Access移到sql server。爲了將數據移動到新表中,我決定編寫一個同步例程,因爲模式已經發生了很大的變化,它使我能夠對運行它的程序運行測試,並在需要新的測試數據時重新同步。然後最終我會做最後一次同步並開始在新的sql服務器版本上生效。SqlBulkCopy計算字段
不幸的是我遇到了阻礙,我的方法是下面複製從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字符串這所有正確的字段名,所以我不要了數據訪問不需要設置列映射。
這是工作,直到我到達一個計算字段的表。 SQLBulkCopy似乎並不知道要跳過該字段並嘗試更新失敗的列,但出現錯誤「列'columnName'不能被修改,因爲它既可以是計算列,也可以是聯合運算符的結果。」
是否有一種簡單的方法可以使其跳過計算的字段?
我希望不必指定一個完整的列映射。
而不是一個臨時表,我會建議一個可更新的視圖,只包括colu沒有計算的mns,然後批量複製到視圖中。 – 2016-04-23 15:01:08