我正在把一个数据库从MS Access移动到sql server。为了将数据移动到新的表中,我决定编写一个同步例程,因为模式已经发生了相当大的变化,它允许我在运行它的程序上运行测试,并在需要新的测试数据时重新同步。最后,我将执行最后一次同步,并在新的sql server版本上启动live。
不幸的是,我遇到了一个问题,我的方法是从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似乎不知道要跳过该字段,并尝试更新失败的列,并显示错误"The column 'columnName‘know be modified,因为它要么是计算列,要么是联合运算符的结果。“
有没有简单的方法让它跳过计算字段?
我希望不必指定完整的列映射。
发布于 2011-02-17 20:57:56
有两种方法可以避免这种情况:
出于各种原因,我总是倾向于第二种选择:
SqlBulkCopy不一定被记录)DataTable中的所有内容,也无需实现自定义的IDataReaderhttps://stackoverflow.com/questions/5029037
复制相似问题