2011-08-18 6 views
0

VBA의 파일에서 DataSet을로드하면 오류가 발생합니다.데이터 집합로드 중 오류가 발생합니다. 소스 XML이 불완전하거나 유효하지 않습니다.

RsLoadFromXML? ("C : \ sletmig \ test.xml의")는

레코드를 만들 수 없습니다. 소스 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

@ 팀 윌리엄스가 올바른지이 test.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 

가 ... ADO가 처리 할 수있는 XML 영구 레코드를 위해 특별히 내 소스 코드 Recordset.Save (see this)에 의해 생성되었습니다.

This article Microsoft에서 제공하는 작은 글자가 누락 될 수 있습니다. "제공된 XML 데이터는 ADO 레코드 집합을 수용 할 수있는 형식이어야합니다."

일반 XML 파일을로드하려면 Microsoft XML (Office에서 "Microsoft XML #. #"에 대한 참조를 추가해야합니다 .Visual Basic의 도구 -> 참조에서이 작업을 수행 할 수 있습니다. 편집자)

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

자세한 정보가 필요하면 알려 주시기 바랍니다.

수정 : 매일 새로운 것을 배웁니다. 이것은 실제로 아주 멋진 IMHO입니다. 레코드 세트의 데이터가 필요하기 때문에 백킹 데이터베이스가없는 레코드 세트를 만들고 데이터를 추가 할 수 있습니다. (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 Method documentation에 링크] (http://msdn.microsoft.com/en-us/library/ms681501(v=vs.85) .aspx) – transistor1

관련 문제