如果您用 C# 这样做, 而物理路径不同, 您需要使用重新定位文件, 正如这里提到的一个答案一样 。
在多数情况下,假定下列守则有效,则以下守则将有效:
您只是从别处恢复数据库备份, 否则就意味着要完全相同。 例如, 制作副本到本地 DB 。
您没有使用非典型的数据库布局, 例如行文件分布在多个磁盘上的多个文件 。
此外,以下只是第一次恢复时需要的。 一旦一个成功恢复发生, 以下的文件映射将会在 Sql 服务器中为您设置。 但是, 第一次 — 将一个 Bak 文件恢复为空白的 db, 您基本上必须说, “ 是的, 使用 Db 默认的 Db 文件, 本地位置, 而不是吓跑 ” 。 您需要告诉它, 将事情保留在同一个地方, 奇怪的是, 告诉它要迁移它们 :
var dbDataFile = db.FileGroups[0].Files[0];
restore.RelocateFiles.Add(new RelocateFile(dbDataFile.Name, dbDataFile.FileName));
var dbLogFile = db.LogFiles[0];
restore.RelocateFiles.Add(new RelocateFile(dbLogFile.Name, dbLogFile.FileName));
为了更好地澄清典型案例是什么, 以及如何恢复, 这里为本地机器恢复. bak文件的典型代码 :
var smoServer = new Microsoft.SqlServer.Management.Smo.Server(
new Microsoft.SqlServer.Management.Common.ServerConnection(sqlServerInstanceName));
var db = smoServer.Databases[dbName];
if (db == null)
{
db = new Microsoft.SqlServer.Management.Smo.Database(smoServer, dbName);
db.Create();
}
restore.Devices.AddDevice(backupFileName, DeviceType.File);
restore.Database = dbName;
restore.FileNumber = 0;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;
var dbDataFile = db.FileGroups[0].Files[0];
restore.RelocateFiles.Add(new RelocateFile(dbDataFile.Name, dbDataFile.FileName));
var dbLogFile = db.LogFiles[0];
restore.RelocateFiles.Add(new RelocateFile(dbLogFile.Name, dbLogFile.FileName));
restore.SqlRestore(smoServer);
db.SetOnline();
smoServer.Refresh();
db.Refresh();
无论您是否手动恢复了 DB, 是否手动创建了这个 DB, 是否只用名称而没有数据, 或者什么都不做, 这个代码都会有效 - 由完全空白的机器开始, 仅安装了 Sql 服务器, 没有任何数据库 。