2

我正在尝试通过从数据库中读取的信息填充 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 模式表中。

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

4

2 回答 2

3

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

MSysRelationships在每个版本的 ms-access 中,所有关系及其附加属性都存储在表中。该字段grbit具有关系的所有可能属性的值,即强制参照完整性、级联删除、级联更新。该表的其他字段不言自明,与 GetOleDbSchemaTable 方法返回的字段相同。

对Grbit 的一些有用计算:

  • 这意味着如果存在一对一关系并且 Enforce Referential Intigrity 处于启用状态,则 Grbit 将为 0。
  • 这意味着如果存在一对一关系并且 Enforce Referential Intigrity 为 OFF,则 Grbit 将为 3。
  • 这意味着如果存在一对多关系并且 Enforce Referential Intigrity 为 OFF,则 Grbit 将为 2。
  • 这意味着如果存在一对多关系并且 Enforce Referential 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);

也可以看看:

注意:在 MS-Access 中无法通过GetOleDbSchemaTable. Oledb 只是数据库上的包装器,Access不会将这些信息暴露给外部世界,因此无法ADO.net直接获取信息。

因此,对于解决方法,您只需要访问和操作表grbit的列信息MSysRelationships

于 2012-06-16T03:31:13.647 回答
0

检查这个: http: //support.microsoft.com/kb/309681 似乎很容易,但我在处理 DataTable 时也遇到了问题 :(

于 2013-01-23T18:09:56.853 回答