| « SMO Sample #2bis : Recherche des dépendances et restitution | SMO (SQL Management Object) Sample : balade dans les API / connexion et liste des bases » |
SMO Sample # 2 : Récupérer les tables dépendantes
Toujours dans la série SMO, je souhaite maintenant créer un arbre objet qui me donnera pour une table, sa clef (primaire ou composée), les tables qui dépendent de cette pk directement .
j'ai donc rajouté à mon objet TablePath une méthode AnalyseDatabaseBy :
132 public TablePath AnalyseDatabaseBy(string tableName,string schema)
133 {
134 /* Sets main information */
135 this.TableName = tableName;
136 this.Schema = schema;
137
138 /* Build a representation of any PrimaryKey */
139 ColumnCollection cols = _database.Tables[tableName, schema].Columns;
je fixe en passant le schema et le nom de la table en cours. (Mon idée derrière est de travailler par la suite récursif).
Deuxième étape : j'ai besoin de garder la ou les clefs de la tables via InPrimaryKey
Cette information ne se retrouve pas directement, il faut itérer dans les colonnes et "noter" les colonnes contributives, en testant InPrimaryKey :
138 /* Build a representation of any PrimaryKey */
139 ColumnCollection cols = _database.Tables[tableName, schema].Columns;
140 StringBuilder sb = new StringBuilder();
141 foreach (Column col in cols)
142 {
143 if (col.InPrimaryKey)
144 {
145 sb.Append("[");
146 sb.Append(col.Name);
147 sb.Append("]");
148 }
149 }
150 this._primaryKey = sb.ToString();
>>
Fragment-->
Troisième étape : trouver la liste des tables dépendantes via EnumForeignKeys
J'ai caché toute cette logique sous la forme d'une fonction qui exploite la méthode EnumForeignKeys() d'objet
Table. Ci dessous la fin de la méthode AnalyseDatabaseBy () et l'appel à LookForChilds():
153 this._childs = this.lookForChilds(this);
154
155 return this;
156 }
>
>Examinons le corps de la méthode LookForChilds :
>
e="margin: 0px;"> 158 private List<TablePath> lookForChilds( TablePath parent)
159 {
160 List<TablePath> ltp = new List<TablePath>();
161
162 DataTable dt = _database.Tables[parent.TableName,parent.Schema].EnumForeignKeys();
>
tyle="font-size: 10pt;">La méthode EnumForeignKeys() nous renvoie un DataTable contenant la liste des tables liées, leur schema et la foreignkey concernée. Ci dessous un screenshot de l'enum en mode debug :
Nous rajoutons donc les enfants sous la forme d'une liste :
163 foreach (DataRow dr in dt.Rows)
164 {
165 TablePath tp = new TablePath();
166 tp._database = parent._database;
167 tp._server = parent._server;
168 tp.TableName = dr[1].ToString();
169 tp.Schema = dr[0].ToString();
170 ltp.Add(tp);
171 }
172 return ltp;
173 }
AnalyseDatabaseBy in action !
Appliqué dans notre IHM à AdventureWorks et à la table SalesOrderDetails :
54 state = _tp.ConnectToDatabase(@".\BILAB2008","AdventureWorks",ServerAuthMode.Integrated,null,null);
55 _tp = _tp.AnalyseDatabaseBy("SalesOrderHeader","Sales");
Quickwatch du TablePath _tp :
>
tyle="font-size: 10pt;">Nous avons 2 enfants , "SalesOrderDetails" tout d'abord :

et ensuite "SalesOrderHeaderSalesReason" :

Code source sur : www.codeplex.com/BILab</a> sous $/POC/BILabHistory