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