代码之家  ›  专栏  ›  技术社区  ›  prime23 hans

将表数据导入以前导出的数据库

  •  0
  • prime23 hans  · 技术社区  · 16 年前

    我正在处理一个feather,它将一些表(~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
    

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

    编辑:

    实际上,导入和导出是程序中的两个功能(按钮),在UI中,有一个网格列出了许多表,我需要实现的是将所选表的数据导出到磁盘文件中,稍后再将数据导入数据库。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Eric    16 年前

    为什么不使用SQL Server的 native Backup and Restore 功能?您可以对数据进行增量恢复,这是目前为止导出和再次导入数据的最快方法。

    有很多非常高级的选项可以考虑到一些边缘情况,但其核心是两个命令: Backup Database Restore 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分钟到1小时。 比每排都要快!

        2
  •  0
  •   mcauthorn    16 年前

    我猜你在使用SQL Server?如果我愿意

    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]);
     }
    
        3
  •  0
  •   Akash Kava    16 年前

    您可以使用XML序列化,但是您需要好的ORML工具(如nhiberination等)来帮助您使用它。XML序列化将维护其数据类型,并且将不间断地工作。

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

        4
  •  0
  •   prime23 hans    16 年前

    我最后选择了sqlcommandbuilder来自动生成insert命令

    SqlCommandBuilder Class