Ho un DB SQL 2008. Sto facendo funzionare una forma che sostiene quel DB in su, quindi prova ad aggiornarlo. Se l'aggiornamento fallisce l'idea è di ripristinare quel backup. Ecco il codice che sto usando per ripristinare il backup.Come ripristinare un database da 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();
}
il problema sembra essere il fatto che i nomi dei file che scelgo sono diverse da DB online. Fondamentalmente voglio sostituire il database sul server con il backup. Ricevo un'eccezione quando chiamo SqlRestore.
La principale eccezione dice
{ "Ripristino non riuscito per Server 'localhost'."}
Scavando nelle eccezioni interne mostra questi errori
verificata un'eccezione durante l'esecuzione di un'istruzione o batch Transact-SQL.
e poi
di file logico 'DB' non fa parte della database 'DB'. Utilizzare RESTORE FILELISTONLY per elencare il file logico nomi. \ R \ nRESTORE DATABASE è terminato in modo anomalo.
Suppongo che ci sia un modo per dire questo per usare solo sostituire il DB esistente così com'è.
Uso questo bit di codice per ottenere il percorso del file del DB in modo che una directory esegua il dump del backup. Forse questo potrebbe essere usato per far ricreare i nomi dei file.
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;
}
Non è necessario spostare i file se si ripristina da un backup dello stesso db sullo stesso computer.Il riposizionamento è necessario solo quando si spostano e si copiano i database tramite backup/ripristino. –
Ok, ecco alcuni suggerimenti: per quanto riguarda il percorso del file di backup prestare sempre attenzione se il file esiste realmente nella cartella di origine. Per quanto riguarda il trasferimento, potrebbe essere un problema di autorizzazione scrivere file mdf. Prestare attenzione se la propria app ha il permesso di leggere il file .bak, in questo caso controllare il gestore della configurazione SQL: il servizio MSSQLServer deve essere in esecuzione con l'utente LocalSystem. –