簡體   English   中英

使用 C# (SMO) 使用 FILESTREAM 數據還原數據庫的最佳方法

[英]Best way to restore a database with FILESTREAM data using C# (SMO)

我正在編寫一個簡單的 C# 應用程序,它允許用戶通過選擇數據庫的路徑並為數據庫提供一個新名稱來恢復數據庫 - 我的問題是;

  1. 恢復功能仍會查找生成備份的路徑並失敗
  2. 數據庫備份包含 FILESTREAM 數據並且也失敗,因為我似乎也無法解釋/或重新定位該數據。

代碼 C#

    Restore dbRestore = new Restore();
    BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
    dbRestore.Devices.Add(deviceItem);
    dbRestore.Database = databaseName;

    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);

    Database db = sqlServer.Databases[databaseName];
    dbRestore.Action = RestoreActionType.Database;
    String dataFileLocation = dataFilePath + databaseName + ".mdf";
    String logFileLocation = logFilePath + databaseName + "_Log.ldf";
    db = sqlServer.Databases[databaseName];
    DataTable dtFileList = dbRestore.ReadFileList(sqlServer);
    string dbLogicalName = dtFileList.Rows[0][0].ToString();
    string logLogicalName = dtFileList.Rows[1][0].ToString();
    dbRestore.RelocateFiles.Add(new RelocateFile(dbLogicalName, dataFileLocation));
    dbRestore.RelocateFiles.Add(new RelocateFile(logLogicalName + "_log", logFileLocation));
    dbRestore.ReplaceDatabase = true;

    dbRestore.dbRestore(sqlServer);
    db = sqlServer.Databases[databaseName];
    db.SetOnline();
    sqlServer.Refresh();
}
catch (Exception ex)
{
    Console.Write(ex.ToString());

    MessageBox.Show(ex.Message, "This is exception for testing");
}

錯誤

拋出異常:Microsoft.SqlServer.SmoExtended.dll 中的“Microsoft.SqlServer.Management.Smo.FailedOperationException” Microsoft.SqlServer.Management.Smo.FailedOperationException:服務器“SERVERNAME”的還原失敗。 ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:執行 Transact-SQL 語句或批處理時發生異常。 ---> System.Data.SqlClient.SqlException: 邏輯文件“DatabaseDemo_4do6_EM_INDEXGROUP_log”不是數據庫“NewDatabaseName”的一部分。 使用 RESTORE FILELISTONLY 列出邏輯文件名。 RESTORE DATABASE 異常終止。 在 Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException) 在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType, Boolean retry) ---內部異常堆棧跟蹤結束 --- 在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType, Boolean retry) at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionTypes executionType,布爾重試)在 Microsoft.SqlServer.Management.Smo.BackupRestoreBase.ExecuteSql(服務器服務器,StringCollection 查詢)在 Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(服務器 srv)
--- 內部異常堆棧跟蹤結束 --- 在 Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv) 程序“[14052] OPSAdmin.exe”已退出,代碼為 -1 (0xffffffff)。

問題

  1. 我怎樣才能有效地做到這一點並考慮文件流數據
  2. 我的“RelocateFiles”功能有什么問題。

謝謝。!!

您需要定義單獨的變量來保存 Filestream 文件組名稱。

String fileStreamFGPhysicalPath = dataFilePath + databaseName;
string fileStreamFGLogicalName;
string dbLogicalName;
string logLogicalName;

您需要遍歷數據表以識別文件流邏輯名稱。 您可以使用 FileType 列來識別它。

 DataTable dtFileList = dbRestore.ReadFileList(sqlServer);

 Foreach(DataRow dr in dtFileList)
{
   switch (dr["Type"])
    {     
     case "D":
      dbLogicalName = dr["LogicalName"].ToString();
      break;
     case "L":
      logLogicalName = dr["LogicalName"].ToString();
      break;
     case "S":
      fileStreamFGLogicalName= dr["LogicalName"].ToString();
      break;
    }
}

現在,也為文件流定義重定位文件。

dbRestore.RelocateFiles.Add(new RelocateFile(dbLogicalName, dataFileLocation));
dbRestore.RelocateFiles.Add(new RelocateFile(logLogicalName + "_log", logFileLocation));
dbRestore.RelocateFiles.Add(new RelocateFile(fileStreamFGLogicalName , fileStreamFGPhysicalPath ));

注意:這里我只考慮了三個文件:數據、日志、文件流。 您可能有多個數據文件。 因此,您需要將數據文件名稱設為數組,並在 Relocatefiles 中相應地移動它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM