gpt4 book ai didi

c# - SqlBulkCopy 计算字段

转载 作者:太空宇宙 更新时间:2023-11-03 19:30:56 26 4
gpt4 key购买 nike

我正在努力将数据库从 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 字符串 Access 数据,它具有所有正确的字段名称,因此我不需要设置列映射。

这一直有效,直到我到达一个包含计算字段的表。 SQLBulkCopy 似乎不知道要跳过该字段并尝试更新失败的列,并出现错误“无法修改列 'columnName',因为它是计算列或联合运算符的结果。”

有没有简单的方法让它跳过计算字段?

我希望不必指定完整的列映射。

最佳答案

有两种方法可以避免这种情况:

  • 使用ColumnMappings正式定义列关系(你注意到你不想要这个)
  • 将数据推送到一个暂存表 - 一个基本表,不是核心事务表的一部分,其全部目的是看起来完全像这个数据导入;然后使用TSQL命令将数据从暂存表传输到真实表

出于各种原因,我总是倾向于第二种选择:

  • 我从来不需要打乱映射——这对我来说真的很重要 ;p
  • 对真实表的插入将被完整记录(SqlBulkCopy 不一定被记录)
  • 我有尽可能快的插入——没有约束检查、没有索引等
  • 我在导入过程中不绑定(bind)事务表,并且不存在针对部分导入的表运行不可重复查询的风险
  • 如果导入中途失败,我有一个安全的中止选项,无需使用事务(此时没有触及事务系统)
  • 它允许在将数据推送到真实表中时进行一定程度的数据处理,而无需在应用层缓冲 DataTable 中的所有内容,或实现自定义 IDataReader

关于c# - SqlBulkCopy 计算字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com