2009-09-23 19 views
14

Ich habe eine SQL 2008 DB. Ich führe ein Formular aus, das diese Datenbank sichert und dann versucht, sie zu aktualisieren. Wenn das Update fehlschlägt, besteht die Idee darin, diese Sicherung wiederherzustellen. Hier ist der Code, den ich verwende, um die Sicherung wiederherzustellen.Wiederherstellen einer Datenbank von C#

Das Problem scheint zu sein, dass die Dateinamen, die ich wähle, sich von der Online DB unterscheiden. Ich möchte im Grunde die Datenbank auf dem Server durch die Sicherung ersetzen. Ich bekomme eine Ausnahme, wenn ich SqlRestore anrufe.

Die wichtigste Ausnahme, sagt

{ "für Server Wiederherstellung fehlgeschlagen 'localhost'."}

die inneren Ausnahmen Graben in diese Fehler zeigt

Eine Ausnahme ist aufgetreten während der Ausführung von eine Transact-SQL-Anweisung oder einen Batch.

und dann

Logische Datei 'DB' ist nicht Teil der Datenbank 'DB'. Verwenden Sie RESTORE FILELISTONLY, um die logische Datei Namen aufzulisten. \ R \ nRESTORE DATABASE ist , die abnormal beendet wird.

Ich nehme an, es gibt eine Möglichkeit, dies zu sagen, nur die vorhandene DB zu ersetzen, wie es ist.

Ich benutze dieses Bit des Codes, um den Dateipfad der DB zu erhalten, um ein Verzeichnis zu haben, um die Sicherung auszugeben. Vielleicht könnte dies verwendet werden, um die Dateinamen neu zu erstellen.

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; 
} 

Antwort

18

änderte ich meinen Rücken und Restore-Funktionen wie folgt aussehen:

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); 
} 

So können sie nur verwenden, was Dateien vorhanden sind. Es gibt keine Anweisungen mehr zum Verschieben von Dateien.

+3

Sie müssen Dateien nicht verschieben, wenn Sie eine Sicherungskopie derselben Datenbank auf demselben Computer wiederherstellen.Relocate wird nur benötigt, wenn Datenbanken durch Backup/Restore verschoben und kopiert werden. –

+3

Ok, hier ein paar Tipps: Was den Pfad der Backup-Datei anbetrifft, sollte man immer darauf achten, ob die Datei tatsächlich in Ihrem Quellordner existiert. In Bezug auf die Verlagerung könnte es ein Berechtigungsproblem sein, eine MDF-Datei zu schreiben. Achten Sie darauf, ob Ihre App die Berechtigung zum Lesen der .bak-Datei hat, überprüfen Sie in diesem Fall den SQL-Konfigurationsmanager: Der MSSQLServer-Dienst muss unter LocalSystem-Benutzer ausgeführt werden. –

4

Sie fügen RelocateFile Optionen basierend auf dem Datenbanknamen, das ist falsch. Sie sollten sie basierend auf dem logischen Dateinamen für jede verschobene Datei hinzufügen. Verwenden Sie Restore.ReadFileList, um die Liste der logischen Dateinamen abzurufen.

+0

Es scheint, als ob ich diese Optionen nicht alle zusammen hinzufügen kann. –

12

Danke Remus für deine Antwort!

Ich habe

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

diese beiden Linien zu

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)); 

und mein Code läuft erfolgreich.

Danke für die Unterstützung!

+0

@Pallavi Ihre Lösung funktionierte sofort für mich .. Aber ich kann die Lösung nicht verstehen, Würden Sie bitte Ihre Lösungsantwort einreichen. –

+1

Diese Lösung war auch perfekt für mich. Für diejenigen, die mehr wollen, was localRestoreFiles hält, ist die Quellendatenbank "Dateiliste". Die Dateiliste dieser Datenbank, z. B. alle erstellten MDF-, Protokoll- und Indexdateien. Aber diese Rows [X] Nummern nehmen an, dass Sie eine normale DB mit nur 1 MDF und 1 LDF (z. B. keine zusätzlichen Protokolle oder Indexdateien) haben. Wenn dies der Fall ist, enthält Zeilen [0] die erste MDF-Datei, Zeilen [1] wird die Protokolldatei. Und Zeilen [0] [0] und Zeilen [1] [0] enthalten den Namen der logischen Datenbank (das ist die Groß-/Kleinschreibung!), Mit der Sie "verschieben" können. – eduncan911

Verwandte Themen