我正在努力将数据库从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运算符的结果。”
是否有一种简单的方法可以跳过计算字段?
我希望不必指定完整的列映射。
答案 0 :(得分:6)
有两种方法可以避免这种情况:
由于各种原因,我总是赞成第二种选择:
SqlBulkCopy
不必须记录)DataTable
中的所有内容,或实现自定义IDataReader