在调试我的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;
答案 0 :(得分:0)
如果你实际上没有execptions的while语句,那么显而易见的答案是你的datareader没有数据。尝试在while循环之前检查reader.HasRows
的值。我想它会是假的。你的sql语句实际上是否在SQL Developer中返回数据?
答案 1 :(得分:0)
循环不执行有两个可能的原因:
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;