Как получить ADORecordset из XML в VB6? - PullRequest
0 голосов
/ 01 июня 2011

У меня есть требование, чтобы моя программа перемещалась между источником данных XML и сервером SQL.Я должен прочитать записи из файла XML и должен вернуть ADORecordset.

Вот грубый кусок кода (Form1):

if (optionDB) then
  GetDBRecords 'this function should return recordset
else 
  GetXMLRecords ' this function should return Recordset
end if

Module1: ' this module contains code related to DB

Module2: ' This module should contain code related to XML

Public Function getXmlRecords() As ADODB.Recordset
    Dim oXMLDom As New DOMDocument
    Dim Recordset As New ADODB.Recordset

    If oXMLDom.Load(App.Path + "\data.xml") = False Then
        MsgBox "Failed to load xml data from file."
    End If
    Set Recordset = RecordsetFromXMLDocument(oXMLDom)
End Function

Public Function RecordsetFromXMLDocument(XMLDOMDocument As DOMDocument) As Recordset
    Dim oRecordset As ADODB.Recordset

    Set oRecordset = New ADODB.Recordset
    oRecordset.Open XMLDOMDocument ' pass the DOM Document instance as the Source argument
    Set RecordsetFromXMLDocument = oRecordset  ' return the recordset
    Set oRecordset = Nothing
End Function

Это бросает меняошибка:

Невозможно создать набор записей. Исходный XML является неполным или недействительным.

Что мне добавить в документ XML?Я новичок в этих понятиях.

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

По умолчанию xml загружается асинхронно.
Установите oXMLDom.async = False перед загрузкой.

И, очевидно, XML должен быть в форме, понятной для ADODB.То есть он должен использовать определенные пространства имен и иметь данные в определенном формате.Пример:

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
    xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
    xmlns:rs='urn:schemas-microsoft-com:rowset'
    xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
    <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
        <s:AttributeType name='foo' rs:number='1' rs:write='true'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='0' rs:fixedlength='true' rs:maybenull='false'/>
        </s:AttributeType>
        <s:AttributeType name='bar' rs:number='2' rs:write='true'>
            <s:datatype dt:type='string' dt:maxLength='255' rs:precision='0' rs:maybenull='false'/>
        </s:AttributeType>
        <s:extends type='rs:rowbase'/>
    </s:ElementType>
</s:Schema>
<rs:data>
    <z:row foo='1' bar='one'/>
    <z:row foo='2' bar='two'/>
    <z:row foo='3' bar='three'/>
</rs:data>
</xml>

Вы можете пропустить секцию s:Schema и включить rs:data, только если ваш набор записей структурирован с обязательными полями.
Если вы хотите передать любой произвольный XML в ADODBлучше сначала преобразовать его с помощью XSL.

2 голосов
/ 01 июня 2011

Я сам не пробовал, но следующая статья выглядит интересно:

Простой поставщик Microsoft OLE DB

Простые провайдеры предназначены для доступ к источникам данных, которые требуют только фундаментальная поддержка OLE DB, такая как массивы в памяти или документы XML ... Простой поставщик OLE DB (OSP) в MDAC 2.7 или более поздняя версия была улучшена до поддержка открытия иерархического ADO Наборы записей в произвольных файлах XML.

...