Pet*_*teT 1 .net c# sql-server ms-access sqlbulkcopy
我正在努力将数据库从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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,这使用输入sql字符串查询数据访问,这具有所有正确的字段名称,因此我不需要设置columnmappings.
这是有效的,直到我到达一个带有计算字段的表.SQLBulkCopy似乎不知道跳过该字段并尝试更新失败的列,并显示错误"列'columnName'无法修改,因为它是计算列或者是union运算符的结果."
是否有一种简单的方法可以跳过计算字段?
我希望不必指定完整的列映射.
有两种方法可以避免这种情况:
由于各种原因,我总是喜欢第二种选择:
SqlBulkCopy是不是一定是登录)DataTable应用层中的所有内容,或实现自定义IDataReader