(如何)使用XDocument读取XML文件并构建动态SQL查询?

时间:2011-07-08 03:22:13

标签: xml vb.net

这里我写了一个函数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

1 个答案:

答案 0 :(得分:0)

好的,首先要做的事情是:

  1. 永远不要将C ++注释斜杠插入到vb.net代码中,使代码不可复制
  2. 应该尝试从冗余的换行符中清除代码,使代码不可读
  3. 开发XML是为了让事情变得简单,不要让事情变得简单
  4. 你应该让你的生活更轻松;每次可能时使用元素而不是属性
  5. 有了这个说你可以解释一下你想要做什么,因为如果你正在尝试像XML和SQL这样的东西你应该真的使用LINQ to XML与LINQ to SQL, 我可以看到你清除了LINQ to XML
  6. 如果需要使用以下代码将数据库表导出到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)

  7. 哦,你的代码因为未申报的变量而无法完成...

  8. 我希望这会有所帮助。