[AccessD] Importing XML into a database

Shamil Salakhetdinov shamil at users.mns.ru
Fri Oct 5 17:41:16 CDT 2007


Hello John,

Yes, I think you can use MemoryStream - here is a sample code (watch line
wraps):

Imports System.Data
Imports System.Data.OleDb
Imports System.Xml.Serialization

Module TestImportXmlFile

    Sub Main()
        Dim rootDir As String = "E:\Temp\XML\"
        Dim accDbFileName As String = "testXML.mdb"
        Try
            Dim accConnection As String = _
                 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + _
                 rootDir + accDbFileName

            ' simulate custom object instance by 
            ' using DataSet instance, which data
            ' is loaded from external XMl file
            Dim xmlFileFullPath As String = rootDir + "clsLogData.xml"

            Dim textImportStream As System.IO.StreamReader = _
                  New IO.StreamReader(xmlFileFullPath)
            Dim dsObjectSimulator As New DataSet()
            dsObjectSimulator.ReadXml(textImportStream, _
				XmlReadMode.InferSchema)

            ' serialize DataSet data into memory stream
            ' (use your custom object instance here)
            Dim myStream As System.IO.Stream = New IO.MemoryStream()
            mSave(myStream, dsObjectSimulator)

            ' read memory stream's data into dataset
            Dim ds As New DataSet()
            myStream.Position = 0
            ds.ReadXml(myStream)

            ' write DataSet's data into database table
            Using cnn As New OleDbConnection(accConnection)
                Dim cmd As New OleDbCommand("select * from [LogData]")
                Dim adapter As New OleDbDataAdapter(cmd)
                Dim builder As New OleDbCommandBuilder(adapter)
                cnn.Open()
                cmd.CommandType = CommandType.Text
                cmd.Connection = cnn
                adapter.Update(ds, "clsLogData")
                cnn.Close()
            End Using
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

    End Sub

    'Public Function mSave(ByVal stream As IO.Stream, ByVal t As Type) As
Boolean
    Public Function mSave(ByVal stream As IO.Stream, ByVal t As Object) As
Boolean
        Dim serializer As New XmlSerializer(t.GetType())
        Try
            serializer.Serialize(stream, t)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

End Module

--
Shamil
 
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
Sent: Friday, October 05, 2007 11:54 PM
To: 'Access Developers discussion and problem solving'
Subject: Re: [AccessD] Importing XML into a database

Shamil,

I generate the XML file using the serialization code provided by .Net.  

Imports System.IO
Imports System.Xml.Serialization
Public Class clsSerializableData
    ''' <summary>
    ''' Serializes the object to disk
    ''' </summary>
    ''' <param name="strFileName"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function mSave(ByVal strFileName As String) As Int16
        '
        'Make a temp filename
        Dim strTmpFileName As String
        strTmpFileName = strFileName & ".tmp"
        Dim TmpFileInfo As New FileInfo(strTmpFileName)

        'check if it exists
        If TmpFileInfo.Exists Then
            Try
                TmpFileInfo.Delete()
            Catch ex As Exception
                Return -1
            End Try
        End If

        '
        'Open the file
        Dim stream As New FileStream(strTmpFileName, FileMode.Create)

        '
        'Save the object
        mSave(stream)

        '
        'Close the object
        stream.Close()

        'Remove the existing file
        Try
            TmpFileInfo.CopyTo(strFileName, True)
        Catch ex As Exception
            Return -2
        End Try
        '
        'Rename the temp file
        Try
            TmpFileInfo.Delete()
        Catch ex As Exception
            Return -3
        End Try
    End Function
    ''' <summary>
    ''' Performs the serialization
    ''' </summary>
    ''' <param name="stream"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function mSave(ByVal stream As Stream) As Boolean
        Dim serializer As New XmlSerializer(Me.GetType)
        Try
            serializer.Serialize(stream, Me)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function 

What I really want to do is to add code to this class to allow it to
serialize itself to a table.  Your code is tantalizing because it takes the
end result of my serialization (the xml file) and loads it back in to a
table which it then saves back to a data store.  Can that code be adapted to
short cut the actual storage of the data out to a file?  I.e. open a stream
that that the object can serialize itself to, but then hand that stream off
to be immediately read back and stored in a data set?  

.Net has provided a very nice facility for serializing a class, but (AFAIK)
it can only serialize itself to an XML file.  It does so however by
serializing itself onto a stream.  If that stream can be simly held and not
written to file, and then that stream handed back to a dataset to process
into a table I would have the holy grail of serialization to a table.  Any
class could then serialize itself directly into a database table. 

Of course I am completely incapable of actually coding such a solution if it
can even be done.  Or perhaps this is doable directly and I am so ignorant
that I do not even know it?

John W. Colby
Colby Consulting
www.ColbyConsulting.com 

<<< tail skipped >>>




More information about the AccessD mailing list