传递给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 已经将这些字段返回为ints。您不需要解析字符串表示。这不是导致您的问题的原因,但这是一种非常低效的方法。您还应该添加一些using 语句。我将在我的代码中进行这两项更改以显示一个示例。 【参考方案1】:

您正在返回单个对象,请将您的方法定义更改为返回 List&lt;dcTransaction&gt;,如下所示

 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&lt;dcTransaction&gt;,或者只需执行经典的List&lt;T&gt; 并在每次循环中添加。

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 List SelectMasterTransaksi(DateTime tanggalAwal, DateTime tanggalAkhir)”但返回 dcTrans,给我一个错误,例如“无法隐式转换类型dcTransaction 到 System.Collection.generic.list @KeVin 我更改了答案以显示yield return 的示例。但是,是的,这也有效。这取决于您希望它如何发挥作用。 仍然只返回一条记录,但它出现了,长度=1,但我的数据库记录不止于此.. 您确定您的WHERE 子句没有限制结果计数吗? 另外,@KeVin,当您逐步完成此操作时会发生什么?是不是好像多次通过while

以上是关于传递给wcftestclient时如何循环datareader?的主要内容,如果未能解决你的问题,请参考以下文章

将带有列表文件的数组传递给 curl 循环

将变量传递给 $.ajax().done()

如何将向量中的值传递给带有多个参数的函数

如何在 WCF 测试客户端 (WcfTestClient.exe) 中指定列表参数?

如何将关键部分传递给另一个线程?

将多个变量传递给视图?