我正在尝试通过从数据库中读取的信息来填充DataRelation集合。

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模式表中。

我想知道在哪里可以获取所需信息。请给我指路。

最佳答案

使用Ado.Net无法获取与MSAccess中的关系相关的其他属性。仅在使用DAO的VBA中才有可能。

在所有版本的ms-access中,所有关系及其附加属性都存储在MSysRelationships表中。字段grbit具有关系的所有可能属性的值,即,强制引用Intigrity,级联删除,级联更新。该表的其他字段不言自明,与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);


也可以看看:


Refer possible values of GrBit field and their meaning
How GrBit is calculated


注意:无法通过GetOleDbSchemaTable在MS-Access中获取与关系有关的额外信息。 Oledb仅是数据库的包装程序,并且Access不会将其信息公开给外部世界,因此无法直接使用ADO.net来获取信息。

因此,要解决此问题,您只需访问和操作grbit表的MSysRelationships列信息。

09-25 18:31