Mam SQL 2008 DB. Uruchamiam formularz, który wykonuje kopię DB, a następnie próbuje ją zaktualizować. Jeśli aktualizacja się nie powiedzie, chodzi o przywrócenie tej kopii zapasowej. Oto kod, którego używam do przywrócenia kopii zapasowej.Jak przywrócić bazę danych z C#
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();
}
Kwestia wydaje się, że wybrane przeze mnie nazwy różnią się od DB online. Zasadniczo chcę zastąpić bazę danych na serwerze kopią zapasową. Dostaję wyjątek, gdy zadzwonię do SqlRestore.
Głównym wyjątkiem mówi
{ "Przywracanie nie powiodło się dla serwera 'localhost'."}
Kopanie do wewnętrznej wyjątki przedstawiono te błędy
wystąpił wyjątek podczas wykonywania Transact-SQL lub partia.
a następnie
Logical plik 'DB' nie jest częścią bazy danych 'DB'. Użyj RESTORE FILELISTONLY, aby wyświetlić nazwy plików logicznych . \ R \ nRESTORE DATABASE to niepoprawnie.
Zakładam, że istnieje sposób, aby powiedzieć, aby po prostu użyć zastąpić istniejący DB, jak jest.
Używam tego fragmentu kodu, aby uzyskać ścieżkę do pliku bazy danych, aby mieć katalog do zrzutu kopii zapasowej. Może to może być użyte do uzyskania nazw plików do odtworzenia.
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;
}
Nie musisz przenosić plików, jeśli przywrócisz kopię zapasową tej samej bazy danych na tym samym komputerze.Przeniesienie jest potrzebne tylko podczas przenoszenia i kopiowania baz danych poprzez tworzenie kopii zapasowych/przywracanie. –
OK, oto kilka wskazówek: w odniesieniu do ścieżki pliku kopii zapasowej zawsze zwracaj uwagę, jeśli plik naprawdę istnieje w twoim folderze źródłowym. Jeśli chodzi o przenoszenie, może to być problem z uprawnieniami do zapisu pliku mdf. Zwróć uwagę, czy Twoja aplikacja ma uprawnienia do odczytu pliku .bak, w tym przypadku sprawdź Menedżera konfiguracji SQL: Usługa MSSQLServer musi działać pod kontrolą użytkownika LocalSystem. –