Module Program
Dim _XmlDoc As XmlDocument
Dim _XmlCommand As XmlElement
Sub VisitReader(ByVal reader As DbDataReader)
VisitReader(reader, _XmlCommand)
End Sub
Sub VisitReader(ByVal reader As DbDataReader, ByVal xmlParent As XmlElement)
Dim xmlResult As XmlElement = _XmlDoc.CreateElement("Result")
xmlParent.AppendChild(xmlResult)
Do While (reader.Read())
VisitRecord(reader, xmlResult)
Loop
End Sub
Sub VisitRecord(ByVal record As IDataRecord, ByVal xmlParent As XmlElement)
Dim xmlRecord As XmlElement = _XmlDoc.CreateElement("Record")
xmlParent.AppendChild(xmlRecord)
For i = 0 To record.FieldCount - 1
Dim name As String = record.GetName(i)
Dim xmlProperty As XmlElement = _XmlDoc.CreateElement(XmlConvert.EncodeName(name))
xmlRecord.AppendChild(xmlProperty)
If (record.IsDBNull(i)) Then
xmlProperty.InnerText = "[NULL]"
Continue For
Else
Dim type As Type = record.GetFieldType(i)
If type Is GetType(DbDataRecord) Then
Dim nestedRecord As DbDataRecord = DirectCast(record.GetValue(i), DbDataRecord)
VisitRecord(nestedRecord, xmlProperty)
ElseIf type Is GetType(DbDataReader) Then
Dim nestedReader As DbDataReader = DirectCast(record.GetData(i), DbDataReader)
VisitReader(nestedReader, xmlProperty)
ElseIf type Is GetType(EntityKey) Then
Dim key As EntityKey = DirectCast(record.GetValue(i), EntityKey)
Dim builder As New StringBuilder
builder.Append(key.EntitySetName)
builder.Append("[")
Dim isFirstTime As Boolean = True
For Each keyMember As EntityKeyMember In key.EntityKeyValues
If (isFirstTime <> True) Then
builder.Append(";")
End If
isFirstTime = False
builder.AppendFormat("{0}={1}", keyMember.Key, keyMember.Value.ToString())
Next
builder.Append("]")
xmlProperty.InnerText = builder.ToString()
Else
xmlProperty.InnerText = record.GetValue(i).ToString()
End If
End If
Next i
End Sub
Sub Main()
Using conn As EntityConnection = New EntityConnection("name=AdventureWorksEntities")
conn.Open()
_XmlDoc = New XmlDocument()
_XmlCommand = _XmlDoc.CreateElement("Command")
_XmlDoc.AppendChild(_XmlCommand)
' Create a query.
Dim esqlQuery As String = " Select c.ContactID, c.SalesOrderHeader " & _
"From AdventureWorksEntities.Contact as c"
' Create an EntityCommand.
Using cmd As EntityCommand = conn.CreateCommand()
cmd.CommandText = esqlQuery
' Execute the command.
Using rdr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
' Start reading results and
' write them to _XmlDoc.
VisitReader(rdr)
' Output the content of_XmlDoc content to console.
_XmlDoc.Save(New StreamWriter(Console.OpenStandardOutput()))
End Using
End Using
conn.Close()
End Using
End Sub
End Module