2009-01-10 4 views
0

Je développe une application de petite entreprise qui utilise la base de données Sqlserver 2005.Comment exécuter cette sauvegarde de base de données et restaurer des scripts à partir de mon application winform?

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 exécuter ce (s) script (s) particulier (s) à partir de mon application WinForm?

+0

Je ne sais pas ce que vous entendez par SSME, mais je vois deux possibilités (peut-être tort): - Soit vous parlez d'un script SQL - Ou un autre script qui sera exécuté par un moteur de script Je pense que nous avons besoin de plus de détails. – TimothyP

+0

SSME = SQL Server Management Studio Express Désolé pour l'abréviation erronée. :-) –

Répondre

1

Vous pouvez exécuter ces scripts de la même manière que vous exécutez une requête. Si vous ne vous connectez pas à la base de données que vous souhaitez restaurer, vous vous connectez à master à la place.

0

Si la machine sur laquelle votre application est exécutée dispose des outils client SQL Server, vous pouvez utiliser sqlcmd.

0

Si vous voulez le faire programatically vous pouvez utiliser SMO

Tutorial

0

Il suffit d'utiliser votre connexion à la base de données (ADO je présume?) Et d'envoyer vos instructions TSQL simples au serveur via cette connexion.

0

Pour la sauvegarde, vous voulez probablement utiliser xp_sqlmaint. Il a la capacité pratique de supprimer les anciennes sauvegardes, et il crée un joli fichier journal. Vous pouvez l'appeler via quelque chose comme: EXECUTER master.dbo.xp_sqlmaint N '' - S "[NomServeur]" [ServerLogonDetails] -D [DatabaseName] -Rpt "[BackupArchive] \ BackupLog.txt" [RptExpirationSchedule] -CkDB - BkUpDB "[BackupArchive]" -BKUpMedia DISK [BakExpirationSchedule] ''

(remplacez les [crochets] par des valeurs appropriées). Pour la sauvegarde, vous devrez peut-être sauvegarder le journal des transactions. Quelque chose comme: IF DATABASEPROPERTYEX ((SELECT nom_base (dbid) FROM master..sysprocesses WHERE spid = @@ SPID), '' Récupération '') > '' SIMPLE '' EXÉCUTER master.dbo.xp_sqlmaint N '' -S "[ServerName]" [ServerLogonDetails] -D [DatabaseName] -RPT "[BackupArchive] \ BackupLog_TRN.txt" [RptExpirationSchedule] -BkUpLog "[BackupArchive]" -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule] ''

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

Pour la restauration, vous devrez supprimer toutes les connexions sauf celles du serveur SQL interne. Fondamentalement, prenez les résultats de "exec sp_who" et pour les lignes qui correspondent à dbname, et avoir un statut qui n'est pas "background", et un cmd qui n'est pas un de "SIGNAL HANDLER", "LOCK MONITOR", "LAZY WRITER" , "LOG WRITER", "CHECKPOINT SLEEP" faire un "kill" sur le spid (par exemple: ExecuteNonQuery ("kill 1283")).

Vous voudrez piéger et ignorer les exceptions de la commande KILL. Il n'y a rien que tu puisses faire à leur sujet. Si la restauration ne peut pas se poursuivre en raison des connexions existantes, une erreur se produit.

Un danger avec des connexions mortelles est le pool de connexions ADO (plus pour les applications asp.net que pour les applications Windows).ADO suppose que la connexion récupérée à partir du pool de connexions est valide ... et qu'elle ne réagit pas correctement aux connexions qui ont été supprimées. L'opération suivante qui se produit sur cette connexion échouera. Je ne peux pas me rappeler l'erreur ... vous pourriez piéger juste cette erreur spécifique et la manipuler ... aussi avec 3.5 je pense que vous pouvez vider le pool de connexion (ainsi ... attrapez l'erreur, videz le pool de connexion , ouvrez la connexion, essayez à nouveau la commande ... moche mais pourrait être faisable).

+0

Merci, pour l'aide détaillée. J'apprécie vraiment que vous alliez à la profondeur du sujet. Honnêtement, mon problème a été résolu par la première réponse indiquant "Si vous voulez le faire par programme, vous pouvez utiliser SMO". Néanmoins, votre réponse a sa propre valeur. –

+1

Bien .. SMO est bien ... tant que les objets SMO sont installés sur la même machine que votre programme. Et l'utilisation directe des objets SMO ne vous donne pas le bon vieillissement automatique des fichiers de sauvegarde et des rapports. – user53794

Questions connexes