Использование SMO DependencyWalker для загрузки TreeView - PullRequest
3 голосов
/ 04 июля 2010

В приложении Windows Form, используя C #, я хочу программно передать SMO DependencyWalker один объект (таблицу, представление и т. Д.), Обнаружить зависимости, связанные с этим объектом, а затем загрузить WinForms TreeView с результатами, в которых смотрит TreeView.точно так же, как TreeView в диалоговом окне «Просмотр зависимостей» в SQL Server 2008 Management Studio.Хорошим примером может быть просмотр зависимостей таблицы «Сотрудники» в базе данных Northwind с Management Studio.Я использовал что-то вроде приведенного ниже фрагмента кода, чтобы начать:

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 в правильном порядке с правильными отношениями родительского / дочернего узла.Может быть, я поступаю об этом неправильно.Есть ли кто-нибудь, кто смог сделать что-то подобное успешно?

Ответы [ 2 ]

1 голос
/ 09 июня 2017

Я публикую этот ответ, чтобы, возможно, помочь кому-то его искать.

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);
        }
    }
}
0 голосов
/ 22 июля 2010

Насколько я знаю, Ходок Зависимости получает плоский список объектов.Это не рекурсивная или составная «древовидная» структура.Вы должны построить это сами.

...