按序号获取Access数据库中的所有表

4

我正在使用C#编写与Access数据库相关的代码...

我可以使用以下代码获取我的Access数据库中的所有表:

DataTable dataTbl;
DataView dvCols;
DataRowView drvCols;

...

dataTbl = m_connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
    new Object[] { null, null, null, "TABLE" });
dvCols = new DataView(dataTbl);

for (int j = 0; j < dvCols.Count; j++)
{
    drvCols = dvCols[j];
    tableName = drvCols.Row["TABLE_NAME"].ToString();
    // ...
}

问题在于此代码按字母顺序获取表名。现在,如果我要阅读特定表中的列,我可以使用序号位置进行排序。
dvCols.Sort = "ORDINAL_POSITION";

然而,使用表格是不可能的,毕竟没有顺序位置。我的表格之间有关系,例如,表A与表B存在一对多的关系,表B与表C也存在一对多的关系,以此类推...因此我需要按照这个顺序获取表格名称,例如,先是A,然后是B,然后是C。

有什么方法可以做到这一点吗?
我是否需要检查主键和外键,并自己找出这些信息?

2个回答

1

好的,我想通了。 我最终做的是以下内容:

               dataTable_ForeignKeys = 
                m_connection.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, null);

                //Check if a DataTable object is initialized
                if (dataTable_ForeignKeys != null)
                {
                    // iterate and get the names
                    foreach (DataRow row in dataTable_ForeignKeys.Rows)
                    {
                        tableName = row["PK_TABLE_NAME"].ToString();
                        tblNames.Add(tableName);

获取外键关系列表。此操作返回了我所需的表的顺序,即首先是“父”表。如果一个表不是另一个表的“父”表,即它没有在另一个表中作为外键的字段,则它将不会被返回。我通过在原帖中获取所有数据库表名来解决了这个问题。

0
如果您想按照它们之间的关系排序表格,那么需要自己实现(或找到第三方工具,我不知道有哪些可行的选项)。
请注意,您需要处理关系中的循环的策略。

谢谢你的回答。我在下面的帖子中实现了一个对我有效的解决方案。您所说的“关系中的循环”是什么意思?能提供一个例子吗?我不怎么使用数据库。 - mash
1
经典的例子是一个员工表,其中包含一个经理列,该列是指向员工表的外键。当然,在理论上,这个循环也可能涉及多个表(A相关到B相关到C相关到A)。 - phoog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接