我自己学习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
答案 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)
您的代码中存在两个问题。
GetSchema仅返回数据库的表详细信息。这
信息不包含列详细信息。过滤掉系统
表必须使用GetSchema()的其他重载。你可以
指定表类型筛选条件。限制中的“表”
引用用户创建的表。其他值为“SYSTEM TABLE,ACCESS
表,表“。
应将列添加为父树节点的子节点。
建议:使用调试可视化工具识别表中可用的数据。
示例代码,
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();
}
}