Domanda

Sto sviluppando un'applicazione per piccole imprese che utilizza il database Sqlserver 2005.

Piattaforma: .Net framework 3.5; Tipo di applicazione: applicazione Windows; Lingua: C #

Domanda:

Devo prendere e ripristinare il backup dalla mia applicazione. Ho lo script richiesto generato da SSME.

Come posso eseguire quel particolare script (o script) dalla mia applicazione winform?

È stato utile?

Soluzione

Puoi eseguire questi script nello stesso modo in cui esegui una query, solo che non ti connetti al database che desideri ripristinare, invece ti colleghi al master.

Altri suggerimenti

Se sul computer su cui è in esecuzione l'applicazione sono installati gli strumenti client di SQL Server, è possibile utilizzare sqlcmd .

Se vuoi farlo in modo programmatico puoi usare SMO

Tutorial

Usa semplicemente la tua connessione al database (presumo ADO?) e invia le tue semplici istruzioni TSQL al server attraverso questa connessione.

Per il backup probabilmente si desidera utilizzare xp_sqlmaint. Ha la pratica capacità di rimuovere i vecchi backup e crea un bel file di registro. Puoi chiamarlo tramite qualcosa del tipo: EXECUTE master.dbo.xp_sqlmaint N '' - S & Quot; [ServerName] & Quot; [ServerLogonDetails] -D [DatabaseName] -Rpt & Quot; [BackupArchive] \ BackupLog.txt & Quot; [RptExpirationSchedule] -CkDB -BkUpDB & Quot; [BackupArchive] & Quot; -BkUpMedia DISK [BakExpirationSchedule] ''

(sostituisce le [parentesi quadre] con valori adeguati).

Anche per il backup potrebbe essere necessario eseguire il backup del registro delle transazioni. Qualcosa di simile a: SE DATABASEPROPERTYEX ((SELECT db_name (dbid) FROM master..sysprocesses WHERE spid = @@ SPID), '' Recovery '') & Lt; & Gt; '' SEMPLICE '' ESEGUI master.dbo.xp_sqlmaint N '' -S & Quot; [ServerName] & Quot; [ServerLogonDetails] -D [DatabaseName] -Rpt & Quot; [BackupArchive] \ BackupLog_TRN.txt & Quot; [RptExpirationSchedule] -BkUpLog & Quot; [BackupArchive] & Quot; -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule] ''

Consiglio di archiviare i comandi effettivi che si stanno utilizzando in una tabella del database (1 riga per comando) e di utilizzare una sorta di schema di sostituzione del modello per gestire i valori configurabili. Ciò consentirebbe facili modifiche ai comandi, senza la necessità di distribuire un nuovo codice.

Per il ripristino dovrai eliminare tutte le connessioni tranne quelle interne al server sql. Praticamente prendi i risultati di & Quot; exec sp_who & Quot; e per le righe che corrispondono a dbname e hanno uno stato che non è " background " ;, e un cmd che non è uno di " SIGNAL HANDLER " ;, quot; LOCK MONITOR " ;, " LAZY WRITER " ;, " LOG WRITER " ;, " CHECKPOINT SLEEP " fai un " uccidi " sullo spid (es: ExecuteNonQuery (" kill 1283 ")).

Ti consigliamo di intercettare e ignorare eventuali eccezioni dal comando KILL. Non c'è niente che tu possa fare al riguardo. Se il ripristino non può continuare a causa di connessioni esistenti, verrà generato un errore.

Un pericolo con l'uccisione delle connessioni è il pool di connessioni di ADO (più per le app asp.net che le app di windows). ADO presuppone che una connessione recuperata dal pool di connessioni sia valida ... e non reagisce bene alle connessioni che sono state interrotte. L'operazione successiva che si verifica su quella connessione fallirà. Non riesco a ricordare l'errore ... potresti essere in grado di intercettare solo quell'errore specifico e gestirlo ... anche con 3.5 Penso che puoi svuotare il pool di connessioni (quindi ... intercettare l'errore, svuotare il pool di connessioni , apri la connessione, prova di nuovo il comando ... brutto ma potrebbe essere fattibile).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top