【问题标题】:How to retrieve Primary Key metadata in ADO.NET 4?如何在 ADO.NET 4 中检索主键元数据?
【发布时间】:2011-01-24 01:02:34
【问题描述】:

我正在尝试使用 ADO.NET 4 检索数据库中所有表的主键元数据。

GetSchema() 方法可以让您提取大量元数据,包括索引和外键,但没有任何东西可以识别主键。对我来说,这似乎是一个明显的遗漏,我想一定是我错过了什么!

据我所知,似乎有两种“解决方法”(至少对于 SQL Server):

  • 使用 SqlDataReader ExecuteReader() KeyInfo 选项;或
  • 使用 SqlDataAdapter.Fill(dataTable) 方法,然后在返回的 dataTable 上使用 KeyInfo 属性。

谁能告诉我是否有一种干净的标准方法来识别数据库中的所有主键并检索它们的元数据,该方法适用于所有数据提供者实现(包括 Oracle、DB2、MySql)?

【问题讨论】:

    标签: mysql sql-server visual-studio oracle ado.net


    【解决方案1】:

    您可以从information_schema.table_constraints检索主键:

    select c.constraint_name, c.table_name, k.column_name
    from   information_schema.table_constraints as c
    join   information_schema.key_column_usage as k
    on     c.constraint_catalog = k.constraint_catalog 
           and c.constraint_schema = k.constraint_schema 
           and c.constraint_name = k.constraint_name 
    where  c.constraint_type = 'primary key'
           and c.table_name = 'YourTable'
    

    【讨论】:

    • 加入 constraint_catalog 而不是 table_catalog 对我有用
    【解决方案2】:

    GetSchema 上的 MSDN 页面和集合 PrimaryKeys。但是它不适用于 SQL Server,正如它在顶部所说的那样

    某些架构集合不完整,例如 SQL Server,它不包含主键集合。

    事实上,阅读它意味着GetSchema作为跨数据库模式检索的手段并不可靠。

    大多数主要 RDBMS 支持的另一个选项是查询所有主键的 information_schema。

    select *
    from information_schema.TABLE_CONSTRAINTS
    where CONSTRAINT_TYPE = 'PRIMARY KEY'
    

    您可以按仓位顺序将其加入到 KEY_COLUMN_USAGE 列中

    select PK.TABLE_SCHEMA, PK.TABLE_NAME, C.ORDINAL_POSITION, C.COLUMN_NAME
    from information_schema.TABLE_CONSTRAINTS PK
    inner join information_schema.KEY_COLUMN_USAGE C
        on C.TABLE_SCHEMA = PK.TABLE_SCHEMA
        and C.TABLE_CATALOG = PK.TABLE_CATALOG
        and C.TABLE_NAME = PK.TABLE_NAME
    where PK.CONSTRAINT_TYPE = 'PRIMARY KEY'
    

    请注意,尽管 information_schema 有很好的支持,但它可能在一些小方面有所不同。在 SQL Server 中,table_catalog (=db name) 始终限于当前 db,而在 MySQL 中,它将从任何目录 (db) 返回表,因此您可能需要目录过滤器才能准确。

    【讨论】:

    • AFAIK GetSchema() 不检索主键信息
    • Social.MSDN 引用中的代码不起作用,因为“PrimaryKeys”不是有效的架构集合。也许 Sebastijan 正在使用伪代码来说明他所追求的。 XDevCom 的想法似乎是一个依赖名称格式的组合。
    • MSDN 页面似乎表明确实如此
    • 哇! MSDN ref 包含一条语句“某些架构集合不完整,例如 SQL Server,它不包含主键集合”(VS2008)。哎呀。 MS 不认为有人会对主键感兴趣吗??
    • 你是对的。所以它适用于某些产品(主键是有效的,只是不适用于 SQL Server)但不适用于他们自己的..
    【解决方案3】:

    是否有统一的 API 来获取所有后端的所有元数据(包括主键信息) - 答案是否定的

    理想情况下,每个后端的 DbConnection.GetSchema 覆盖应该提供各种集合来获取所有可能的元数据,但遗憾的是情况并非如此。我通常按​​顺序使用以下方法

    1. 带有适当架构集合的 GetSchema 方法
    2. 系统存储过程(如果可用)。 (sys.sp_primarykeys 等)
    3. 查询系统视图(INFORMATION_SCHEMA.KEY_COLUMN_USAGE 等)
    4. 如果所有信息在单个视图中不可用,则使用自定义查询查询系统视图

    对于 Sql Server 2005 及更高版本,我使用了系统存储过程 - sys.sp_primary_keys_rowset2

    如果需要,我还将提供其他后端的信息。

    【讨论】:

    • 感谢 alwayslearning。在这个阶段,看起来我们将使用 Java/JDBC 解决方案向前发展,我们认为我们会遇到更少的连接性和一致性问题。对我们来说,所有主要数据库供应商之间的简单和无忧连接是最不令人意外的。 1 个要求。
    【解决方案4】:

    有一个库,Kailua - The forgotten methods in the ADO.NET API. ,确实为排名前 5 的供应商提供了此元数据和其他元数据。此信息是特定于供应商的。

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2021-03-25
      • 2012-09-26
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多