从 bak 文件中检索数据库名称
Posted
技术标签:
【中文标题】从 bak 文件中检索数据库名称【英文标题】:Retrieving database name from bak file 【发布时间】:2011-05-09 18:38:12 【问题描述】:我有一个包含数据库备份的 bak 文件。
我想将此数据库恢复到一个新位置,我需要从该文件中检索数据库名称,知道该怎么做吗?
我需要它来覆盖数据文件位置和日志文件位置。
感谢您的帮助。
【问题讨论】:
【参考方案1】: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#
【讨论】:
你没有说你想以编程方式进行。 我正在将数据库恢复到不同的地方,所以我应该覆盖 mdf 和 ldf 文件。为此,我需要从我的 bak 文件中获取数据库名称。我不知道我的 bak 文件中的数据库是什么。 你的第一个链接正是我需要的。【参考方案2】:我能够以一种非常老套和不确定的方式获得数据库的名称。但是,这对我来说真的很有效,无论如何我只是在一个小型测试和开发工具中使用它。
如果你的答案和米奇小麦一样,你需要做的是:
紧接着
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 中获取信息。该名称似乎出现在第一行和项目数组的第一项中。之后,使用此名称设置 restore 对象的 Database 属性。瞧,如果您只是想恢复或在您不记得名称的现有数据库之间切换,则无需提供您自己的数据库名称。
警告:这仅适用于您的数据库是在您要恢复它的同一实例中创建的。如果您使用此方法来恢复从其他地方创建和备份的数据库,它将不起作用,因为您可能需要设置更多属性! 您可能会问哪些属性?您将不得不在 ItemArray 中为自己购物。然而,属性之一是数据库需要恢复到的位置。你也可以在那里找到位置。显而易见,但请确保您的计算机上也存在数据库所在的文件夹!
无论如何,我用几个数据库尝试了这个,这对我有用,希望它可以帮助任何人!
【讨论】:
以上是关于从 bak 文件中检索数据库名称的主要内容,如果未能解决你的问题,请参考以下文章
从 Java 中检索具有国际名称的 MS Access 列(编码)