【问题标题】:Import table data into database that expoted before将表数据导入之前导出的数据库
【发布时间】:2010-11-22 14:05:39
【问题描述】:

我正在研究将一些表(~50)导出到磁盘文件并将文件导入回数据库的功能。导出非常简单,将数据集序列化为文件流。但是导入时:需要动态确定表结构。我现在在做什么:

foreach table in dataset
   (compare table schemas that in db and imported dataset)
   define a batch command
   foreach row in table
      contruct a single insert sqlcommand,add it to batch command
   execute batch insert command

这是非常低效的,我也遇到了一些将数据集数据表中的数据类型转换为数据库数据表的问题。所以我想知道有什么好的方法吗?

编辑:

实际上,导入和导出是程序中的2个功能(按钮),在UI上,有一个列出很多表的网格,我需要实现的是将选定表的数据导出到磁盘文件并导入数据回来稍后到数据库

【问题讨论】:

    标签: c# sql-server import export


    【解决方案1】:

    我最终选择了SqlCommandBuilder来自动构建插入命令

    SqlCommandBuilder Class

    【讨论】:

      【解决方案2】:

      您可以使用 XML 序列化,但您需要良好的 ORML 工具(如 NHibernation 等)来帮助您。 XML 序列化将保持其数据类型,并且将流畅地工作。

      您可以读取整个表并将所有值序列化到 xml 文件中,您可以将整个 xml 文件读回对象列表并将它们存储到数据库中。使用好的 ORML 工具,您将不需要编写任何 SQL。而且我认为它们也可以在不同的数据库服务器上工作。

      【讨论】:

        【解决方案3】:

        我猜你正在使用 SQL 服务器?如果是这样我会

        a) 确保表名显示在导出中 b) 查看 BulkCopy 命令。这将允许您将整个表推入。因此您可以遍历数据表并批量复制每个表。

        using (SqlBulkCopy copy = new SqlBulkCopy(MySQLExpConn))
        {
            copy.ColumnMappings.Add(0, 0);
            copy.ColumnMappings.Add(1, 1);
            copy.ColumnMappings.Add(2, 2);
            copy.ColumnMappings.Add(3, 3);
            copy.ColumnMappings.Add(4, 4);
            copy.ColumnMappings.Add(5, 5);
            copy.ColumnMappings.Add(6, 6);
            copy.DestinationTableName = ds.Tables[i].TableName;
            copy.WriteToServer(ds.Tables[i]);
         }
        

        【讨论】:

        • 这个解决方案几乎适合我,但是 1)我不能在我的系统中使用连接字符串,因为它在我们的数据访问类中是私有的 2)如果记录已经存在于数据库中,我需要更新一些像 last_update_user 和 last_update_time 这样的文件。
        • 嗯,确实改变了整体问题。到 1)如果您可以访问数据访问类,则可以在其中添加该函数并将其公开给您的类,然后将其交给一个表格。 2)如果它也更新,那么你将不得不做 SQL。我不知道其他方法。
        【解决方案4】:

        为什么不使用 SQL Server 的 native Backup and Restore 功能?您可以对数据进行增量还原,这是迄今为止导出然后再次导入数据的最快方式。

        有很多非常高级的选项可以考虑一些边缘情况,但它的核心是两个命令:Backup DatabaseRestore Database

        backup database mydb to disk = 'c:\my\path\to\backup.bak'
        
        restore database mydb from disk = 'c:\my\path\to\backup.bak'
        

        根据我的经验,对 TB 大小的数据库执行此操作大约需要 45 分钟到一个小时。 比尝试遍历每一行要快得多

        【讨论】:

        • 我想那样做,但设计是产品的功能
        • @static: 什么是产品的功能?
        • @Eric:见上面我添加的编辑
        猜你喜欢
        • 2016-10-16
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多