如何检索实际的OleDb表模式(不包括其他表列)

时间:2015-12-28 09:10:41

标签: vb.net ms-access oledb getschema

当我运行此代码时,它还会检索表中不存在的其他一些字段。我怎么能克服这个?

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.日期更新
4.Id
5.Lv
6.Name
7.parent Id
8.Type
9.GUID
10.Id

......还有6个。原始模式仅包含5个字段。

2 个答案:

答案 0 :(得分:1)

您的问题很简单,当您将变量selected插入Nothing数组时,变量Restrictions()的值为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 。当我运行以下代码时,我只获得名为[new]的表的列名:

GENDER
MEMBER OF RISHI PRASAD
NAME OF SADHAK
PROFESSION

结果是:

selected

但是,当Nothing的值为Dim selected As String = Nothing ...

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

如果我更改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]

然后我们看到:

HttpRequestMessage

“MSys *”表是默认情况下在Access用户界面中隐藏的系统表。

答案 1 :(得分:0)

在循环表行之前,您需要识别dataTable的有效/永久列。

为此,您应首先浏览数据表对象的列集合。通过检查properties of each one of these columns,您将能够识别临时的。我猜它可能隐藏在扩展属性的某个地方。 DataColumn对象。

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

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

如果列是原始表字段的一部分,我不确切知道哪个属性会告诉您。你必须猜测和测试才能找到它。一旦识别出来,您就会知道如何选择要添加到组合框中的行。