Синтаксис SELECT
, который вы хотите, определен только в документе JETSQL40.CHM, насколько я могу определить. Обычно это устанавливается с помощью MS Office 2000 или более поздней версии, но вам придется искать в специальной папке «Program Files», чтобы найти ее. Там достаточно полезного материала, который я обычно создаю для него.
Однако, поскольку нет Jet XML Устанавливаемый ISAM (IISAM), вам нужно будет делать то, что MS Access делает сам для импорта данных формата XML.
В то время как это связано с циклом, вы можете сделать свою основную вставку более оптимальным способом, чем обычно делают люди. Используемый ниже код пытается это сделать.
Эта программа имеет форму с одного пункта меню mnuImportXML
и MSHFlexGrid имени FlexGrid
для отображения содержимого таблицы «Записи» в базе данных он создает при первом запуске:
Option Explicit
Private Const CONNWG As String = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Jet OLEDB:Engine Type=5;" _
& "Jet OLEDB:Create System Database=True;" _
& "Data Source='$DB$.mdw';"
Private Const CONNDB As String = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Jet OLEDB:Engine Type=5;" _
& "Jet OLEDB:System Database='$DB$.mdw';" _
& "Data Source='$DB$.mdb';"
Private CN As ADODB.Connection
Private QueryRS As ADODB.Recordset
Private UpdateRS As ADODB.Recordset
Private XmlRS As ADODB.Recordset
Private recordsRS As ADODB.Recordset
Private AppendFields As Variant
Public Function OpenConnection(ByVal DbPath As String) As ADODB.Connection
Dim ExtensionPos As Long
ExtensionPos = InStrRev(DbPath, ".")
If ExtensionPos > 0 Then DbPath = Left$(DbPath, ExtensionPos - 1)
On Error Resume Next
GetAttr DbPath & ".mdb"
If Err Then
On Error GoTo 0
Set OpenConnection = CreateDB(DbPath)
Else
On Error GoTo 0
Set OpenConnection = New ADODB.Connection
OpenConnection.Open Replace$(CONNDB, "$DB$", DbPath)
End If
End Function
Private Function CreateDB(ByVal DbPath As String) As ADODB.Connection
Dim catDB As Object 'Don't early-bind ADOX objects.
Set catDB = CreateObject("ADOX.Catalog")
With catDB
.Create Replace$(CONNWG, "$DB$", DbPath)
.Create Replace$(CONNDB, "$DB$", DbPath)
Set CreateDB = .ActiveConnection
Set catDB = Nothing
End With
With CreateDB
.Execute "CREATE TABLE [Records](" _
& "[ID] IDENTITY CONSTRAINT PK_UID PRIMARY KEY," _
& "[flda] TEXT(255) WITH COMPRESSION," _
& "[fldb] TEXT(255) WITH COMPRESSION)", , _
adCmdText Or adExecuteNoRecords
End With
End Function
Private Sub RefreshGrid()
QueryRS.Open "[Records]", , , adLockReadOnly, adCmdTable
Set FlexGrid.DataSource = QueryRS
QueryRS.Close
End Sub
Private Sub Form_Load()
Set CN = OpenConnection("demo.mdb")
Set QueryRS = New ADODB.Recordset
QueryRS.CursorLocation = adUseClient
Set QueryRS.ActiveConnection = CN
Set XmlRS = New ADODB.Recordset
XmlRS.ActiveConnection = "Provider=MSDAOSP;Data Source=MSXML2.DSOControl.3.0"
Set UpdateRS = New ADODB.Recordset
Set UpdateRS.ActiveConnection = CN
UpdateRS.Properties("Append-Only Rowset").Value = True
AppendFields = Array("flda", "fldb")
RefreshGrid
End Sub
Private Sub Form_Resize()
If WindowState <> vbMinimized Then
FlexGrid.Move 0, 0, ScaleWidth, ScaleHeight
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
CN.Close
End Sub
Private Sub mnuImportXML_Click()
XmlRS.Open "response.xml"
Set recordsRS = XmlRS.Fields("record").Value
UpdateRS.Open "Records", , , adLockOptimistic, adCmdTableDirect
CN.BeginTrans
With recordsRS
Do Until .EOF
UpdateRS.AddNew AppendFields, _
Array(.Fields(AppendFields(0)).Value, _
.Fields(AppendFields(1)).Value)
.MoveNext
Loop
End With
CN.CommitTrans
UpdateRS.Close
Set recordsRS = Nothing
XmlRS.Close
RefreshGrid
End Sub
Ключевым моментом здесь является обработчик события меню mnuImportXML_Click
(прокрутите вниз до конца), который добавляет текст подэлементов flda
и fldb
повторяющегося элемента XML второго уровня record
в таблицу базы данных Jet Records
.
Обратите внимание на использование:
UpdateRS.Properties("Append-Only Rowset").Value = True
Это делается во время инициализации в Form_Load. Это немного улучшает производительность.
Я не знаю более быстрого способа выполнить это. Jet не может использовать XML-документ в качестве внешней базы данных. Он может использовать только типы баз данных, для которых у него есть IISAM, например Text, HTML, Excel 8.0, dBase IV и Paradox.
Является ли Microsoft ленивым и оставил XML из Jet 4.0 без размышлений, иерархическая природа документов XML не оставила им много вариантов без расширения синтаксиса Jet SQL, или есть какой-то синтаксис, который я не нашел .. Я просто не могу сказать.
[Этот вопрос] (http://stackoverflow.com/q/365312/2144390) содержит несколько ответов, предлагающих способы преобразования данных XML в формат CSV, после чего вы можете импортировать CSV, используя описанный вами метод. –