2017-01-20 13 views
0

У меня есть XML-файл со многими записями в разделе «/ response/result/record». Например:Импорт XML-данных в таблицу MS Access Использование SQL и VB6

<response> 
    <result> 
    <record> 
     <flda>some text</flda> 
     <fldb>some text</fldb> 
     :  :  : 
    </record> 
    : : : 
    </result> 
</response> 

У меня есть база данных MSAccess и VB6 программа устаревшей, которую необходимо прочитать этот файл и загрузить его в таблицу, содержащее поле для каждого текстового узла в каждой записи.

Я знаю, что могу использовать MSXML2.DOMDocument для загрузки XML из Интернета и, возможно, его сохранения в файл. Затем я могу использовать DOMDocument для чтения XML и загрузки таблицы базы данных MSAccess по одной записи за раз.

Это кажется неэффективным, так как я могу загрузить CSV файлы в таблицу MSAccess с помощью VB6 синтаксиса, таких как:

db.Execute "Select * Into CSVtable From [Text;FMT=CSVDelimited;HDR=YES;DATABASE=dirPath].[filename]" 

И это будет быстро основная нагрузка, данные в базу данных. Гораздо быстрее, чем чтение каждой записи из файла CSV и использование набора записей DAO для добавления каждой записи по одному.

Мой вопрос: Могу ли я сделать то же самое с XML-файлом? Каков синтаксис и как это сделать?

Последующий вопрос: Где найти документацию по этому надуманному синтаксису «Выбрать ...», который я показываю выше для файлов CSV (которые я первоначально нашел в StackOverflow)?

+0

[Этот вопрос] (http://stackoverflow.com/q/365312/2144390) содержит несколько ответов, предлагающих способы преобразования данных XML в формат CSV, после чего вы можете импортировать CSV, используя описанный вами метод. –

ответ

1

Синтаксис 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, или есть какой-то синтаксис, который я не нашел .. Я просто не могу сказать.

 Смежные вопросы

  • Нет связанных вопросов^_^