15

SQL2008DBがあります。そのDBをバックアップするフォームを実行してから、それを更新しようとしています。更新が失敗した場合は、そのバックアップを復元することをお勧めします。これが私がバックアップを復元するために使用しているコードです。

public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password)
{
    Restore sqlRestore = new Restore();
    BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.File);
    sqlRestore.Devices.Add(deviceItem);
    sqlRestore.Database = databaseName;
    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);
    sqlRestore.Action = RestoreActionType.Database;

    string logFile = System.IO.Path.GetDirectoryName(backUpFile);
    logFile = System.IO.Path.Combine(logFile, databaseName + "_Log.ldf");

    string dataFile = System.IO.Path.GetDirectoryName(backUpFile);
    dataFile = System.IO.Path.Combine(dataFile, databaseName + ".mdf");

    Database db = sqlServer.Databases[databaseName];
    RelocateFile rf = new RelocateFile(databaseName, dataFile);
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFile));
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFile));
    sqlRestore.SqlRestore(sqlServer);
    db = sqlServer.Databases[databaseName];
    db.SetOnline();
    sqlServer.Refresh();
}

問題は、私が選んだファイル名がオンラインDBと異なることのようです。基本的に、サーバー上のデータベースをバックアップに置き換えたいと思います。SqlRestoreを呼び出すと例外が発生します。

主な例外は言う

{"サーバー'localhost'の復元に失敗しました。"}

内部の例外を掘り下げると、これらのエラーが表示されます

Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。

その後

論理ファイル「DB」はデータベース「DB」の一部ではありません。RESTORE FILELISTONLYを使用して、論理ファイル名を一覧表示します。\ r \nRESTOREDATABASEが異常終了しています。

既存のDBをそのまま使用するように指示する方法があると思います。

このコードを使用して、バックアップをダンプするディレクトリを持つDBのファイルパスを取得します。たぶん、これを使用してファイル名を再作成することができます。

public string GetDBFilePath(String databaseName, String userName, String password, String serverName)
{
    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);
    Database db = sqlServer.Databases[databaseName];
    return sqlServer.Databases[databaseName].PrimaryFilePath;
}
4

3 に答える 3

21

バックアップと復元機能を次のように変更しました。

public void BackupDatabase(SqlConnectionStringBuilder csb, string destinationPath)
{
    ServerConnection connection = new ServerConnection(csb.DataSource, csb.UserID, csb.Password);
    Server sqlServer = new Server(connection);

    Backup bkpDatabase = new Backup();
    bkpDatabase.Action = BackupActionType.Database;
    bkpDatabase.Database = csb.InitialCatalog;
    BackupDeviceItem bkpDevice = new BackupDeviceItem(destinationPath, DeviceType.File);
    bkpDatabase.Devices.Add(bkpDevice);
    bkpDatabase.SqlBackup(sqlServer);
    connection.Disconnect();

}

public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password)
{
    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);
    Restore rstDatabase = new Restore();
    rstDatabase.Action = RestoreActionType.Database;
    rstDatabase.Database = databaseName;
    BackupDeviceItem bkpDevice = new BackupDeviceItem(backUpFile, DeviceType.File);
    rstDatabase.Devices.Add(bkpDevice);
    rstDatabase.ReplaceDatabase = true;
    rstDatabase.SqlRestore(sqlServer);
}

そうすれば、そこにあるファイルをそのまま使用できます。ファイルを再配置するディレクティブはなくなりました。

于 2009-09-23T15:46:25.993 に答える
12

ご回答ありがとうございます。

修正しました

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

この2行で

System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer);
sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation));
sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation));

私のコードは正常に実行されています。

ご支援ありがとうございます!

于 2010-12-03T05:23:35.820 に答える
5

RelocateFileデータベース名に基づいてオプションを追加していますが、これは正しくありません。再配置された各ファイルの論理ファイル名に基づいて、それらを追加する必要があります。Restore.ReadFileList論理ファイル名のリストを取得するために使用します。

于 2009-09-23T15:22:46.010 に答える