2011-08-18 17 views
0

我在從VBA中的文件加載數據集時收到錯誤。加載數據集給出錯誤:源XML不完整或無效

RsLoadFromXML?( 「C:\ sletmig \的test.xml」)

記錄無法創建。源XML不完整或無效。

這裏是我的源代碼

Function RsLoadFromXML(sPath As String) As Recordset 
    Dim oStream As ADODB.Stream, oRsLoad As ADODB.Recordset 

    On Error GoTo ErrFailed 

    Set oRsLoad = New ADODB.Recordset 
    oRsLoad.CursorLocation = adUseClient 

    Set oStream = New ADODB.Stream 
    oStream.Charset = "iso-8859-1" 
    oStream.Open 
    'Load stream 
    oStream.LoadFromFile sPath 

    'Open recordset using stream 
    oRsLoad.Open oStream 
    Set RsLoadFromXML = oRsLoad 

    oStream.Close 
    Set oStream = Nothing 
    Set oRsLoad = Nothing 

    Exit Function 

ErrFailed: 
    Debug.Print Err.Description 
    Debug.Assert False 
    Set RsLoadFromXML = Nothing 
End Function 

試圖加載該文件的test.xml

<?xml version="1.0"?> 
<Instruments> 
<Control> 
<AnalysisNotional>1000000</AnalysisNotional> 
<TAsOf>18/08/2011</TAsOf> 
<NumberOfDays>1</NumberOfDays> 
</Control> 
</Instruments> 
+0

我敢肯定ADO不能使用任何隨機XML轉換成一個記錄:它必須是它最初是由創建一個XML文件將現有的ADO記錄集保存到文件中... –

回答

0

@Tim威廉姆斯是正確的...... ADO可以處理XML是專門爲執着的記錄由Recordset.Save創建(see this)。

This article如果您錯過了細則,微軟可能會產生誤導:「假設XML數據的格式爲ADO記錄集可以接受的格式」。

如果要加載通用XML文件,請使用Microsoft XML(在Office中,您需要添加對「Microsoft XML#。#」的引用,可以在Visual Basic的Tools-> References中執行此操作編輯器)。

Sub XML() 
    Dim oDoc As MSXML2.DOMDocument 
    Set oDoc = New MSXML2.DOMDocument 
    oDoc.Load ("C:\Path\To\File\AnXMLFile.xml") 
End Sub 

如果您需要更多信息,請讓我知道。

編輯:你每天都會學到新的東西。這實際上是非常酷的恕我直言。由於您需要記錄集中的數據,因此可以創建沒有備份數據庫的記錄集並向其中添加數據。 (Source article

Sub XML() 
    Dim oDoc As MSXML2.DOMDocument 
    Dim oRS As ADODB.Recordset 
    Dim oNode As MSXML2.IXMLDOMNode 
    Dim oSubNodes As MSXML2.IXMLDOMSelection 

    Set oDoc = New MSXML2.DOMDocument 
    oDoc.Load ("C:\Path\To\File\AnXMLFile.xml") 

    Set oRS = New ADODB.Recordset 
    Set oRS.ActiveConnection = Nothing 
    oRS.CursorLocation = adUseClient 
    oRS.LockType = adLockBatchOptimistic 


    With oRS.fields 
     .Append "AnalysisNotional", adInteger 
     .Append "TAsOf", adDate 
     .Append "NumberOfDays", adInteger 
    End With 

    oRS.Open 

    For Each oNode In oDoc.selectNodes("/Instruments/Control") 
     oRS.AddNew 
     oRS.fields("AnalysisNotional").Value = oNode.selectSingleNode("AnalysisNotional").Text 
     oRS.fields("TAsOf").Value = oNode.selectSingleNode("TAsOf").Text 
     oRS.fields("NumberOfDays").Value = oNode.selectSingleNode("NumberOfDays").Text 
    Next 

    oRS.MoveFirst 

    '--- Do something with recordset here --- 
End Sub 
0

謝謝。我試圖創建一些示例代碼,XML看起來很奇怪,所以我會嘗試一下你的建議。

Sub Create_recordset() 
    Dim r As ADODB.Recordset 
    Dim strFileName As String 

    strFileName = "d:\sletmig\test.txt" 


    Set r = New ADODB.Recordset 

    'Add Columns 
    r.Fields.Append "Field1", adVarWChar, 50 
    r.Fields.Append "Field2", adVarWChar, 50 

    'Create Recordset 
    r.Open 

    'Add rows into recordset 
    r.AddNew Array("field1", "field2"), Array("string1", 「val1」) 
    r.AddNew Array("field1", "field2"), Array("string2", 「val2」) 

    On Error Resume Next 
    Kill strFileName 

    r.Save strFileName, adPersistXML 

    r.Close 
    Set r = Nothing 

End Sub 

給我這個xml文件

<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='Field1' rs:number='1' rs:write='true'> 
      <s:datatype dt:type='string' dt:maxLength='50' rs:precision='0' rs:maybenull='false'/> 
     </s:AttributeType> 
     <s:AttributeType name='Field2' rs:number='2' rs:write='true'> 
      <s:datatype dt:type='string' dt:maxLength='50' rs:precision='0' rs:maybenull='false'/> 
     </s:AttributeType> 
     <s:extends type='rs:rowbase'/> 
    </s:ElementType> 
</s:Schema> 
<rs:data> 
    <rs:insert> 
     <z:row Field1='string1' Field2=''/> 
     <z:row Field1='string2' Field2=''/> 
    </rs:insert> 
</rs:data> 
</xml> 
+0

這是一些代碼的好鏈接, – Damian

+0

這裏是一些不錯的代碼的鏈接[link](http://vbcity.com/forums/p/100559/425591.aspx ) – Damian

+0

您看到的XML是持久記錄集。您可以使用[Recordset.Open](http://msdn.microsoft.com/en-us/library/ms675544(v = vs.85).aspx)將其加載到不同的記錄集中。這基本上是序列化記錄集的一種方式。 [鏈接到Recordset.Save方法文檔](http://msdn.microsoft.com/en-us/library/ms681501(v = vs.85).aspx) – transistor1

相關問題