2012-03-11 38 views
2

我想通過信息填充DataRelation集合,從數據庫中讀取數據。ADO.NET GetOleDbSchemaTable

DataTable schemaTable = 
    oleconnection.GetOleDbSchemaTable(
     OleDbSchemaGuid.Foreign_Keys, 
     new object[] { null, null, tablename }); 

但這個信息不說任何事情是真實的外鍵約束或只是關係,也正因爲如此,我不知道什麼樣的價值,爲的DataRelation構造函數的第四個參數設置(createConstraints) 。

public DataRelation(
    string relationName, 
    DataColumn[] parentColumns, 
    DataColumn[] childColumns, 
    bool createConstraints 
) 

特別是,在MS Access中,可以通過關係連接兩個表,但不強制執行數據完整性檢查。一些額外的研究表明,這種非強制關係也出現在OleDbSchemaGuid.Referential_Constraints模式表中。

我想知道在哪裏可以獲得所需的信息。請告訴我方式。

+0

針對特定的數據庫,你需要他的信息你只需要PK-FK關係或檢查約束 – 2012-06-14 10:06:36

+0

對於MS。 Access。我需要PK-FK關係列表(並且對於每個項目信息都是強制的 - 在MS Access中,可以創建PK-FK關係而無需強制執行) – Ruben 2012-06-15 05:28:07

+0

如果我提供列名稱列表,關係和真/假來標識關係是否被強制執行或者你需要明確的關係對象 – 2012-06-15 07:23:55

回答

3

使用Ado.Net無法獲取MSAccess中與關係相關的其他屬性。只有在使用DAO的VBA中才有可能。

所有關係及其附加屬性都存儲在每個ms-access版本的MSysRelationships表中。字段grbit具有關係的所有可能屬性的值,即,強制引用的完整性,級聯刪除,級聯更新。此表的其他字段是自解釋的,這些字段與GetOleDbSchemaTable方法返回的字段相同。

爲Grbit一些有用的計算:

  • 這意味着如果有一對一的關係與實施參照Intigrity是上然後Grbit將爲0
  • 這意味着如果有一對一的關係與實施參照Intigrity是OFF則Grbit將3.
  • 這意味着如果存在一對多的關係和實施參照Intigrity是OFF則Grbit將2.
  • 這意味着如果存在一對多的關係和實施參照Intigrity是ON,則Grbit將爲0

示例代碼以訪問在c#表:

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\mydb.mdb;"); 
con.Open(); 
OleDbDataAdapter da = new OleDbDataAdapter("Select * From MSysRelationships", con); 
DataSet ds = new DataSet(); 
da.Fill(ds); 

參見:

注意:無法通過GetOleDbSchemaTable獲取與MS-Access中關係有關的額外信息。 Oledb是僅在數據庫上的包裝,並且Access沒有將這些信息暴露給外部世界,因此無法直接通過ADO.net獲取信息。

因此,對於解決方法,您只需要訪問和操縱grbit列信息MSysRelationships表。

+0

對不起,我只對答案感興趣,顯示如何通過ADO .NET接口檢索這些信息。 – Ruben 2012-06-16 12:42:08

+0

@Ruben除了從MSysRelationships中獲取記錄外,沒有其他方法可以獲取這些信息。您從GetOleDbSchemaTable返回的表中獲取相同的信息。 – 2012-06-16 15:06:43