conn.GetSchema 查找表的主键 - MsAccess

Posted

技术标签:

【中文标题】conn.GetSchema 查找表的主键 - MsAccess【英文标题】:conn.GetSchema find primary key of table - MsAccess 【发布时间】:2017-09-04 05:22:21 【问题描述】:

我有一个位于 D 盘的 MsAccess 数据库 (.mdb) (D:\project.mdb)。 数据库有 120 多个表。有一个表Records,它有主键和多个字段。我想获取 Columns、ColumnType 和 PrimaryKey。

我正在使用以下方法获取字段及其类型:

Dim TableNm_ As String = "Records"      
Dim restrictions2() As String = Nothing, Nothing, TableNm_, Nothing 
Dim DataTable2 As System.Data.DataTable = conn.GetSchema("Columns", restrictions2)

但它没有 PrimayKey 列。

我浏览了几篇 SO 帖子和其他类似 GetSchema and PrimaryKey column 的帖子。但我想创建一个命令和 Reader 来读取密钥。

有没有办法只使用 conn.GetSchema 获取表 Records 的 PrimayKey 列?

【问题讨论】:

连接不知道表的架构。但是使用 DataReader,您可以使用 .GetSchemaTable 方法。 【参考方案1】:

您可以使用Connection.GetOleDbSchemaTable 并传递 PrimaryKeys SchemaGuid。 对 TableName 应用限制为:

DataTable2 = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, New String() Nothing, Nothing, TableNm_) 
For Each TableRow As DataRow In DataTable2.Rows
    If TableRow.Item("PK_NAME").ToString.ToLower = "PrimaryKey".ToLower Then
        Dim  PrimaryKey = TableRow.Item("COLUMN_NAME")
        Dim Ordinal = CShort(TableRow.Item("ORDINAL"))
    End If
Next

【讨论】:

【参考方案2】:

你可以从Kros.Utils.MsAccess使用DatabaseSchema

using(var cn = new OleDbConnection("MS Access Connection String"))
  
  DatabaseSchema schema = DatabaseSchemaLoader.Default.LoadSchema(cn);
  Assert.IsFalse(schema.Tables["Person"].Columns["Id"].AllowNull);

包含有关表、列、索引...的信息

【讨论】:

以上是关于conn.GetSchema 查找表的主键 - MsAccess的主要内容,如果未能解决你的问题,请参考以下文章

无法从Oracle数据库中检索表列表 - conn.GetSchema(“Tables”)

如何在数据库C#中查找表的主键

ORACLE: 查询(看)表的主键外键唯一性约束和索引

oracle怎么查询所有的表有没有主键

如何更新一个主键是另一个表的主键的表?

Oracle修改一个已经存有数据的表的主键