Я пытаюсь перечислить столбцы в таблице Access в том порядке, в котором они появляются в данных, а не в алфавитном порядке.

Это первый метод, который я попробовал. Он получает столбцы в алфавитном порядке.

Public Const adSchemaColumns = 4
Public Const adSchemaTables = 20

Dim oConn, oRecs
Set oConn = CreateObject("ADODB.Connection")
Set oRecs = CreateObject("ADODB.Recordset")

oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='C:\whatever.mdb'"
Set oRecs = oConn.OpenSchema(adSchemaTables)

Do Until oRecs.EOF
    sTableName = oRecs("TABLE_NAME")

    If UCase(oRecs("TABLE_TYPE")) = "TABLE" Then
        Dim oTable
        Set oTable = oConn.OpenSchema(adSchemaColumns, Array(Null, Null, sTableName))

        Do Until oTable.EOF
            WScript.Echo oTable("COLUMN_NAME")
            oTable.MoveNext
        Loop

        Set oTable = Nothing
    End If

    oRecs.MoveNext
Loop

oRecs.Close
oConn.Close
Set oRecs = Nothing
Set oConn = Nothing

Я также пробовал использовать каталоги, таблицы и столбцы ADOX, но в нем все также расположено в алфавитном порядке. Итак, если таблица с именем Table1 имеет столбцы B, A, C в этом порядке, оба метода, которые я пробовал, распечатают A B C вместо B A C.

Может кто-нибудь пролить некоторый свет на это?

1
Alex A. 19 Мар 2014 в 02:06

2 ответа

Лучший ответ

Набор записей из adSchemaColumns дает вам поля COLUMN_NAME и ORDINAL_POSITION. Таким образом, вы можете загрузить значения этих полей в Scripting.Dictionary, а затем просмотреть словарь в порядке ORDINAL_POSITION и .Echo COLUMN_NAME.

Вот пример VBScript для столбцов в одной таблице.

Option Explicit
Public Const adSchemaColumns = 4
Dim cn, rs, dct, i

Set dct = CreateObject("Scripting.Dictionary")
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source='C:\share\Access\database1.mdb'"
Set rs = cn.OpenSchema(adSchemaColumns, _
    Array(Null, Null, "tblFoo"))

With rs
    Do While Not .EOF
        dct.Add .Fields("ORDINAL_POSITION").Value, _
            .Fields("COLUMN_NAME").Value
        .MoveNext
    Loop
    .Close
End With

For i = 1 To dct.Count
    WScript.Echo dct(i)
Next

Set dct = Nothing
Set rs = Nothing
cn.Close
Set cn = Nothing
3
HansUp 19 Мар 2014 в 01:12

Это немного устарело, но для тех, кто занимается очисткой Интернета, как я (и все еще использует ADO / Access, хотя и в Delphi), альтернативой является использование метода Sort для набора записей. Итак, зная в предыдущем ответе, что поле 'ORDINAL_POSITION', что-то вроде этого будет делать в Delphi или на любом совместимом с ADO языке:

rs.Sort = 'ORDINAL_POSITION'
0
cdsaenz 20 Мар 2019 в 03:50