这里我写了一个函数ReadXML()。这个函数读取XML文件并返回一个字符串。该字符串包含动态地进行SQL查询的所有XML文件节点值。任何方式我的代码工作。这是对的吗?你可以在这个函数中建议我不必要的代码(循环...),这样我就可以更好地完成代码了。
这是功能。
Public Function ReadXML(ByVal tblName As String) As String
Dim strBuil As New StringBuilder
Dim listSource As New List(Of String)
Dim listTarget As New List(Of String)
Dim dictionary As New Dictionary(Of String, String)
Dim xmlDoc As XDocument = XDocument.Load("C:\\MappingFile.xml")
Dim q = (From c In xmlDoc.Descendants("Entity") Where c.Attribute("Source").Value = tblName
Select New With {
.EntityTarget = c.Attribute("Target").Value,
.PropertySource = c.Elements("Property").Attributes("Source"),
.PropertyTarget = c.Elements("Property").Attributes("Target")
})
For Each itm In q
Dim entitytarget As String = itm.EntityTarget
For Each propertysrce In itm.PropertySource
Dim prpsource As String = propertysrce.ToString().Remove(0, 8) //Here propertytrgt value is like Source="...". So I am removing unnecessary part and adding value to list.
prpsource = prpsource.Remove(prpsource.Length - 1)
listSource.Add(prpsource)
Next
listSource.Add(entitytarget)
For Each propertytrgt In itm.PropertyTarget //Here propertytrgt value is like Target="...". So I am removing unnecessary part and adding value to list.
Dim prptarget As String = propertytrgt.ToString().Remove(0, 8)
prptarget = prptarget.Remove(prptarget.Length - 1)
listTarget.Add(prptarget)
Next
listTarget.Add(entitytarget)
Next
// HERE adding two lists(listTarget and listSource) to Dictionary
For Each sourceValue In listSource
Dim Source As String = sourceValue
Dim count As Int32 = listTarget.Count
If I <> count Then
Dim Target As String = listTarget.Item(I)
dictionary.Add(Source, Target)
I = I + 1
End If
Next
'===============STRING BUILDER
strBuil.Append("select ")
For Each itm In dictionary
If n <= dictionary.Count - 2 Then
strBuil.Append(itm.Value.ToString + " " + "as " + itm.Key.ToString + ",")
n = n + 1
ElseIf n = dictionary.Count - 1 Then
strBuil = strBuil.Remove(strBuil.Length - 1, 1)
strBuil.Append(" from " + itm.Value.ToString)
Else
Exit For
End If
Next
Return strBuil.ToString()
End Function
Here is the XML file.
<?xml version="1.0" encoding="utf-8" ?>
<Entities>
<Entity Source="E_cdclient" Target="cd_client">
<Property Source="Name" Target="client_name"/>
<Property Source="Client_ShortDesc" Target="client_name_short"/>
<Property Source="PeriodStart" Target="client_period_start"/>
<Property Source="PeriodEnd" Target="client_period_end"/>
<Property Source="Comments" Target="client_remark"/>
</Entity>
<Entity Source="E_cdclient_cdclientcontact" Target="cd_client_contact">
<Property Source="Surname" Target="Surname"/>
<Property Source="Familyname" Target="Familyname"/>
<Property Source="Phone" Target="Phone"/>
<Property Source="EMail" Target="EMail"/>
<Property Source="Street" Target="Street"/>
<Property Source="City" Target="City"/>
<Property Source="ZIP" Target="ZIP"/>
<Property Source="Responsibility" Target="Responsibility"/>
</Entity>
</Entities>
谢谢&amp;问候, JN
答案 0 :(得分:0)
好的,首先要做的事情是:
如果需要使用以下代码将数据库表导出到XML:
db.ExecuteCommand(“SELECT * FROM TABLENAMES FOR XML AUTO,ELEMENTS ROOT('filename')”)
//(其中db是完全限定的datacontext对象,或者如果您更喜欢使用datareader和ExecuteNonQuery)
或 如果您注意使用属性,请使用:
db.ExecuteCommand(“SELECT * FROM TABLENAMES FOR XML AUTO,ELEMENTS ROOT('filename')”)
//(其中db是完全限定的datacontext对象,或者如果您更喜欢使用datareader和ExecuteNonQuery)
哦,你的代码因为未申报的变量而无法完成...
我希望这会有所帮助。