SMO Sample # 2 : Balade dans les API / Récupérer pour une table, les tables dépendantes

Publié le par Renaud Harduin

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();



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 :

 

  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();


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 :

Nous avons 2 enfants , "SalesOrderDetails" tout d'abord :

et ensuite "SalesOrderHeaderSalesReason" :

Code source sur : www.codeplex.com/BILab sous $/POC/BILabHistory
Publicité

Publié dans SMO

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article