c# - SqlBulkCopy 计算字段

标签 c# .net 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;
            }
        }
    }

基本上,此查询使用输入的 sql 字符串 Access 数据,它具有所有正确的字段名称,因此我不需要设置列映射。

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

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

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

最佳答案

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

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

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

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

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

相关文章:

c# - 何时在 C# 中无约束地使用泛型方法?

.net - 任何用于医疗诊断和数据挖掘的 .NET 开源项目

mysql - Visual Studio/Visual Studio 2017 数据源向导的 MySQL 问题。你调用的对象是空的

c# - C#中的自然数字排序

c# - 使用 WPF 数据绑定(bind)设计响应式 UI

c# - 如何将文件夹中的所有 PNG 转换为 JPG 以制作视频?

sql-server - Entity Framework 表命名约定

sql-server - 在 SSIS 的 DerivedColumn 数据流任务中检查数字

sql - varchar 列上的标识键 - T-SQL

c# - 如何实现网站私信?