如何检索实际的 OleDb table 模式(不包括额外的 table 列)

How to retrieve actual OleDb table schema (excluding additional table columns)

当我 运行 这段代码时,它还会检索 table 中不存在的一些其他字段。我该如何克服这个问题?

Dim conn As New OleDb.OleDbConnection
'Create a connection string for an Access database
Dim strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\check\a.mdb"
'Attach the connection string to the connection object
conn.ConnectionString = strConnectionString
'Open the connection
conn.Open()
Dim Restrictions() As String = {Nothing, Nothing, selected, Nothing}
Dim CollectionName As String = "Columns"
Dim dt As DataTable = conn.GetSchema(CollectionName, Restrictions)
For Each TableRow As DataRow In dt.Rows
    ComboBox1.Items.Add(TableRow.Item("COLUMN_NAME"))

另外检索到的列是:

1.ID
2.Date 创建
3.Date更新
4.Id
5.Lv
6.Name
7.parent 身份证
8.Type
9.GUID
10.Id

...还有 6 个。原始架构仅包含 5 个字段。

在循环 table 行之前,您需要识别数据表的 valid/permanent 列。

为此,您应该首先浏览数据table 对象的列集合。通过检查 properties of each one of these columns,您将能够识别临时的。我猜它可能隐藏在 DataColumn 对象的 'extended properties' 的某处。

为了识别正确的属性,你会经历这样的事情(写在飞...):

For each tableColumn as DataColumn in dt.Columns
    Console.WriteLine(tableColumn.[propertyName].ToString())
    ...
Next

我不知道哪一个属性会让您知道该列是否是原始 table 字段的一部分。您将不得不猜测和测试才能找到它。一旦确定,您就知道如何 select 将要添加到组合框的行。

您的问题很简单,当您将变量 selected 插入 Restrictions() 数组时,它的值为 Nothing。当我 运行 以下代码时,我只获得名为 [new]:

的 table 的列名称
Option Strict On

Imports System.Data.OleDb

Module Module1

    Sub Main()
        Dim connStr As String =
                "Provider=Microsoft.ACE.OLEDB.12.0;" &
                "Data Source=C:\Users\Public\test\so34490626\a.mdb"
        Using conn As New OleDbConnection(connStr)
            conn.Open()
            Dim selected As String = "new"
            Dim Restrictions() As String = {Nothing, Nothing, selected, Nothing}
            Dim CollectionName As String = "Columns"
            Dim dt As DataTable = conn.GetSchema(CollectionName, Restrictions)
            For Each TableRow As DataRow In dt.Rows
                Console.WriteLine(TableRow.Item("COLUMN_NAME"))
            Next
        End Using
    End Sub

End Module

结果是:

GENDER
MEMBER OF RISHI PRASAD
NAME OF SADHAK
PROFESSION

但是,当selected的值为Nothing ...

Dim selected As String = Nothing

...我得到了您描述的"extra"列

DateCreate
DateUpdate
Id
Lv
Name
ParentId
Type
Attributes
DataType
FieldName
IndexType
SkipColumn
SpecID
Start
Width
DateDelim
DateFourDigitYear
DateLeadingZeros
DateOrder
DecimalPoint
FieldSeparator
FileType
SpecID
SpecName
SpecType
StartRow
TextDelim
TimeDelim
GENDER
MEMBER OF RISHI PRASAD
NAME OF SADHAK
PROFESSION

如果我将 Console.WriteLine 更改为包含 table 名称,原因就会揭晓:

Console.WriteLine("[{0}].[{1}]", TableRow.Item("TABLE_NAME"), TableRow.Item("COLUMN_NAME"))

然后我们看到:

[MSysAccessStorage].[DateCreate]
[MSysAccessStorage].[DateUpdate]
[MSysAccessStorage].[Id]
[MSysAccessStorage].[Lv]
[MSysAccessStorage].[Name]
[MSysAccessStorage].[ParentId]
[MSysAccessStorage].[Type]
[MSysIMEXColumns].[Attributes]
[MSysIMEXColumns].[DataType]
[MSysIMEXColumns].[FieldName]
[MSysIMEXColumns].[IndexType]
[MSysIMEXColumns].[SkipColumn]
[MSysIMEXColumns].[SpecID]
[MSysIMEXColumns].[Start]
[MSysIMEXColumns].[Width]
[MSysIMEXSpecs].[DateDelim]
[MSysIMEXSpecs].[DateFourDigitYear]
[MSysIMEXSpecs].[DateLeadingZeros]
[MSysIMEXSpecs].[DateOrder]
[MSysIMEXSpecs].[DecimalPoint]
[MSysIMEXSpecs].[FieldSeparator]
[MSysIMEXSpecs].[FileType]
[MSysIMEXSpecs].[SpecID]
[MSysIMEXSpecs].[SpecName]
[MSysIMEXSpecs].[SpecType]
[MSysIMEXSpecs].[StartRow]
[MSysIMEXSpecs].[TextDelim]
[MSysIMEXSpecs].[TimeDelim]
[new].[GENDER]
[new].[MEMBER OF RISHI PRASAD]
[new].[NAME OF SADHAK]
[new].[PROFESSION]

"MSys*" table 是系统 table,在 Access 用户界面中默认隐藏。