| « SMO Sample # 2 : Récupérer les tables dépendantes | Welcome 2009 & MVP 2008 » |
SMO (SQL Management Object) Sample : balade dans les API / connexion et liste des bases
Je vais vous proposer une série de sample afin d'illuster l'utilisation de SMO (SQL Server Management Object) dans le cadre d'un système de sauvegarde de données de base à base, en suivant l'arbre des dépendances (techniques ou fonctionelles) du modèle physique.
J'aurais pu faire un simple package SSIS à cet effet, mais dans la pratique les modèles de donnée changent régulièrement, donc SSIS s'adapate mal car cela supposera de maintenir les métadonnées :(
Il s'agit donc de créer dynamiquement ces packages, tout un programme...
Le code source du projet est sur www.codeplex.com/bilab</a> sous $/POC/BILABHistory/
Dans ce projet, je m'appuie sur une classe clef "TablePath". Elle embarquera toute la logique.
SMO est une API qui permet de se balader dans un SQL Server. Pour se connecter, il faudra passer par la classe Server :
sqlserver =
new Server(sc);
Commençons par du basique : afin de récupérer l'arbre des dépendances, je vous propose déjà de se connecter et de récupérer la liste des bases existantes dans l'instance concernée. C'est que fait la méthode GetDatabaseList :
27 public List<string> GetDatabaseList(string server, ServerAuthMode mode, string user, string password)
28 {
29 List<string> dblist = new List<string>();
30 ServerConnection sc = null;
31 Server sqlserver;
32
33 log.Info("connecting");
34
35
36 // Sets appropriate connections proerties accordign db context
37 if (mode == ServerAuthMode.SqlServer)
38 {
39 sc = new ServerConnection(server, user, password);
40 }
41 else if (mode == ServerAuthMode.Integrated)
42 {
43 sc = new ServerConnection(server);
44 }
45
46
47 try
48 {
49 sqlserver = new Server(sc);
50 log.Info("Creating db list");
51 foreach (Database db in sqlserver.Databases)
52 {
53 log.Info("adding " + db.Name + " to the list ");
54 dblist.Add(db.Name);
55 }
56 }
57 catch (Exception e)
58 {
59 log.Debug("Error obtaining database list connecting : " + e.Message);
60 }
61 finally
62 {
63 sc = null;
64 _server = null;
65 }
66
67 return dblist;
68 }
1 commentaire
Pour la connection , je préfère utiliser la suite
SqlConnection ==> ServerConnection ==> Server
( j'utilise SqlConnection.Open() ).
En cas d'erreur, il est plus facile d'obtenir des informations importances à partir du traitement d'une SqlException ( si mes souvenirs sont bons, on peut même détecter avec ErrorCode si le SQL Server Server est en cours d'exécution, quoique que je préfère m'appuyer sur les classes ManagedComputer et Services pour connaître l'état d'un service SQL Server ).
Je vais aller faire un tour sur codeplex pour le code complet
Félicitations pour cette bonne idée ( je ne connaissais que 2 blogs sur SMO ceux de Jens Suessmeyer et Michiel Worries tous deux de Microsoft qui semblaient s'intéresser à SMO )