【问题标题】:ADO.NET GetOleDbSchemaTableADO.NET GetOleDbSchemaTable
【发布时间】:2012-03-11 22:37:34
【问题描述】:

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

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

【问题讨论】:

  • 您需要哪些特定数据库的信息。您是否只需要 PK-FK 关系或检查约束。
  • 对于 MS Access。我需要 PK-FK 关系列表(以及关于它是否强制执行的每个项目信息 - 在 MS Access 中,可以在不强制执行的情况下创建 PK-FK 关系)。
  • 如果我向您提供列名列表,关系中使用的表名以及用于识别关系的真/假是否强制执行。它会起作用还是你需要明确的关系对象。
  • 再查询一次,你使用的是哪个版本的访问权限,即 2003、2007、2010。
  • MS Access 2003。是的,每个关系的强制标志字段(真/假)对我来说就足够了。我试图找到这样的字段,但没有找到我真正想要的(即使是几个字段的组合也不是)。

标签: c# ado.net oledb oledbconnection getschematable


【解决方案1】:

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

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

Grbit 的一些有用计算:

  • 这意味着如果存在一对一关系并且启用引用完整性,则 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 获取信息。

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

【讨论】:

  • 抱歉,我只对显示如何通过 ADO .NET 接口检索此信息的答案感兴趣。
  • @Ruben,除了从 MSysRelationships 获取记录之外,没有其他方法可以获取此信息。您从该表中获得的信息与 GetOleDbSchemaTable 返回的信息相同。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多