Comment exécuter cette sauvegarde de base de données et restaurer les scripts à partir de mon application Winform?

StackOverflow https://stackoverflow.com/questions/431033

Question

Je développe une application pour petite entreprise qui utilise la base de données Sqlserver 2005.

Plate-forme: .Net framework 3.5; Type d'application: application Windows; Langue: C #

Question:

Je dois prendre et restaurer la sauvegarde de mon application. J'ai le script requis généré à partir de SSME.

Comment puis-je exécuter ce ou ces scripts particuliers à partir de mon application Winform?

Était-ce utile?

La solution

Vous pouvez exécuter ces scripts de la même manière que vous exécutez une requête, si ce n'est que vous ne vous connectez pas à la base de données que vous souhaitez restaurer, vous vous connectez au maître à la place.

Autres conseils

Si les outils client SQL Server sont installés sur la machine sur laquelle votre application est exécutée, vous pouvez utiliser sqlcmd .

Si vous voulez le faire par programme, vous pouvez utiliser SMO .

Didacticiel

Utilisez simplement votre connexion à la base de données (ADO je présume?) et envoyez vos instructions TSQL au serveur via cette connexion.

Pour la sauvegarde, vous souhaiterez probablement utiliser xp_sqlmaint. Il a la capacité pratique de supprimer les anciennes sauvegardes et crée un fichier journal agréable. Vous pouvez l'appeler via quelque chose comme: EXECUTE master.dbo.xp_sqlmaint N '' - S & Quot; [Nom du serveur] & Quot; [ServerLogonDetails] -D [DatabaseName] -Rpt & "; [BackupArchive] \ BackupLog.txt &"; [RptExpirationSchedule] -CkDB -BkUpDB & Quot; [BackupArchive] & Quot; -BkUpMedia DISK [BakExpirationSchedule] ''

(remplacez les [crochets] par les valeurs appropriées).

Pour la sauvegarde également, vous devrez peut-être sauvegarder le journal des transactions. Quelque chose comme: SI DATABASEPROPERTYEX ((SELECT nom_bd (dbid) FROM maître..sysprocesses WHERE spid = @@ SPID), '' Récupération '') & Lt; & Gt; '' SIMPLE '' EXECUTE master.dbo.xp_sqlmaint N '' -S & Quot; [Nom du serveur] & Quot; [ServerLogonDetails] -D [DatabaseName] -Rpt & Quot; [BackupArchive] \ BackupLog_TRN.txt & Quot; [RptExpirationSchedule] -BkUpLog & Quot; [BackupArchive] & Quot; -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule] ''

Je vous conseillerais de stocker les commandes que vous utilisez dans une table de base de données (1 ligne par commande) et d'utiliser une sorte de schéma de remplacement de modèle pour gérer les valeurs configurables. Cela permettrait de modifier facilement les commandes sans avoir à déployer un nouveau code.

Pour la restauration, vous devrez supprimer toutes les connexions, à l'exception de celles du serveur SQL interne. Prendre les résultats de & Quot; exec sp_who & Quot; et pour les lignes qui correspondent sur nombase et dont le statut n'est pas & "background &"; et une cmd qui n'est pas l'un des & "SIGNAL HANDLER &"; "LOCK MONITOR &", & "LAZY WRITER &", & "LOG WRITER &", & "CHECKPOINT SLEEP &"; faire un " tuer " sur le spid (par exemple: ExecuteNonQuery (" tuer 1283 "))).

Vous voudrez intercepter et ignorer les exceptions de la commande KILL. Vous ne pouvez rien y faire. Si la restauration ne peut pas continuer en raison de connexions existantes, une erreur sera générée.

Le pool de connexions d’ADO (qui concerne davantage les applications asp.net que les applications Windows) constitue un danger. ADO suppose qu'une connexion extraite du pool de connexions est valide ... et qu'elle ne réagit pas correctement aux connexions supprimées. La prochaine opération qui se produit sur cette connexion échouera. Je ne me souviens pas de l'erreur ... vous pourriez peut-être intercepter cette erreur spécifique et la gérer ... également avec la version 3.5, je pense que vous pouvez vider le pool de connexions (donc ... intercepter l'erreur, vider le pool de connexions , ouvrez la connexion, essayez à nouveau la commande ... moche mais peut être faisable).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top