Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在VB.net中将ExecuteReader转换为XML_Sql_Xml_Vb.net_Web Services_Web - Fatal编程技术网

Sql 在VB.net中将ExecuteReader转换为XML

Sql 在VB.net中将ExecuteReader转换为XML,sql,xml,vb.net,web-services,web,Sql,Xml,Vb.net,Web Services,Web,在Vb.net中创建了一个Web服务,用于从数据库中读取记录。正在尝试将使用中的ExecuteReader读取的选定记录转换为XML 公共函数GetRoles(ByVal ID为字符串) .......... 使用sqlcmd2 .Connection=sqlconn2 .CommandText=sqlquery2 .CommandType=CommandType.Text .Parameters.AddWithValue(“@ID”,ID) 以 sqlcmd2.CommandText=sql

在Vb.net中创建了一个Web服务,用于从数据库中读取记录。正在尝试将使用中的
ExecuteReader
读取的选定记录转换为XML


公共函数GetRoles(ByVal ID为字符串)
..........
使用sqlcmd2
.Connection=sqlconn2
.CommandText=sqlquery2
.CommandType=CommandType.Text
.Parameters.AddWithValue(“@ID”,ID)
以
sqlcmd2.CommandText=sqlquery2
Dim官员作为新的XElement(“GetAnOfficerRoles”)
Dim sqlreader2=sqlcmd2.ExecuteReader()
如果sqlreader2不是Nothing,sqlreader2.HasRows则
而sqlreader2.Read()
作为新成员的Dim官员(“官员”)
警官。添加(警官)
添加(新XElement(“ID_登录”,sqlreader2(“ID”).ToString))
添加(新XElement(“用户”,sqlreader2(“ID_用户”).ToString))
添加(新XElement(“角色”,sqlreader2(“角色”).ToString))
结束时
如果结束
将设置变暗为新的XmlWriterSettings
settings.Indent=True
将mStream变暗为新的MemoryStream()

将写入程序设置为XmlWriter=XmlWriter.Create(mStream,设置) 官员。书面(作者) writer.Flush() mStream.Position=0 Dim sReader作为新的StreamReader(mStream) Dim响应为String=sReader.ReadToEnd() 返回响应
我得到的答复都是一句话


abcde2 1,5,9
我需要的是XML

HTTP/1.1200正常
内容类型:text/xml;字符集=utf-8
内容长度:长度
痛斥
2.
1, 5, 9
非常感谢您的帮助

我在其他项目中看到,他们使用了类和XMLSerializer(getType(ClassName))

_
部分公共类类名

使用xml linq创建元素:

