使用用户创建的表及其列填充树视图

时间:2015-04-28 17:54:13

标签: c# .net treeview database-schema

我自己学习C#和.NET。我正在尝试学习如何使用GetSchema

我想做的是:

打开MS Access数据库并使用数据库架构填充树视图控件。我想用父用户创建的表名填充父节点,他们的子节点将包含列名。

我试图调整我上面链接的代码示例但是失败了。

以下是代码:

using (OleDbConnection OleDBConnection = new OleDbConnection())
{
    OleDBConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
        "Data Source=" + databaseLocation + ";Persist Security Info=False;";

    try
    {
        OleDBConnection.Open();
        // get database schema
        DataTable dataTable = OleDBConnection.GetSchema("Tables");
        // clear the treeview
        TreeView.Nodes.Clear();
        // here I tried to populate the treeview but have failed
        foreach (System.Data.DataRow row in dataTable.Rows)
        {
            // add parent node -> table name
            TreeView.Nodes.Add(row["TABLE_NAME"].ToString());
            // now add children -> all table columns
            foreach(DataColumn column in dataTable.Columns)
            {
                TreeView.Nodes.Add(column.ColumnName);
            }
        }
        // all done, close the connection
        OleDBConnection.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        Application.Exit();
    }
}

在Northwind数据库上测试时得到的结果如下:

- Customers
    - TABLE_CATALOG
    - TABLE_SCHEMA
    - TABLE_NAME
    - TABLE_TYPE
    - TABLE_GUID
    - DESCRIPTION
    - TABLE_PROPID
    - DATE_CREATED
    - DATE_MODIFIED
- Employees
    - TABLE_CATALOG
    - TABLE_SCHEMA
    - TABLE_NAME
    - TABLE_TYPE
    - TABLE_GUID
    - DESCRIPTION
    - TABLE_PROPID
    - DATE_CREATED
    - DATE_MODIFIED 
...

上述结果的问题在于它还包括非用户创建的表作为父节点,并且我没有从这些表中获取列名(相反,我得到每个表的TABLE_CATALOG等等。)

问题:

如何将用户创建的表加载为父节点,并添加包含这些表列名称的子节点?

我再次道歉,如果解决方案是微不足道的,但请记住,这是我第一次尝试,因为我刚刚开始使用C#和.NET

2 个答案:

答案 0 :(得分:1)

这应该做你想要的。您可能希望花时间检查表和列DataTables中的数据。它们并不像您期望的那样。

    public static TreeView PopulateTreeViewWithSchema(System.Data.OleDb.OleDbConnection conn, TreeView tree)
    {
        if (tree == null)
            tree = new TreeView();

        // get database schema
        DataTable tableTable = conn.GetSchema("Tables");
        DataTable columnsTable = conn.GetSchema("Columns");

        // clear the treeview
        tree.Nodes.Clear();
        // here I tried to populate the treeview but have failed
        foreach (System.Data.DataRow row in tableTable.Rows)
        {
            // add parent node -> table name
            string tableName = row["TABLE_NAME"].ToString();
            if (!tableName.StartsWith("MSys"))
            {
                TreeNode node = new TreeNode(tableName);
                tree.Nodes.Add(node);
                // now add children -> all table columns
                foreach (System.Data.DataRow columnRow in columnsTable.Rows)
                {
                    if (columnRow["TABLE_NAME"].ToString().Equals(tableName))
                    {
                        node.Nodes.Add(columnRow["COLUMN_NAME"].ToString());
                    }
                }
            }
        }
        return tree;
    }

答案 1 :(得分:1)

您的代码中存在两个问题。

  1. GetSchema仅返回数据库的表详细信息。这
    信息不包含列详细信息。过滤掉系统
    表必须使用GetSchema()的其他重载。你可以
    指定表类型筛选条件。限制中的“表” 引用用户创建的表。其他值为“SYSTEM TABLE,ACCESS
    表,表“。

  2. 应将列添加为父树节点的子节点。

  3. 建议:使用调试可视化工具识别表中可用的数据。

    示例代码,

    using (OleDbConnection OleDBConnection = new OleDbConnection())
    {
        OleDBConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
            "Data Source=" + databaseLocation + ";Persist Security Info=False;";
    
        try
        {
            OleDBConnection.Open();
    
            string[] restrictions2 = new string[] { null, null, null, "TABLE" };
            System.Data.DataTable DataTable2 = OleDBConnection.GetSchema("Tables", restrictions2);
    
            // clear the treeview
            treeView1.Nodes.Clear();
            // here I tried to populate the treeview but have failed
            foreach (System.Data.DataRow row in DataTable2.Rows)
            {
                // add parent node -> table name
                var parent = treeView1.Nodes.Add(row["TABLE_NAME"].ToString());
                // now add children -> all table columns
    
                string[] restrictions1 = new string[] { null, null, (string)row["TABLE_NAME"], null };
                System.Data.DataTable DataTable1 = OleDBConnection.GetSchema("Columns", restrictions1);
    
                foreach (DataRow row1 in DataTable1.Rows)
                {
                    parent.Nodes.Add((string)row1["COLUMN_NAME"]);
                }
            }
            // all done, close the connection
            OleDBConnection.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            Application.Exit();
        }
    }