我发现了几篇关于如何使用 C# 中的 Sql SMO 程序集执行数据库备份和数据库恢复的帖子。基本上,如果我想复制一个数据库并给它一个新名称,我需要在执行Restore时提供 Relocate Files 。重定位文件由数据文件路径和日志文件路径组成。如果我从现有数据库中恢复,那么我可以简单地检查Database 对象的FileGroups 属性以获取数据文件路径,并使用 LogFiles 属性获取日志文件路径,然后修改路径的文件名以使用新的数据库名称,并且在进行还原时提供这些。如果不提供重定位文件,还原操作只会覆盖原始数据库(覆盖它的 .mdf(数据)和 .
所以我一切工作正常,但现在我遇到了我想从用户提供的数据库备份文件(.bak)创建一个新数据库的情况,他们应该能够为数据库。为了给数据库一个新名称并且不覆盖现有的数据库文件(如果它们已经存在),我需要知道备份文件的数据和日志文件路径。
是否有可用于检查数据库备份文件的数据库名称、数据文件路径和日志文件路径的 SMO 函数?我假设有,因为 SQL Management Studio 能够做到,但是查看 MSDN 文档我还没有遇到它。
提前致谢。
== 答案 ==
正如 Ben Thul 的回答所链接的,答案是在 Restore 对象上使用ReadFileList 函数。这是一些示例代码:
Restore restore = new Restore();
restore.Devices.AddDevice(Path.GetFullPath(backupFileToRestoreFrom), DeviceType.File);
DataTable fileList = restore.ReadFileList(server);
string dataLogicalName = fileList.Rows[0][0].ToString();
string dataPhysicalName = fileList.Rows[0][1].ToString();
string logLogicalName = fileList.Rows[1][0].ToString();
string logPhysicalName = fileList.Rows[1][1].ToString();