我正试图通过从数据库读取的信息来填充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访问的每个版本中,所有关系及其附加属性都存储在MSysRelationships
表中。字段grbit
具有关系的所有可能属性的值,即强制引用亲密关系、级联删除、级联更新。该表的其他字段是不言自明的,它们与GetOleDbSchemaTable方法返回的字段相同。
Grbit:的一些有用计算
- 这意味着,如果存在一对一关系,并且"强制引用亲密关系"处于启用状态,则Grbit将为0
- 这意味着,如果存在一对一关系,并且强制引用亲密关系为OFF,则Grbit将为3
- 这意味着,如果存在一对多关系,并且强制引用亲密关系为OFF,则Grbit将为2
- 这意味着,如果存在一对多关系,并且"强制引用亲密关系"为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);
另请参阅:
- 参考GrBit字段的可能值及其含义
- GrBit的计算方法
注意:无法通过GetOleDbSchemaTable
获取MS Access中与关系相关的额外信息。Oledb只是数据库上的一个包装器,而Access
不会将这些信息暴露给外部世界,因此不可能用ADO.net
直接获取信息。
因此,为了解决此问题,您只需要访问和操作MSysRelationships
表的grbit
列信息。
检查此项:http://support.microsoft.com/kb/309681看起来很容易,但我在处理DataTable时也遇到了问题:(