C# 将表数据导入以前导出的数据库
我正在开发一个feather,它可以将一些表(~50)导出到磁盘文件,然后将文件导入回数据库。导出非常简单,将数据集序列化为文件流。但在导入时:表结构需要动态确定。我现在正在做的是: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
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]);
}