从bak文件中检索数据库名称

时间:2010-11-14 09:04:56

标签: c# .net sql-server sql-server-2005 smo

我有一个bak文件,其中包含数据库的备份。

我想将这个数据库恢复到一个新位置,我需要从这个文件中检索数据库名称,知道怎么做?

我需要它来覆盖数据文件位置和日志文件位置。

感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

RESTORE FILELISTONLY
FROM DISK = 'full path to your .bak file'

将显示备份中的当前文件名。如果一个文件中有多个备份但未指定“WITH FILE = X”,则只能获取文件中第一个备份的信息。

RESTORE DATABASE MyNewDBname
    FROM DISK = 'full path to your .bak file'
    WITH 
      MOVE 'LogicalFilename_Data' TO 'D:\somepath\...\MyDB.mdf',
      MOVE 'LogicalFilename_Log' TO 'D:\somepath\...\MyDB.ldf';
GO

SMO的粗略轮廓(未经测试):

Restore restoreDB = new Restore();
restoreDB.Database = myDatabase.Name;
// Specify whether you want to restore database, files or log
restoreDB.Action = RestoreActionType.Database;
restoreDB.Devices.AddDevice(@"D:\somepath\...\MyDBFull.bak", DeviceType.File);

restoreDB.ReplaceDatabase = true; // will overwrite any existing DB     
restoreDB.NoRecovery = true;

// you can Wire up events for progress monitoring */
// restoreDB.PercentComplete += CompletionStatus;
// restoreDB.Complete += RestoreCompleted;

restoreDB.SqlRestore(myServer);

Ref

使用SMO,您可以使用Restore.ReadFileList

检索文件列表

另请参阅:How to restore a database from C#

答案 1 :(得分:1)

我能够以一种非常hacky和不确定的方式获得数据库的名称。但是,这确实对我有用,无论如何,我只是在自己的小型测试和开发工具中使用它。

如果您遵循与Mitch Wheat相同的答案,则需要执行以下操作:

紧接着

restoreDB.Devices.AddDevice(@"D:\somepath\...\MyDBFull.bak", DeviceType.File);

添加以下三行:

var fileList = restore.ReadFileList(myServer);

string databaseName = fileList.Rows[0].ItemArray[0].ToString();

restore.Database = databaseName;

使用 myServer 读取关联的文件列表,然后从 DataTable ItemArray 中获取信息。该名称似乎出现在item数组的第一行和第一项中。之后,使用该名称设置 restore 对象的 Database 属性。 Voilà,如果您只想还原或在您确实不记得其名称的现有数据库之间切换,则无需提供您自己的数据库名称。

警告:仅当您在还原数据库的同一实例中创建数据库时,此方法才有效。如果使用此方法还原从其他位置创建和备份的数据库,则将无法使用,因为您可能需要设置更多属性! 您可能会问哪些属性?您必须去 ItemArray 内部购物。但是,属性之一是数据库需要还原到的位置。您也可以在其中找到位置。说明明显的内容,但请确保计算机上还存在用于存放数据库的文件夹!

无论如何,我尝试了几个数据库,并且对我有用,希望它能对任何人有所帮助!