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 >>>