【问题标题】:How can I return a stored procedure's result as XML?如何将存储过程的结果作为 XML 返回?
【发布时间】:2017-10-16 15:16:24
【问题描述】:

我编写了一个连接到 MS-Sql 服务器并从存储过程中获取结果的 Web 服务。我下面的代码只获得程序的第一个结果,但我需要响应 xml 文件中的所有结果。我认为我需要使用数据适配器、数据读取器、数据填充等。像这样的东西。但我没能成功。我将不胜感激:

PS:Info.cs 类已经创建。

[WebMethod]
public Info NumberSearch2(string no)
{
    Info ourInfo = new Info();
    string cs = ConfigurationManager.ConnectionStrings["DBBaglan"].ConnectionString;

    using (SqlConnection Con = new SqlConnection(cs))
    {
        SqlCommand cmd = new SqlCommand(cmdText: "NumberSearch", connection: Con)
        {
            CommandType = CommandType.StoredProcedure
        };

        SqlParameter parameter = new SqlParameter
        {
            ParameterName = "@no",
            Value = no
        };

        cmd.Parameters.Add(parameter);
        Con.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        DataSet ds = new DataSet();

        while (dr.Read())
        {
            ourInfo.PartNo = dr["PartNo"].ToString();
            ourInfo.BrandNo = dr["BrandNo"].ToString();
            ourInfo.Manufacturer = dr["Manufacturer"].ToString();
            ourInfo.Country = dr["Country"].ToString();
            ourInfo.ReferenceNo = dr["ReferenceNo"].ToString();
        }
    }

    return ourInfo;
}

经过@David 的推荐:

    [WebMethod]
    //public Info NumberSearch2(string no)
    public List<Info> NumberSearch2(string no)
    {
        Info ourInfo = new Info();
        var ourInfos = new List<Info>();

        string cs = System.Configuration.ConfigurationManager.ConnectionStrings["DBBaglan"].ConnectionString;
        using (System.Data.SqlClient.SqlConnection Con = new System.Data.SqlClient.SqlConnection(cs))
        {
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(cmdText: "NumberSearch", connection: Con)
            {
                CommandType = System.Data.CommandType.StoredProcedure
            };

            System.Data.SqlClient.SqlParameter parameter = new System.Data.SqlClient.SqlParameter
            {
                ParameterName = "@no",
                Value = no
            };

            cmd.Parameters.Add(parameter);
            Con.Open();
            System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
            DataSet ds = new DataSet();
            while (dr.Read())

            {
                var ourInfos = new Info();
                ourInfo.PartNo = dr["PartNo"].ToString();
                ourInfo.BrandNo = dr["BrandNo"].ToString();
                ourInfo.Manufacturer = dr["Manufacturer"].ToString();
                ourInfo.Country = dr["Country"].ToString();
                ourInfo.ReferenceNo = dr["ReferenceNo"].ToString();
                ourInfos.Add(ourInfo);
            }
        }

        return ourInfos;

    }

【问题讨论】:

  • 你一次又一次地覆盖ourInfo
  • 想想你在做什么。这在逻辑上没有意义。您创建一个 Info 对象,然后返回它。您正在用每条记录覆盖对象的值,这意味着您只会返回最后一个结果。如果要返回多个结果,则需要返回 Info 对象的集合,为每条记录声明一个新的 Info 对象(在您的 while 循环中)并将其添加到集合中。
  • 您不应该基于ourInfo类创建一个列表,然后将阅读器的每个读取添加到列表中,然后返回添加了所有记录的列表吗?
  • 标题与正文无关。 Web 服务已经将它们的返回值转换为 XML。你不必做任何事情。只需定义 正确的 返回类型,填充适当的对象并返回即可。但是,您在这里所做的只是覆盖相同的值。只有最后一个对象会被发送到客户端
  • 如果要返回一个对象数组,请将返回类型更改为Info[] 并在每个循环中创建一个new Info 对象

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

您将返回一个 Info 对象。如果您想要它们的集合,请改为返回 List&lt;Info&gt;。更改方法签名:

public List<Info> NumberSearch2(string no)

声明要返回的对象:

var ourInfos = new List<Info>();

在您的循环中,将每条记录添加到列表中:

while (dr.Read())
{
    var ourInfo = new Info();
    ourInfo.PartNo = dr["PartNo"].ToString();
    ourInfo.BrandNo = dr["BrandNo"].ToString();
    ourInfo.Manufacturer = dr["Manufacturer"].ToString();
    ourInfo.Country = dr["Country"].ToString();
    ourInfo.ReferenceNo = dr["ReferenceNo"].ToString();
    ourInfos.Add(ourInfo);
}

并返回列表:

return ourInfos;

【讨论】:

  • 嗨@David,非常感谢。看来我离成功更近了。 var ourInfos = new Info();无法识别语句,并且,我得到了同一记录(最后一条记录)的 207 个结果(这是正确的)。可以再看一遍吗?
  • @Murat:看看什么,到底是什么?如果您更新了代码,请将其包含在问题中。没有人能告诉你你没有显示的代码有什么问题。
  • 抱歉@David,我现在在原帖下方添加了代码。
  • @Murat:您在循环之外声明了 ourInfo 对象。正如此答案中所建议的,将其声明为 inside 循环。您还尝试在循环内重新声明不同的 ourInfos 对象。不要那样做。 ourInfos 对象已存在。这里的概念很简单......声明一个列表,循环记录将它们添加到列表中,返回列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2015-06-03
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多