我找到了几篇关于如何使用 C# 中的 Sql SMO 程序集执行数据库备份和数据库还原的帖子。基本上,如果我想复制一个数据库并给它一个新名称,那么在进行恢复时需要提供“Relocate Files”。这些“Relocate Files”包括数据文件路径和日志文件路径。如果我正在从现有数据库进行恢复,那么我可以简单地检查“Database object”的 FileGroups 属性以获取数据文件路径,以及其 LogFiles 属性以获取日志文件路径,然后修改路径的文件名以使用新的数据库名称,并在进行恢复时提供这些信息。如果不提供“Relocate Files”,恢复操作将只覆盖原始数据库(覆盖其 .mdf(数据)和 .ldf(日志)文件)。
所以我已经成功地完成了所有这些工作,但现在我遇到了这样的情况:我想从用户提供的数据库备份文件(.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();