【发布时间】: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[]并在每个循环中创建一个newInfo对象
标签: c# asp.net sql-server stored-procedures