ADO.NET GetOleDbSchemaTable

时间:2012-03-11 22:37:34

标签: c# ado.net oledb oledbconnection getschematable

我正在尝试通过信息填充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模式表中。

我想知道在哪里可以获得所需信息。请告诉我。

2 个答案:

答案 0 :(得分:3)

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

所有关系及其附加属性都存储在每个ms-access版本的MSysRelationships表中。字段grbit具有关系的所有可能属性的值,即Enforce Referential Intigrity,Cascade Delete,Cascadde Update。该表的其他字段是自解释的,与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);

另见:

注意:无法通过GetOleDbSchemaTable获取与MS-Access中的关系相关的额外信息。 Oledb只是数据库中的包装器,Access没有向外界公开信息,因此无法直接获取ADO.net的信息。

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

答案 1 :(得分:0)

检查一下:http://support.microsoft.com/kb/309681 看起来很简单但我在处理DataTable时遇到了问题:(