Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将表数据导入以前导出的数据库_C#_Sql Server_Import_Export - Fatal编程技术网

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

C# 将表数据导入以前导出的数据库,c#,sql-server,import,export,C#,Sql Server,Import,Export,我正在开发一个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

我正在开发一个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
这是非常低效的,而且我在将dataset datatable中的数据类型转换为数据库datatable时遇到了一些问题。所以我想知道有什么好方法可以做到这一点吗

编辑:

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

为什么不使用SQL Server的功能?您可以对数据执行增量恢复,这是迄今为止导出然后再次导入数据的最快方式

考虑到一些边缘情况,有很多非常高级的选项,但其核心是两个命令:和


在对TB大小的数据库执行此操作时,根据我的经验,大约需要45分钟到1小时。比试图通过每一行要快得多

我猜您正在使用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]);
 }

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


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

我最后选择SqlCommandBuilder自动生成insert命令


我想这样做,但它是产品的函数design@static:你说这是产品的功能是什么?@Eric:看我上面添加的编辑这个解决方案几乎适合我,但是1)我不能在我的系统中使用连接字符串,因为它在我们的数据访问类中是私有的2)如果数据库中已经存在记录,我需要更新一些文件,比如last_update_user和last_update_time.hmmm,这确实改变了整个问题。到1)如果您可以访问数据访问类,您可以在那里添加函数,并将其公开给您的类,只需将其交给一个表即可。2) 如果它也更新了,那么您必须执行SQL。我不知道还有别的办法。
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]);
 }