Imports System.Xml
Imports System.Xml.Linq
Imports System.IO
Module Module1

    Sub Main()

        Dim xml As String =
            "<?xml version=""1.0"" encoding=""utf-8""?>" + _
            "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">" + _
                "<soap:Body>" + _
                    "<GetAnOfficerRolesResponse xmlns=""http://tempuri.org/"">" + _
                        "<GetAnOfficerRoles>" + _
                        "</GetAnOfficerRoles>" + _
                    "</GetAnOfficerRolesResponse>" + _
                "</soap:Body>" + _
            "</soap:Envelope>"


        Dim Envelope As XDocument = XDocument.Parse(xml)

        Dim GetAnOfficerRoles As XElement = Envelope.Descendants().Where(Function(x) x.Name.LocalName = "GetAnOfficerRoles").FirstOrDefault()
        Dim ns As XNamespace = GetAnOfficerRoles.GetDefaultNamespace()

        While sqlreader2.Read()
            Dim officer As New XElement(ns + "Officer")
            GetAnOfficerRoles.Add(officer)

            officer.Add(New XElement(ns + "ID", sqlreader2("ID").ToString())
            officer.Add(New XElement(ns + "USERS", sqlreader2("USERS").ToString())
            officer.Add(New XElement(ns + "ROLES", sqlreader2("ROLES").ToString())
        End While


        Dim settings As New XmlWriterSettings
        settings.Indent = True
        Dim mStream As New MemoryStream()
        Dim writer As XmlWriter = XmlWriter.Create(mStream, settings)
        Envelope.WriteTo(writer)
        writer.Flush()
        mStream.Position = 0
        Dim sReader As New StreamReader(mStream)
        Dim response As String = sReader.ReadToEnd()
    End Sub
End Module
Imports System.Xml
导入System.Xml.Linq
导入System.IO
模块1
副标题()
将xml设置为字符串=
"" + _
"" + _
"" + _
"" + _
"" + _
"" + _
"" + _
"" + _
""
将信封尺寸标注为XDocument=XDocument.Parse(xml)
Dim GetAnOfficerRoles作为XElement=Envelope.Substands()。其中(函数(x)x.Name.LocalName=“GetAnOfficerRoles”).FirstOrDefault()
Dim ns作为XNamespace=GetAnOfficerRoles.GetDefaultNamespace()
而sqlreader2.Read()
作为新成员的Dim军官(ns+“军官”)
GetAnOfficerRoles.Add(官员)
Add(新的XElement(ns+“ID”,sqlreader2(“ID”).ToString())
添加(新的XElement(ns+“用户”,sqlreader2(“用户”).ToString())
添加(新的XElement(ns+“角色”,sqlreader2(“角色”).ToString())
结束时
将设置变暗为新的XmlWriterSettings
settings.Indent=True
将mStream变暗为新的MemoryStream()

将写入程序设置为XmlWriter=XmlWriter.Create(mStream,设置) 信封。写给(作者) writer.Flush() mStream.Position=0 Dim sReader作为新的StreamReader(mStream) Dim响应为String=sReader.ReadToEnd() 端接头 端模块
无需序列化类或多余代码,只需按如下方式更改GetRoles即可完成此操作:

    <WebMethod()>
    Public Function GetRoles(ByVal ID As String, ByVal ROLE As String) As String
        Dim log As String = ""
        Dim sqlconn As New SqlConnection
        Dim sqlconn2 As New SqlConnection
        Dim sqlcmd As New SqlCommand
        'Dim listOfficerRoles As New List(Of String)()
        Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder("")


        Try
            sqlconn2.ConnectionString = STR_CONFIG
            Dim sqlcmd2 = New SqlCommand
            sqlcmd2.Connection = sqlconn2
            sqlconn2.Open()
            Dim sqlquery2 = "select a.LOGIN,a.USER,
                                    STUFF((select ', ' + CAST(ROLE AS  VARCHAR(1000)) from STROLE b where 
                                    b.USER = a.USER
                                    FOR XML PATH('')),1,1,'') AS ROLES 
                                    from T_USER a where ID = @ID
                                    group by a.ID, a.LOGIN"
            With sqlcmd2
                .Connection = sqlconn2
                .CommandText = sqlquery2
                .CommandType = CommandType.Text
                .Parameters.AddWithValue("@ID", ID)
            End With
            sqlcmd2.CommandText = sqlquery2
            Dim ds = New DataSet()
            Dim sqlreader2 = sqlcmd2.ExecuteReader()
            If sqlreader2 IsNot Nothing And sqlreader2.HasRows Then
                While sqlreader2.Read()

                    'listOfficerRoles.Add(sqlreader2("LOGIN").ToString)
                    'listOfficerRoles.Add(sqlreader2("ID").ToString)
                    'listOfficerRoles.Add(sqlreader2("ROLES").ToString)
                    sb.AppendLine("<RECORDS>")
                    sb.AppendLine(String.Format("<LOGIN>{0}</LOGIN>", sqlreader2("LOGIN").ToString))
                    sb.AppendLine(String.Format("<ID>{0}</ID>", sqlreader2("ID").ToString))
                    sb.AppendLine(String.Format("<ROLES>{0}</ROLES>", sqlreader2("ROLES").ToString))
                    sb.AppendLine("</RECORDS>")
                End While
            End If

            'Return listOfficerRoles
            Return String.Format("<DOCUMENT>{0}</DOCUMENT>", sb.ToString)

    End Function

公共函数GetRoles(ByVal ID作为字符串,ByVal角色作为字符串)作为字符串
Dim log As String=“”
Dim sqlconn作为新的SqlConnection
Dim sqlconn2作为新的SqlConnection
Dim sqlcmd作为新的SqlCommand
'将listOfficerRoles作为新列表(字符串)()
将sb设置为System.Text.StringBuilder=新建System.Text.StringBuilder(“”)
尝试
sqlconn2.ConnectionString=STR\u CONFIG
Dim sqlcmd2=新的SqlCommand
sqlcmd2.Connection=sqlconn2
sqlconn2.Open()
Dim sqlquery2=“选择a.LOGIN,a.USER,
STROLE b中的STUFF((选择“,”+CAST(角色为VARCHAR(1000)),其中
b、 用户
对于XML路径(“”),1,1,“”)作为角色
来自用户a,其中ID=@ID
按a.ID、a.LOGIN分组”
使用sqlcmd2
.Connection=sqlconn2
.CommandText=sqlquery2
.CommandType=CommandType.Text
.Parameters.AddWithValue(“@ID”,ID)
以
sqlcmd2.CommandText=sqlquery2
Dim ds=新数据集()
Dim sqlreader2=sqlcmd2.ExecuteReader()
如果sqlreader2不是Nothing,sqlreader2.HasRows则
而sqlreader2.Read()
'listOfficerRoles.Add(sqlreader2(“登录”).ToString)
'listOfficerRoles.Add(sqlreader2(“ID”).ToString)
'listOfficerRoles.Add(sqlreader2(“角色”).ToString)
某人加上一行(“”)
sb.AppendLine(String.Format(“{0}”,sqlreader2(“LOGIN”).ToString))
sb.AppendLine(String.Format(“{0}”,sqlreader2(“ID”).ToString))
sb.AppendLine(String.Format(“{0}”,sqlreader2(“ROLES”).ToString))
某人加上一行(“”)
结束时
如果结束
'返回listOfficerRoles
返回String.Format(“{0}”,sb.ToString)
端函数

然后,您可以从客户端详细说明以Xml形式接收的字符串。

谢谢,它可以工作。无论如何,接收的结果是typr=并且所有Xml都在一行中。要格式化,请尝试:Dim settings作为新的XmlWriterSettings设置。Indent=True Dim writer作为XmlWriter=XmlWriter.Create(officers.ToString(),settings)writer.ToString()将writer设置为XmlWriter=XmlWriter.Create(officers.T