2010-10-05 53 views
4
public void RestoreDatabase(String databaseName, String filePath, 
      String serverName, String userName, String password, String dataFilePath, String logFilePath) 
{ 
    Restore sqlRestore = new Restore(); 
    BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File); 
    sqlRestore.Devices.Add(deviceItem); 
    sqlRestore.Database = databaseName; 
    ServerConnection connection = new ServerConnection(serverName, userName, password); 
    Server sqlServer = new Server(connection); 
    Database db = sqlServer.Databases[databaseName]; 
    sqlRestore.Action = RestoreActionType.Database; 
    String dataFileLocation = dataFilePath; 
    String logFileLocation = logFilePath; 
    db = sqlServer.Databases[databaseName]; 
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation)); 
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation)); 
    sqlRestore.ReplaceDatabase = true; 
    sqlRestore.Complete +=new ServerMessageEventHandler(sqlRestore_Complete); 
    sqlRestore.SqlRestore(sqlServer); 
    db = sqlServer.Databases[databaseName]; 
    db.SetOnline(); 
    sqlServer.Refresh(); 
} 

的恢复在调用此方法还原操作失败,此消息如何使用恢复类Microsoft.SqlServer.Management.Smo命名空间

Restore failed for Server 'MDM04\SQLEXPRESS'.

mdm04是我的计算机名

内例外是

"System.Data.SqlClient.SqlError: Logical file 'vrv' is not part of database 'vrv'. Use RESTORE FILELISTONLY to list the logical file names."

vrv是数据库名称

我应该怎么做来恢复文件

回答

15

问题是在这里

sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation)); 
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation)); 

这里的databaseName手段,以dB为单位的备份文件中指定的数据库的名称。但是你正在指定目标数据库名称。

将其更改为原来的数据库名

这里的示例代码来读取备份文件DB名

DataTable dtFileList = sqlRestore.ReadFileList(serverName); 
string dbLogicalName = dtFileList.Rows[0][0].ToString(); 
string dbPhysicalName = dtFileList.Rows[0][1].ToString(); 
string logLogicalName = dtFileList.Rows[1][0].ToString(); 
string logPhysicalName = dtFileList.Rows[1][1].ToString 
+0

你真棒谢谢你。我整天都在拼命搜索,这是第一次有人指出数据库名称的真正含义。 - 所以后续问题:如何在还原发生后更改逻辑名称? – Colema18 2015-07-24 18:10:26

0

现在转到“浏览”选项卡,然后浏览以下路径 -

Ç :\ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies 或 C:\ Program Files \ Microsoft SQL Server \ 110 \ SDK \ Assemblies

现在选择下列DLL

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.Management.Sdk.Sfc.dll

Microsoft.SqlServer.Smo.dll

Microsoft.SqlServer .SmoExtended.dll

Microsoft.SqlServer.SqlEnum.dll

  public void RestoreDatabase(String databaseName, String filePath, 
     String serverName, String userName, String password, 
     String dataFilePath, String logFilePath) 
     { 
      Restore sqlRestore = new Restore(); 
      BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File); 
      sqlRestore.Devices.Add(deviceItem); 
      sqlRestore.Database = databaseName; 
      ServerConnection connection = new ServerConnection(serverName, userName, password); 
      Server sqlServer = new Server(connection); 
      Database db = sqlServer.Databases[databaseName]; 
      sqlRestore.Action = RestoreActionType.Database; 
      String dataFileLocation = dataFilePath; 
      String logFileLocation = logFilePath; 
      db = sqlServer.Databases[databaseName]; 
      sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation)); 
      sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation)); 
      sqlRestore.ReplaceDatabase = true; 
      sqlRestore.Complete +=new ServerMessageEventHandler(sqlRestore_Complete); 
      sqlRestore.SqlRestore(sqlServer); 
      db = sqlServer.Databases[databaseName]; 
      db.SetOnline(); 
      sqlServer.Refresh(); 
     }