以编程方式将SQL Server数据库保存到xml文件并再次还原

时间:2011-05-31 22:49:41

标签: c# .net asp.net sql sql-server-2008

我想使用asp.net将整个MS SQL 2008数据库保存到XML文件中。

现在我有点迷失了......实现这一目标的最佳方法是什么?数据集

我需要稍后再次恢复数据库..使用这些XML文件。我正在考虑使用数据集来读取表并写入xml并使用SQLBulkCopy类再次恢复数据库。但我不确定这是否是正确的方法..

我的任何线索和提示?

3 个答案:

答案 0 :(得分:4)

如果您需要在同一服务器类型(我的意思是SQL Server 2008或更高版本)上恢复它,并且不关心在XML中查看实际数据的能力,请执行以下操作:

  1. 使用“BACKUP DATABASE”T-SQL
  2. 以编程方式备份​​数据库
  3. 压缩备份
  4. 将备份转换为Base64
  5. 将备份作为XML文件的内容放置(例如:< database name =“...”compressionmethod =“...”compressionlevel =“...”>这里的Base64内容< / database>
  6. 在需要还原它的服务器上,下载XML,提取Base64内容,使用属性知道使用了什么压缩。使用T-SQL“RESTORE”命令解压缩和恢复。
  7. 这种方法有用吗? 当然,如果您需要查看数据库的内容,则需要开发XML方案,遍历每个表等。但是,您不会备份SP /视图和其他项目。

答案 1 :(得分:3)

因为您在谈论CMS,我将假设您正在部署到您可能没有命令行访问权限的托管环境中。

现在,在我给你链接之前,我想说明这是一个 BAD 的想法。 XML过于冗长,无法传输大量数据。此外,尽管将数据拉出相对容易,但将其重新放入其中将是困难的并且本身就是一个非常耗时的开发项目。

下一个警告:正如Denis建议的那样,您将错过所有存储过程,函数等。最好的办法是使用正常的sql server备份/恢复过程。 (顺便说一句,我赞成他的回答)。

最后,上次我处理XML和SQL Server时,我们注意到当数据超过64KB边界时出现的有趣问题。基本上,在63.5KB时,查询运行得非常快(200ms)。在64KB时,查询时间跳跃超过一分钟,有时甚至更长。我们没有考虑任何超过100KB的测试,因为在零负载的快速/专用服务器上需要花费5分钟。

http://msdn.microsoft.com/en-us/library/ms188273.aspx

请将其重新放入: How to insert FOR AUTO XML result into table?


对于踢,这里有一个关于将数据作为json对象拉出的链接:http://weblogs.asp.net/thiagosantos/archive/2008/11/17/get-json-from-sql-server.aspx

你也应该阅读(不是为了胆小的人):http://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/

当然,评论员都建议使用CLR方法构建一些东西,但在共享数据库托管环境中可能无法使用。


在一天结束时,如果您真的坚持这种疯狂,只需遍历表格列表并将所有数据导出到标准CSV文件,您就可以获得更好的服务。然后,迭代CSV文件以在ala C# - is there a way to stream a csv file into database?

中加载数据

请记住,以上所有方法都受到

的影响
  1. 由于数据开销导致处理时间过长;
  2. 由于各种超时(页面处理,命令,连接等)而导致失败的可能性很高;和,
  3. 如果您的数据模型在导出和重新导入之间发生变化,那么您将重新编写自定义翻译代码并最终搞砸。
  4. 所以,只有这样,如果你真的必须这样做,并且至少在某种程度上是一个心灵的受虐狂。如果目的只是将一些数据从一个安装传输到另一个安装,您可以考虑使用SQL Compare中的SQL Data CompareRedGate之类的工具来处理传输。

    我不在乎你做了多少(或者很少),他们developer bundle的1500美元投资比你花费这么多月的时间要便宜得多,修理它,重做它,修复它再次等等(为了记录,我不为他们工作。他们的产品只是一流的。)

答案 2 :(得分:0)

Red Gate的SQL Packager允许您将数据库打包到exe或VS项目中,因此您可能需要查看它。您可以指定要为数据考虑的表。

您是否有任何特定原因要使用xml执行此操作?