简体   繁体   中英

Pass XML document as parameter to sql script in .net vb

How can I pass XML document as Parameter to SQL script in vb.net? I want to use the XML as a variable in SQL script. The SQL script dont recognizes the variable which i as a parameter submitter in .net

This is my XML.

<?xml version="1.0"?>
<sqlSkript>
   <parameter>
      <name>name</name>
      <datentyp>varchar</datentyp>
   </parameter>
   <parameter>
      <name>strasse</name>
      <datentyp>varchar</datentyp>
   </parameter>
</sqlSkript>

This is my SQL-Script.

DECLARE @xml xml

SET @xml = @test

SELECT  t.name AS table_name,
        SCHEMA_NAME(t.schema_id) AS schema_name,
        c.name AS column_name,
        st.name as datatyp

FROM    sys.tables AS t
        INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
        INNER JOIN sys.types st ON st.system_type_id = c.system_type_id 
        AND st.name != 'sysname'

WHERE   (c.name like '%' + (SELECT @xml.value('(/sqlSkript/parameter/name)[1]', 'varchar(100)')) + '%'
        AND st.name like (SELECT @xml.value('(/sqlSkript/parameter/datentyp)[1]', 'varchar(100)')))
        or
        (c.name like '%' + (SELECT @xml.value('(/sqlSkript/parameter/name)[2]', 'varchar(100)')) + '%'
        AND st.name like (SELECT @xml.value('(/sqlSkript/parameter/datentyp)[2]', 'varchar(100)')))

ORDER BY schema_name, table_name;

This is my vb.net code

        Dim command As SqlCommand = New SqlCommand()

        Dim xmldoc As New Xml.XmlDocument
        xmldoc.Load(System.IO.Path.GetFullPath(Application.StartupPath & "\XML\indivudellParameter.xml"))

        Dim param As SqlParameter = New SqlParameter("@test", SqlDbType.Xml)
        param.Value = New SqlXml(New XmlTextReader(xmldoc.InnerXml, XmlNodeType.Document, Nothing))
        command.Parameters.Add(param)

        Using reader As SqlDataReader = _server.ConnectionContext.ExecuteReader(script, command)
            While reader.Read()
                //do something
            End While
            reader.Close()
        End Using

EDIT:

workaround

        Dim xmldoc As New Xml.XmlDocument
        xmldoc.Load(System.IO.Path.GetFullPath(Application.StartupPath & "\XML\indivudellParameter.xml"))

        script = script.Replace("@test", xmldoc.InnerXml)

        Using reader As SqlDataReader = _server.ConnectionContext.ExecuteReader(script)
            While reader.Read()
                  // do something
            End While

Might be quite simple:

Are you sure that you want to compare your XML-data values against st.name in both cases (marked the places with *** )?

WHERE   (c.name like '%' + (SELECT @xml.value('(/sqlSkript/parameter/name)[1]', 'varchar(100)')) + '%'
        AND ***st.name*** like (SELECT @xml.value('(/sqlSkript/parameter/datentyp)[1]', 'varchar(100)')))
        or
        (c.name like '%' + (SELECT @xml.value('(/sqlSkript/parameter/name)[2]', 'varchar(100)')) + '%'
        AND ***st.name*** like (SELECT @xml.value('(/sqlSkript/parameter/datentyp)[2]', 'varchar(100)')))

If it's not that simple: Try to check if your parameter comes into the SQL script correctly (write it into some temp table and check it there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM