DataReader是一个向前的只读的流!如果要重复使用那么要重新执行查询得到这个流.
他和以前的asp里的数据存取是一样的!他并没有在内存中建立一个缓冲区来存储数据!

解决方案 »

  1.   

    DataReader是一个查询数据库后返回的只读数据流。它一次只能包含一行数据,而且它有一个限制:只能前向的读取数据。DataReader的确支持对多个结果集的访问,但是一次只能访问一次(按照检索的顺序)。正如ADO的最初版本那样,一旦DataReader到数据库的连接中断,就无法再访问数据了,这就意味着在DataReader的使用期间,它与数据库之间的连接不能断开。只有当连接断开时,才可以访问输出参数或者返回值。
      

  2.   

    当然每次按Button1只前进到第二条记录,因为每次按Button页面提交Page_load和Button1_click都重新执行。
    你可以用可持续存在变量记录下你的点击次数在Button1_click中移动点击次数条记录,推荐用视图对象保存
      

  3.   

    我说怎么那么怪,原来每按一次Button1,Page_load和Button1_click都重新执行一次啊,太谢谢了.
      

  4.   

    还有一个疑问,如果每按一次Button1,Page_load和Button1_click都重新执行一次,那么用DataSet,不也会同样只能前进到第二条记录吗?可否指点详细一点
      

  5.   

    datareader只向前读取记录 ,不能返回读取,要想返回可用Dataset
      

  6.   

    add  (!Page.IsPostback())  to  avoid it ,  your second question .
      

  7.   

    不管按什么按钮,都会触发Page_load一次
      

  8.   

    to redbb(Dotneter)
    add  (!Page.IsPostback())  to  avoid it ,  your second question .
    是什么意思,要加入到什么地方?
    如果只用DataReader我的这种想法可行吗,因为我只要读取不要回送数据,如何分次读取?
      

  9.   

    private void page_load(object sender,eventargs e)
    if(!Page.IsPostback())  
    {
    操作数据库datareader
    }
      

  10.   


    把SqlDataReader sqlda;定义成局部变量
    在读取时 用 while (sqlda.Read())  {  .....}
      

  11.   

    private void page_load(object sender,eventargs e)
    {
    if(!Page.IsPostback())  
    {
    your  action  ,  this can run once  when page load
    }
    this code can run every time }
      

  12.   

    不行有错误!请各位再帮忙看一下
    代码:using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using WebApplication1.db;
    using WebApplication1.service;namespace WebApplication1
    {
    public class WebForm2 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Label lblQty1;
    protected System.Web.UI.WebControls.Label lblPrice1;
    protected System.Web.UI.WebControls.Label lblPage1;
    protected System.Web.UI.HtmlControls.HtmlImage Img1;
    protected System.Web.UI.WebControls.HyperLink linkCart1;
    protected System.Web.UI.WebControls.Panel Panel1;
    protected System.Web.UI.WebControls.Button Button1;
    SqlDataReader sqlda; private void Page_Load(object sender, System.EventArgs e)
    {
    if(!Page.IsPostBack)  
    {
    SqlConnection sqlconn=null;
    SqlDataReader sqlda;
    string sqlstr;
    sqlconn=sqlconnectdb.getConnection();
    sqlstr="select * from goodsinfo ";
    sqlconn.Open();
    SqlCommand sqlcmd = new SqlCommand(sqlstr,sqlconn);
            sqlda = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection);
    if(sqlda.Read())
    {
    if (@sqlda["goodsImagePath"].ToString()!="")
    Img1.Src =@sqlda["goodsImagePath"].ToString();
    else
    Img1.Src =@"pic/noimage.gif";
    lblPrice1.Text=@sqlda["goodsPrice"].ToString();
    lblQty1.Text=@sqlda["goodsiDetails"].ToString();
    lblPage1.Text=@sqlda["goodsName"].ToString();
    linkCart1.ImageUrl=@"images/Shop1.gif";
    linkCart1.NavigateUrl="WebForm_input.aspx";
    }
    else
    {
    Img1.Src ="";
    lblPrice1.Text="";
    lblQty1.Text="";
    lblPage1.Text="";
    linkCart1.ImageUrl="";
    linkCart1.NavigateUrl="";
    }

    }
    } private void Button1_Click(object sender, System.EventArgs e)
    {
    if(sqlda.Read())
    {
    if (@sqlda["goodsImagePath"].ToString()!="")
    Img1.Src =@sqlda["goodsImagePath"].ToString();
    else
    Img1.Src =@"pic/noimage.gif";
    lblPrice1.Text=@sqlda["goodsPrice"].ToString();
    lblQty1.Text=@sqlda["goodsiDetails"].ToString();
    lblPage1.Text=@sqlda["goodsName"].ToString();
    linkCart1.ImageUrl=@"images/Shop1.gif";
    linkCart1.NavigateUrl="WebForm_input.aspx";
    }
    else
    {
    Img1.Src ="";
    lblPrice1.Text="";
    lblQty1.Text="";
    lblPage1.Text="";
    linkCart1.ImageUrl="";
    linkCart1.NavigateUrl="";
    }
    }
    }
    }
    报错:
    未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
    行 251: private void Button1_Click(object sender, System.EventArgs e)
    行 252: {
    行 253: if(sqlda.Read())----注就是这行报错!!!
    行 254: {
    行 255: if (@sqlda["goodsImagePath"].ToString()!="")
     
      

  13.   

    add  SqlDataReader sqlda;
      

  14.   

    add SqlConnection sqlconn=null;
    SqlDataReader sqlda;
    string sqlstr;
    sqlconn=sqlconnectdb.getConnection();
    sqlstr="select * from goodsinfo ";
    sqlconn.Open();
    SqlCommand sqlcmd = new SqlCommand(sqlstr,sqlconn);
            sqlda = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection);
      

  15.   

    搞了半天只要在第一次声名sqlda时加上static 就行了,
    static SqlDataReader sqlda;
    静态变量会记录上次的情况,而不会每次都重新初始化
    只是在实际情况下并不适用,所有用户都共享这个sqlda,如果A用户前进到第二条记录,B用户按BOTTON 就会直接前进到第三条记录,看来用DataReader来完美的实现是有困难的.