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