Gå til innhold

Dataset til XML tar ikke med seg NULL-felter


Anbefalte innlegg

Jeg har en webservice som eksporterer et dataset basert på en tabell i MS SQL. Noen av feltene i denne tabellen inneholder NULL. Når jeg kjører

doc = New Xml.XmlDataDocument(DataSet)

så blir feltene som inneholder kun NULL-verdier ikke tatt med i XML-outputen, noe som er vesentlig i applikasjonen da det den ikke bare skal eksportere dataene i tabellen, men også alle feltene i tabellen.

 

Jeg har sjekket litt rundt på nettet og ser at dette ikke er et uvanlig problem, og den beste løsningen jeg har funnet er følgende:

     Public Sub returnNullsEmpty(ByRef ods As DataSet)
       Dim oTable As DataTable
       Dim oRow As DataRow
       Dim oColumn As DataColumn

       Dim cProcessInfo As String = "getDataReader"
       Try
           For Each oTable In ods.Tables
               For Each oRow In oTable.Rows
                   For Each oColumn In oTable.Columns
                       If IsDBNull(oRow.Item(oColumn.ColumnName)) Then
                           Select Case oColumn.DataType.ToString
                               Case "System.DateTime"
                                   oRow.Item(oColumn.ColumnName) = CDate("01/01/1970")
                               Case "System.Integer"
                                   oRow.Item(oColumn.ColumnName) = 0
                               Case Else
                                   oRow.Item(oColumn.ColumnName) = ""
                           End Select
                       End If
                   Next
               Next
           Next
       Catch ex As Exception
           returnException(mcModuleName, "setDataSet", ex, "", cProcessInfo, mbDebug)
       End Try
   End Sub
  

Som dere ser så går den igjennom alle felter og sjekker for NULL-verdier og erstatter den med tomme verdier tilsvarende datatypen. Dette fungerer, men er etter min mening en lite elegant og tilfredsstillende løsning.

 

Noen andre der ute som kanskje har noen bedre forslag?

Lenke til kommentar
Videoannonse
Annonse

Ingen løsning, men en kjapp kommentar til hacket over.

 

Et integer-felt i en database som er NULL er veldig langt fra å være tallet 0. NULL er udefinert, og kan i prinsippet være alt og alle.

 

Skulle jeg først slåss med dette så ville jeg heller lagt på et attribut eller noe som sa "Ikke definert" på xml-elementet, uten at jeg vil påstå at det er noen fullgod løsning.

Lenke til kommentar
Ingen løsning, men en kjapp kommentar til hacket over.

 

Et integer-felt i en database som er NULL er veldig langt fra å være tallet 0. NULL er udefinert, og kan i prinsippet være alt og alle.

 

Skulle jeg først slåss med dette så ville jeg heller lagt på et attribut eller noe som sa "Ikke definert" på xml-elementet, uten at jeg vil påstå at det er noen fullgod løsning.

8528992[/snapback]

 

Ja, jeg er klar over hva NULL er. I dette tilfellet så er det en applikasjonsplattform over denne basen som sørger for at tallfelt er 0 og datofelt er 01.01.1970 når verdien er 0. Kun de alfanumeriske feltene vil i prinsippet inneholde NULL. Noen forutsettninger må man ta :p

Lenke til kommentar

Tenkte bare å ta noen forbehold :-)

 

Kanskje en god løsning er å skille snørr og bart, dvs definisjon og data? DataReaderen setter jo verdier som ikke er definert til DBNull ved innlesing av dataene igjen?

 

Evt så kunne du jo løse dette i selve uthentingen av dataene ved å bruke ISNULL osv, selvom det jo kan bli fryktelig slitsomt hvis vi snakker om en større tabeller/data som skal flyttes. Men det vil i det minste bli mer effektivt enn å iterere over alle dataene før du henter de ut. Du kan jo også sette default-verdier i databasen du henter dataene ut fra.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...