首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlBulkCopy计算字段

SqlBulkCopy计算字段
EN

Stack Overflow用户
提问于 2011-02-17 20:42:22
回答 1查看 3.9K关注 0票数 1

我正在把一个数据库从MS Access移动到sql server。为了将数据移动到新的表中,我决定编写一个同步例程,因为模式已经发生了相当大的变化,它允许我在运行它的程序上运行测试,并在需要新的测试数据时重新同步。最后,我将执行最后一次同步,并在新的sql server版本上启动live。

不幸的是,我遇到了一个问题,我的方法是从Access复制到SQLServer

代码语言:javascript
复制
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,因为它要么是计算列,要么是联合运算符的结果。“

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-17 20:57:56

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

  • 使用ColumnMappings正式定义列关系(注意,您不希望这样做)
  • 将数据推送到临时表中-一个基本表,而不是核心事务性表的一部分,其整个目的是看起来与此数据导入完全一样;然后使用TSQL命令将数据从临时表传输到实际表

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

  • 我永远不需要弄乱映射--这对我来说很重要;P
  • 对实表的插入将被完整记录(SqlBulkCopy不一定被记录)
  • 我有最快的插入速度-没有约束检查,没有索引,等等。
  • 我在导入期间不占用事务性表,并且没有对部分导入的表运行不可重复查询的风险
  • 如果导入中途失败,我有一个安全的中止选项,而不必使用事务(此时没有涉及事务系统)
  • 它允许在将其推入实际表时进行某种级别的数据处理,无需在应用程序层缓冲DataTable中的所有内容,也无需实现自定义的IDataReader
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5029037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档