首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADO.NET GetOleDbSchemaTable

ADO.NET GetOleDbSchemaTable
EN

Stack Overflow用户
提问于 2012-03-12 06:37:34
回答 2查看 2.9K关注 0票数 2

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

代码语言:javascript
复制
DataTable schemaTable =
    oleconnection.GetOleDbSchemaTable(
        OleDbSchemaGuid.Foreign_Keys,
        new object[] { null, null, tablename });

但是这些信息并没有说明它是真正的外键约束还是仅仅是关系,因此,我不知道应该为DataRelation构造函数(createConstraints)的第四个参数设置什么值。

代码语言:javascript
复制
public DataRelation(
    string relationName,
    DataColumn[] parentColumns,
    DataColumn[] childColumns,
    bool createConstraints
)

特别是在MS Access中,人们可以用关系连接两个表,但不强制执行数据完整性检查。一些额外的研究表明,这种非强制关系也出现在OleDbSchemaGuid.Referential_Constraints模式表中。

我想知道我在哪里可以得到所需的信息。请告诉我去的路线。

EN

回答 2

Stack Overflow用户

发布于 2012-06-16 11:31:14

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

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

Grbit的一些有用的计算:

  • 表示如果存在一对一关系且启用了强制引用完整性,则Grbit将为0。
  • 表示如果存在一对一关系且禁用了强制引用完整性,则Grbit将为3。
  • 表示如果存在一对多关系且禁用了强制引用完整性,则Grbit将为2。
  • 表示如果存在一对多关系且启用了强制引用完整性,则Grbit将为0。

<代码>F211

在c#中访问该表的示例代码:

代码语言:javascript
复制
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中获取与关系相关的额外信息。ADO.net只是数据库上的一个包装器,而Oledb不会将信息暴露给外部世界,因此不可能以直接的方式使用Oledb来获取信息。

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-24 02:09:57

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9659593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档