Using SMO DependencyWalker to load a TreeView

In a Windows Forms application, using C #, I want to programmatically pass a single object (table, view, etc.) to the DependencyWalker SMO, find the dependencies associated with this object, and then load the WinForms TreeView with the results that the TreeView looks exactly like same as TreeView in the View Dependencies dialog box in SQL Server 2008 Management Studio. A good example would be to view the dependencies of the Employees table in the Northwind database using Management Studio. To get started, I used something like the snippett code below:

UrnCollection col = new UrnCollection(); 

foreach (Table table in database.Tables) {
    if(table.Name == "Employees")
       col.Add(table.Urn); 
}

DependencyTree tree = sp.DiscoverDependencies(col, DependencyType.Children); 
DependencyWalker walker = new DependencyWalker(server); 
DependencyCollection depends = walker.WalkDependencies(tree); 

//Iterate over each table in DB in dependent order... 
foreach (DependencyCollectionNode dcn in depends)

, TreeView, , "" SMO, TreeView parent/child node. , . -, - ?

+3
2

, - .

DependencyCollection - , DependencyWalker .

FirstChild NextSibling .

:

private void button2_Click(object sender, EventArgs e)
{
    String srvName = "xxxxxxxxxxxxx";
    String dbName = "yyyyy";
    Server srv = new Server(new ServerConnection() { ServerInstance = srvName });
    Database db = srv.Databases[dbName];

    DependencyWalker dependencyWalker = new DependencyWalker(srv);
    DependencyTree dependencyTree = dependencyWalker.DiscoverDependencies(
        new Urn[] { db.StoredProcedures["test", "dbo"].Urn }, DependencyType.Parents);

    var dep = new DependencyPrinter(dependencyTree);
    treeView1.Nodes.Clear();
    dep.PrintDependency2(treeView1);
    treeView1.ExpandAll();
}

class DependencyPrinter
{
    private DependencyTree _dependencyTree;
    public DependencyPrinter(DependencyTree dependencyTree)
    {
        _dependencyTree = dependencyTree;
    }

    public void PrintDependency2(TreeView treeView)
    {
        var n = treeView.Nodes.Add("");
        AddToTreeNode(n, _dependencyTree.FirstChild);
    }

    private void AddToTreeNode(TreeNode treeNode, DependencyTreeNode node)
    {
        treeNode.Text = String.Format("({0}).{1}.{2}.{3}"
            , node.Urn.Type
            , node.Urn.XPathExpression.GetAttribute("Name", "Database")
            , node.Urn.XPathExpression.GetAttribute("Schema", node.Urn.Type)
            , node.Urn.XPathExpression.GetAttribute("Name", node.Urn.Type));

        if (node.FirstChild != null)
        {
            var n = treeNode.Nodes.Add("");
            AddToTreeNode(n, node.FirstChild);
        }

        if (node.NextSibling != null)
        {
            var n = treeNode.Parent.Nodes.Add("");
            AddToTreeNode(n, node.NextSibling);
        }
    }
}
+2

, Dependency Walker .
.
.

0

Source: https://habr.com/ru/post/1753055/


All Articles