c#while循环播放

时间:2013-12-09 17:13:44

标签: c# oracle wcf while-loop

在调试我的wcf时调用它跳过while循环而不是读取内部数据。我一直在SO和msdn上寻求帮助,似乎没什么可以突出的。任何人都有任何关于我缺少或做什么的线索导致这个循环不能迭代?

解决方案:这是一个数据库问题,一旦我更新了SQL开发人员运行的查询并且调试在VS2010中运行的Oracle数据库值。

由于

            using (connection)
        {
            try {
                connection.ConnectionString = connString;
                OracleCommand command = new OracleCommand(sqlString, connection);
                connection.Open();
                OracleDataReader reader = command.ExecuteReader();

                while (reader.Read()) {

                    td.TNAME = reader.IsDBNull(0) ? " " : reader.GetValue(0).ToString();

                    td.TASK = reader.IsDBNull(1) ? " " : reader.GetValue(1).ToString();

                    td.STATUS = reader.IsDBNull(2) ? " " : reader.GetValue(2).ToString();

                    td.COMPLETE = reader.IsDBNull(3) ? " " : reader.GetValue(3).ToString();

                    td.PRIORITY = reader.IsDBNull(4) ? 0 : Convert.ToInt32(reader.GetValue(4));

                    tl.Add(td);
                }
            //while (reader.NextResult());

            reader.Close();
            } catch (Exception ex)  {
                myErr = ex.Message;
            }
        }
        return tl;

4 个答案:

答案 0 :(得分:0)

如果你实际上没有execptions的while语句,那么显而易见的答案是你的datareader没有数据。尝试在while循环之前检查reader.HasRows的值。我想它会是假的。你的sql语句实际上是否在SQL Developer中返回数据?

答案 1 :(得分:0)

循环不执行有两个可能的原因:

  1. 循环之前的代码有一个例外。
  2. reader.Read()不会返回任何数据。

答案 2 :(得分:0)

当然,如果您的循环从未执行,那么查询不会返回任何数据,但我发现您的代码中存在另一个问题。变量td永远不会被重新初始化,并且在您添加到列表的每个循环中,使用从当前循环值中提取的值更新相同的变量。

所以你以tl中的最后一个循环的值结束(无论是什么)

我认为你应该写

while (reader.Read()) 
{
    td = new YourTDClass();  // Create a new instance of an element of td class

    td.TNAME = reader.IsDBNull(0) ? " " : reader.GetValue(0).ToString();
    td.TASK = reader.IsDBNull(1) ? " " : reader.GetValue(1).ToString();
    td.STATUS = reader.IsDBNull(2) ? " " : reader.GetValue(2).ToString();
    td.COMPLETE = reader.IsDBNull(3) ? " " : reader.GetValue(3).ToString();
    td.PRIORITY = reader.IsDBNull(4) ? 0 : Convert.ToInt32(reader.GetValue(4));
    tl.Add(td);
}

答案 3 :(得分:0)

我认为你应该写得更轻松:

var list = new List<dynamic>();
while(dr.Read())
{
   var value = new YourClass { 

      propClassString =    dr.GetString(0),     //for string
      propClassInt =       dr.GetInt32(1),      //for int
      propClassDateTime =  dr.GetDateTime(2)    //for datetime
            
    };        
    list.Add(value);
}
return list;