我正在研究将一些表(~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上,有一个列出大量表格的网格,我需要实现的是将选定表格的数据导出到磁盘文件并导入数据以后到数据库
答案 0 :(得分:2)
为什么不使用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 :(得分:0)
我猜你在使用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]);
}
答案 2 :(得分:0)
你可以使用XML serializatin,但你需要像NHibernation等好的ORML工具来帮助你。 XML Serialization将保持其数据类型并将无效地工作。
您可以读取整个表并将所有值序列化为xml文件,您可以将整个xml文件读回到对象列表中,然后将它们存储到数据库中。使用好的ORML工具,您不需要编写任何SQL。我认为他们也可以在不同的数据库服务器上工作。
答案 3 :(得分:0)
我最终选择SqlCommandBuilder自动构建插入命令