2011-11-29 35 views
3

我編碼在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有一對多的關係,它與表C有一對多的關係,所以我需要按照這個順序得到表名,例如, A然後B然後C.

有沒有辦法做到這一點?
我需要以某種方式檢查主鍵和外鍵,並自己弄清楚這些信息嗎?

回答

0

如果你想按照他們的關係排序表,那麼,是的,你必須自己實現(或找到第三方工具;我不知道有任何)。

請注意,您需要一些策略來處理關係中的週期。

+0

感謝您的回答。我在下面的帖子中實現了一個爲我工作的解決方案。 「關係中的週期」究竟意味着什麼?你能提供一個例子嗎?我不太喜歡數據庫。 – mash

+1

經典示例是僱員表,其中包含一個管理員列,該列是僱員表的外鍵。理論上,循環當然也可以涉及幾個表格(A涉及B涉及與C有關的A)。 – phoog

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); 

爲了讓外鍵關係的列表。這以我需要的順序返回表格,即首先是「父」表格。如果一個表不是另一個表的「父」,即它沒有一個字段是另一個表中的外鍵,那麼它將不會被返回。我同意通過獲取所有數據庫表名,就像我在原始文章中所做的一樣。