2017-01-25 3 views
0
Dim Rs As New `Adodb.Recordset` 
Rs.Open "select * from Customer ",Conn,adOpenDynamic,adLockOptimistic 
if Rs.RecordCount > 0 then 
    rs.Save App.Path & "\Customer.xml" , adPersistXML 
end if 

Das Problem ist, wenn Datensatz Null ist, dann werden die Daten nicht in xml gespeichert.Speichern von Daten von Recordset zu XML mit VB 6.0

So, wie alle gespeicherten Daten in xml Daten einschließlich null zu machen.

Antwort

0

Wenn Sie uns XML-Struktur zeigen können, wird es hilfreicher sein. Sie können NULL nicht direkt in XML speichern. Aber Sie haben zwei Option

  • Entweder eine fehlende Markierung, die als null betrachtet werden
  • Make-Attribut nillable = true

0

Sie können einen Nullwert erzwingen als XML zu exportieren dieser Weg. Das ADO-Rowset-Schema wurde entworfen, um sie absichtlich "wegzulassen".

Sie haben auch kein bestimmtes Schema zum Erstellen angegeben, aber Sie können das ADO-Schema leicht nachahmen, wenn Sie das möchten.

Der beste Weg ist, die Kontrolle über den Prozess selbst zu übernehmen. Hier ist ein SAX Beispiel wenn ich nicht die Mühe, das ADO-Schema zu imitieren hier:

Option Explicit 
' 
'Requires references to: 
' 
' Microsoft ActiveX Data Objects, version 2.5 or later. 
' Microsoft XML 6.0, can be rewritten to use 3.0 as well. 
' 

Private Enum HRESULT 
    S_OK = 0 
End Enum 

Private Enum STGM 
    STGM_READ = &H0& 
    STGM_WRITE = &H1& 
    STGM_READWRITE = &H2& 
    STGM_SHARE_EXCLUSIVE = &H10& 
    STGM_SHARE_DENY_WRITE = &H20& 
    STGM_SHARE_DENY_READ = &H30& 
    STGM_SHARE_DENY_NONE = &H40& 
    STGM_FAILIFTHERE = &H0& 
    STGM_CREATE = &H1000& 
End Enum 

Private Declare Function SHCreateStreamOnFile Lib "shlwapi" _ 
    Alias "SHCreateStreamOnFileW" (_ 
    ByVal pszFile As Long, _ 
    ByVal grfMode As STGM, _ 
    ByRef stm As IUnknown) As HRESULT 

Private Sub CustomSaveXML(_ 
    ByVal Recordset As ADODB.Recordset, _ 
    ByVal FilePath As String) 
    Dim Stream As IUnknown 
    Dim HRESULT As HRESULT 
    Dim Attributes As SAXAttributes60 
    Dim Writer As MSXML2.MXXMLWriter60 
    Dim Handler As MSXML2.IVBSAXContentHandler 
    Dim Field As ADODB.Field 
    Dim StringValue As String 

    Set Stream = Nothing 'Force creation on 64-bit Windows. Not sure why 
         'this is required or why it works. 
    HRESULT = SHCreateStreamOnFile(StrPtr(FilePath), _ 
            STGM_CREATE _ 
           Or STGM_WRITE _ 
           Or STGM_SHARE_EXCLUSIVE, _ 
            Stream) 
    If HRESULT <> S_OK Then 
     Err.Raise &H80044900, _ 
        "CustomSaveXML", _ 
        "SHCreateStreamOnFile error " & Hex$(HRESULT) 
    End If 
    Set Attributes = New MSXML2.SAXAttributes60 
    Set Writer = New MSXML2.MXXMLWriter60 
    Set Handler = Writer 
    With Writer 
     .omitXMLDeclaration = True 
     .standalone = True 
     .disableOutputEscaping = False 
     .indent = True 
     .encoding = "utf-8" 
     .output = Stream 
    End With 
    With Handler 
     .startDocument 
     .startElement "", "", "data", Attributes 
     Do Until Recordset.EOF 
      With Attributes 
       For Each Field In Recordset.Fields 
        Select Case VarType(Field.Value) 
         Case vbNull 
          'Force as empty String: 
          StringValue = "" 
         Case vbString 
          StringValue = Field.Value 
         Case Else 
          'This converts to a String value using the 
          'Invariant Locale: 
          StringValue = LTrim$(Str$(Field.Value)) 
        End Select 
        .addAttribute "", "", Field.Name, "", StringValue 
       Next 
      End With 
      .startElement "", "", "row", Attributes 
      .endElement "", "", "row" 
      Attributes.Clear 
      Recordset.MoveNext 
     Loop 
     .endElement "", "", "data" 
     .endDocument 
    End With 
End Sub 

Private Sub Main() 
    Dim RS As ADODB.Recordset 

    With New ADODB.Connection 
     .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='.';" _ 
       & "Extended Properties='Text;CSVDelimited=True;Hdr=True'" 
     Set RS = .Execute("sample.csv", , adCmdTableDirect) 
     CustomSaveXML RS, "sample2.xml" 
     RS.Close 
     .Close 
    End With 
End Sub 

Eingangsdaten:

LongVal,StringVal,DoubleVal 
65536,Fred,3.5 
,Has-Null,1.23456 
65537,Barney,37 

Output XML:

<data> 
    <row LongVal="65536" StringVal="Fred" DoubleVal="3.5"/> 
    <row LongVal="" StringVal="Has-Null" DoubleVal="1.23456"/> 
    <row LongVal="65537" StringVal="Barney" DoubleVal="37"/> 
</data> 

Sie könnten auch Brute Erzwinge Dinge und schreibe sie einfach als Datei mit konventioneller Logik und den intrinsischen VB6-I/O-Anweisungen. Es wird nur ein kleiner Trick, wenn Sie eine echte UTF-8-Ausgabe oder etwas benötigen, oder Ihr XML-Schema ist komplexer.

+0

Sir Bob77 .. Haben Sie Email .. ?? –

+0

Wir nehmen derzeit keine Bewerbungen an. – Bob77