DataReader的奇怪问题,没有数据时DataReader.Read()返回true,我如何是好?

coolliu 2003-08-22 06:07:25
string query=Session["queryClause"].ToString();
//总的统计信息
string queryTotal="SELECT min(substr(zbxh,1,8)) as dateStart,max(substr(zbxh,1,8)) as dateEnd,sum(bhfl) as sumBhfl from cm_v_jzxxb where "+query;
OracleConnection conn=new OracleConnection(myLink.ConnectionString);
OracleCommand comm=new OracleCommand(queryTotal,conn);
conn.Open();
reader=comm.ExecuteReader();
if(reader.Read())
{
dateStart=reader.GetString(0);
dateEnd=reader.GetString(1);
sumBhfl=reader.GetDouble(2);
this.lblDateStart.Text=dateStart.Substring(0,4)+"年"+dateStart.Substring(4,2)+"月"+dateStart.Substring(6,2)+"日";
this.lblDateEnd.Text=dateEnd.Substring(0,4)+"年"+dateEnd.Substring(4,2)+"月"+dateEnd.Substring(6,2)+"日";
this.lblSumBhfl.Text=sumBhfl.ToString();
}
reader.Close();
conn.Close();
数据库为oracle,从session传过来查询条件.当有满足条件的数据时,程序正常.当没有满足条件的数据时,reader.Read()居然也为true,下面的语句当然出错.报错为
//以上为错误信息
不存在此行或列的数据。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 不存在此行或列的数据。

源错误:


行 59: if(reader.Read())
行 60: {
行 61: dateStart=reader.GetString(0);
行 62: dateEnd=reader.GetString(1);
行 63: sumBhfl=reader.GetDouble(2);

请大家看看,怎么回事?
...全文
238 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liudd 2003-09-13
  • 打赏
  • 举报
回复
我有这方面的资料,请联系37293032
gong1 2003-09-13
  • 打赏
  • 举报
回复
取出树来先判断一下./
在执行操作
cl_03 2003-09-13
  • 打赏
  • 举报
回复
还没解决吗?

那就用这个属性myReader.HasRows

有一行或多行数据时为true;
酋长 2003-08-22
  • 打赏
  • 举报
回复
是数据库取值的问题
进行两次判断
First:if myReader.Read=true
Second:use IsDBnull判断
wacle 2003-08-22
  • 打赏
  • 举报
回复
对OracleDataReader不熟悉,相信应该是这个指令在没有读到数据时跟其他类型数据库的datareader的处理方式有些不一样把
cl_03 2003-08-22
  • 打赏
  • 举报
回复
try
{}
catch
{}
一下
netzww 2003-08-22
  • 打赏
  • 举报
回复
我也遇到过此类问题,是数据库的问题,改个表名看看,看看字段有没有问题
seesea125 2003-08-22
  • 打赏
  • 举报
回复
有没有数据这里写错了也不行啊,不存在此行或列的数据,看看sql哪个地方写错列名了
coolliu 2003-08-22
  • 打赏
  • 举报
回复
我把生成的查询语句直接在数据库中进行查找,的确是空的,没有一条数据.
caoit 2003-08-22
  • 打赏
  • 举报
回复
看看数据库里的内容吧
momoguagua 2003-08-22
  • 打赏
  • 举报
回复
有时候好像是这样,可能是数据库的数据问题吧,我用Sql的查询分析器看的时候,的确又以行,不过是空的,你先判断一下reader.IsNull(0),然后再读数据
1.cmd.ExecuteReader(); 2.cmd.ExecuteNonQuery(); 3.cmd.ExecuteScalar(); 4.cmd.ExecuteXmlReader();)  1,ExecuteReader();返回一个OracleDataReader对象可以通过这个对象来检查查询结果,从结果中读取一行之后,移动到另一行,则前一行就无法再用。有一点要注意的是执行之后,要等到手动去调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同此方法也返回一个Bool值,表明下一行是否可用,返回True则可用,返回False则到达结果集末尾。 使用DataReader可以提高执行效率,有两种方式可以提高代码的性能:一种是基于序号的查找,一个是使用适当的Get方法来查找。因为查询出来的结果一般都不会改变,除非再次改动查询语句,因此可以通过定位列的位置来查找记录。用这种方法有一个问题,就是可能知道一列的名称而不知道其所在的位置,这个问题的解决方案是通过调用DataReader 对象的GetOrdinal()方法,此方法接收一个列名并返回此列名所在的列号。例: int id=reader.GetOrdinal("CategoryName"); while(reader.Read()) { Response.Write(reader[id]); reader.Close(); 至于第二种方式很直观,例:  while(reader.Read()) {   ?Response.Write(reader.GetInt32(0).ToString()+" "+reader.GetString(1).ToString()+" "); }  DataReader的GetInt32()和GetString()通过接收一个列号来返回一个列的值,这两种是最常用的,其中  还有很多其它的类型。 。。。。

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