2008-09-15 15 views
6

Sto scrivendo un'applicazione C# che scarica un backup del database compresso tramite FTP. L'applicazione deve quindi estrarre il backup e ripristinarlo nella posizione predefinita del database.C# SQL Ripristina il database nel percorso dati predefinito

Non saprò quale versione di SQL Server verrà installata sulla macchina su cui viene eseguita l'applicazione. Pertanto, ho bisogno di trovare la posizione predefinita in base al nome dell'istanza (che si trova nel file di configurazione).

Gli esempi che ho trovato tutti avevano una chiave di registro che leggevano, ma questo non funzionerebbe, poiché questo presuppone che sia installata una sola istanza di SQL.

Un altro esempio che ho trovato ha creato un database, letto le proprietà del file del database e l'eliminazione del database una volta eseguito. È semplicemente ingombrante.

Ho trovato qualcosa nel framework .NET che dovrebbe funzionare, vale a dire:

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile

Il problema è che questo sta tornando stringhe vuote, che non aiuta.

Devo anche trovare l'account NT con cui è in esecuzione il servizio SQL, in modo che possa concedere l'accesso in lettura a tale utente sul file di backup una volta che l'ho estratto.

risposta

7

Quello che ho scoperto è che

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile 

restituisce solo non nullo quando non v'è alcun percorso definito esplicitamente. Non appena si specifica un percorso che non è l'impostazione predefinita, questa funzione restituisce il percorso correttamente.

Quindi, una soluzione semplice era verificare se questa funzione restituisce una stringa o null. Se si restituisce una stringa, quindi utilizzare tale, ma se è null, utilizzare

Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\" 
+0

Immagino che abbia funzionato per te. Ho provato questo stesso comando ma non funziona. Getto un'eccezione su "Impossibile connettersi a MYCOMPUTERNAME". Non penso che sia un problema con il firewall. Forse l'ambito del permesso? ServerName è una stringa, corretta? Sarebbe meglio (nuovo Microsoft.SqlServer.Management.Smo.Server (yourServerName)). Information.RootDirectory? –

+0

Brillante! Ho scavato per questo per qualche giorno. – StarPilot

1

Un'opzione, che potrebbe essere una soluzione più semplice, consiste nel creare un nuovo database sul server di destinazione e quindi eseguire il RIPRISTINO su quel database con il backup. Il tuo backup sarà nel posto giusto e non dovrai preoccuparti di "MOVING" il file di backup quando lo ripristini. SQL si aspetta che i backup vengano ripristinati esattamente nello stesso percorso fisico da cui è stato eseguito il backup. Se questo non è il caso devi usare l'opzione MOVE durante RESTORE. Questa soluzione semplifica inoltre la ridenominazione del database nel processo se, ad esempio, si desidera aggiungere una data al nome.

+0

Questa è una buona idea, ma io non voglio usare i nomi predefiniti per il file LDF e MDF. Voglio che abbiano un datestamp incluso. Per fare questo, dovrei specificare i nomi dei file quando creo il database temporaneo, che mi riporta al bisogno del percorso predefinito. – RichieACC

+0

Un trucco che potrebbe funzionare per te è creare il database con un nome che includa il timestamp completo e quindi rinominare il DB con qualsiasi cosa debba essere. Rinominare il DB non cambia il nome del file.In questo modo i file vengono creati con il nome corretto. –

+0

Darrel, per specificare il nome file, è necessario specificare il percorso completo. SQL non sembra avere alcun concetto di percorsi relativi. – RichieACC

4

Un modo sarebbe utilizzare la stessa posizione del database master. È possibile eseguire una query sull'istanza di SQL Server per il seguente SQL:

select filename from master.dbo.sysdatabases where name = 'master' 

Ciò restituirà il percorso completo del database master. Con quel percorso, puoi usare l'oggetto FileInfo per estrarre solo la porzione di directory di quel percorso. Ciò evita il lavoro di verifica del controllo del registro per l'istanza di SQL Server a cui si sta tentando di connettersi.

+0

Ciò non restituirà necessariamente lo stesso risultato del percorso predefinito. Il percorso predefinito può essere modificato dopo la creazione del database master e il database master non deve spostarsi con esso. – RichieACC

+0

In tal caso, sarà necessario leggere la chiave di registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.X, dove X è il numero dell'istanza e verificare se DefaultData e DefaultLog sono stati definiti. –

+0

Come sapresti che stai guardando il numero di istanza corretto? Tutto ciò su cui devo lavorare è il nome dell'istanza. Non avrò accesso alla macchina oltre al mio codice che è in esecuzione su di essa. – RichieACC

Problemi correlati