传递给wcftestclient时如何循环datareader?
Posted
技术标签:
【中文标题】传递给wcftestclient时如何循环datareader?【英文标题】:How to loop datareader when passing to wcftestclient? 【发布时间】:2014-07-14 04:47:44 【问题描述】:当我试图从 wcf 查看数据库中的多行时,我只得到了最后一行
我创建了这个服务
public dcTransaction SelectMasterTransaction(DateTime date1, DateTime date2)
dcTransaction dcTrans = new dcTransaction();
string conString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (con = new SqlConnection(conString))
SqlCommand cmd = new SqlCommand("spViewMasterTransaction", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parameterDate1 = new SqlParameter();
parameterDate1.ParameterName = "@date1";
parameterDate1.Value = date1;
cmd.Parameters.Add(parameterDate1);
SqlParameter parameterDate2 = new SqlParameter();
parameterDate2.ParameterName = "@date2";
parameterDate2.Value = date2;
cmd.Parameters.Add(parameterDate2);
con.Open();
SqlDataReader dtReader = cmd.ExecuteReader();
while (dtReader.Read())
dcTrans.no_trans = int.Parse(dtReader["no_trans"].ToString());
dcTrans.name = dtReader["name"].ToString();
dcTrans.sum = int.Parse(dtReader["sum"].ToString());
dcTrans.dates = DateTime.Parse(dtReader["dates"].ToString());
return dcTrans;
我在这里得到的是,wcftestclient 也只显示我请求的最后一条记录.. 例如:从日期 2010 年 1 月 1 日到 2014 年 1 月 1 日(sql 查询是在我的 sql 服务器中的存储过程中编写的)
然后当我给 wcftestclient 一个值 1/1/2010 到 1/1/2014 时,wcftestclient 只返回最后一个日期记录,我认为它不会打印循环,我在这里缺少什么?我认为 WHILE(dataReader.read()) 已经循环了?
这是我在我的 sql server 中的存储过程
CREATE PROCEDURE spViewMasterTransaksi
@date1 datetime,
@date2 datetime
AS
BEGIN
select * from MasterTransaction WHERE date >= @date1 AND date <= @date2
END
当我通过 sql server 执行我的存储过程时,它似乎很好,它显示了我输入的值之间的日期..
【问题讨论】:
顺便说一句,SQL 已经将这些字段返回为int
s。您不需要解析字符串表示。这不是导致您的问题的原因,但这是一种非常低效的方法。您还应该添加一些using
语句。我将在我的代码中进行这两项更改以显示一个示例。
【参考方案1】:
您正在返回单个对象,请将您的方法定义更改为返回 List<dcTransaction>
,如下所示
public List<dcTransaction> SelectMasterTransaction(DateTime date1, DateTime date2)
List<dcTransaction> result = new List<dcTransaction>();
string conString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (con = new SqlConnection(conString))
SqlCommand cmd = new SqlCommand("spViewMasterTransaction", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parameterDate1 = new SqlParameter();
parameterDate1.ParameterName = "@date1";
parameterDate1.Value = date1;
cmd.Parameters.Add(parameterDate1);
SqlParameter parameterDate2 = new SqlParameter();
parameterDate2.ParameterName = "@date2";
parameterDate2.Value = date2;
cmd.Parameters.Add(parameterDate2);
con.Open();
SqlDataReader dtReader = cmd.ExecuteReader();
while (dtReader.Read())
dcTransaction dcTrans = new dcTransaction();
dcTrans.no_trans = int.Parse(dtReader["no_trans"].ToString());
dcTrans.name = dtReader["name"].ToString();
dcTrans.sum = int.Parse(dtReader["sum"].ToString());
dcTrans.dates = DateTime.Parse(dtReader["dates"].ToString());
result.Add(dcTrans);
return result;
【讨论】:
太棒了!我们总是要启动 List【参考方案2】:您没有返回对象列表。您执行循环,但每个项目都会覆盖前一个的值。
您可以在此处查看yield return
并返回IEnumerable<dcTransaction>
,或者只需执行经典的List<T>
并在每次循环中添加。
public IEnumerable<dcTransaction> SelectMasterTransaction(DateTime date1, DateTime date2)
string conString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (con = new SqlConnection(conString))
using(SqlCommand cmd = new SqlCommand("spViewMasterTransaction", con))
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parameterDate1 = new SqlParameter();
parameterDate1.ParameterName = "@date1";
parameterDate1.Value = date1;
cmd.Parameters.Add(parameterDate1);
SqlParameter parameterDate2 = new SqlParameter();
parameterDate2.ParameterName = "@date2";
parameterDate2.Value = date2;
cmd.Parameters.Add(parameterDate2);
con.Open();
using (SqlDataReader dtReader = cmd.ExecuteReader())
while (dtReader.Read())
dcTransaction dcTrans = new dcTransaction();
dcTrans.no_trans = dtReader.GetInt32(0); // Index for "no_trans"
dcTrans.name = dtReader.GetString(1); // Index for "name"
dcTrans.sum = dtReader.GetInt32(2); // Index for "sum"
dcTrans.dates = dtReader.GetDateTime(3); // Index for "dates"
yield return dcTrans;
【讨论】:
这就是我所做的,我将函数更改为“public Listyield return
的示例。但是,是的,这也有效。这取决于您希望它如何发挥作用。
仍然只返回一条记录,但它出现了,长度=1,但我的数据库记录不止于此..
您确定您的WHERE
子句没有限制结果计数吗?
另外,@KeVin,当您逐步完成此操作时会发生什么?是不是好像多次通过while
?以上是关于传递给wcftestclient时如何循环datareader?的主要内容,如果未能解决你的问题,请参考以下文章