none
如何生public DataSet RRS feed

  • 问题

  • 如题:如何生public DataSet,我想在一页面Load时生成一DataSet ,当前页面的其它方法可以引用它。
    public partial class ASPX_test : System.Web.UI.Page
        {
            private int i = 0;
            public DataSet ds;
                ...
                ...
                ...

    以上是我的代码报错。应如何做呢?TKS
    2009年6月16日 9:18

答案

  • 2009年6月16日 9:37
    版主
  • 如果是在一个页面执行过程中使用,这样写是没有问题的。如果有页面的回发,则可以采用ViewState或者Cache都可以

    Cache.Add("ds",ds);存入
    ds = (DataSet )Cache["ds"];提取


    【孟子E章】
    2009年6月16日 12:23
    版主
  • 如题:如何生public DataSet,我想在一页面Load时生成一DataSet ,当前页面的其它方法可以引用它。
    public partial class ASPX_test : System.Web.UI.Page
        {
            private int i = 0;
            public DataSet ds;
                ...
                ...
                ...

    以上是我的代码报错。应如何做呢?TKS

    Hi,
       你一定生命了一个DataSet ds引用了,在page_load方法里你在给它实例化一个DataSet 对象。
    ds=new DataSet();
    DataTable t = new DataTable();
    ds.Merge(t);
      这个也是是在一个页面生命周期里能操作,页面销毁以后就没有了,其它几个的建议无论放到viewstate还是cache里 都是在内存了保存一个副本。
    下次再进入这个页面还可以看到数据。
      如果你只需要在当前页面每次操作完毕后不需要下次进入页面共享原有的数据,就不需要存放了。需要耗费内存~


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://www.cnblogs.com/frank_xl
    2009年6月16日 13:04
    版主
  •     public DataSet Employee
        {
            get
            {
                if (Session["Employee"] == null)
                {
                    DataTable fEmployee = new DataTable();
                    fEmployee.Columns.Add(new DataColumn("EmployeeKey", typeof(int))); // 员工 Id
                    fEmployee.Columns.Add(new DataColumn("Name", typeof(string))); // 员工名称
                    fEmployee.Columns.Add(new DataColumn("ModifyDate", typeof(string))); // 员工名称
    
                    fEmployee.Rows.Add(new object[] { 0, "X.X.Y", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 1, "Chole", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 2, "Tony", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 3, "John", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 4, "Chirs", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 5, "Li", DateTime.Now });
    
                    DataSet fDataSet = new DataSet();
                    fDataSet.Tables.Add(fEmployee);
                    Session["Employee"] = fDataSet;
                }
    
                return (DataSet)Session["Employee"];
            }
        }

    知识改变命运,奋斗成就人生!
    2009年6月17日 1:17
    版主
  • 在第一次加载的时个把数据放到 Cache, Session 或 ViewState 中
    知识改变命运,奋斗成就人生!
    2009年6月17日 3:28
    版主
  • 你可以采用存储过程来实现。

    再次提醒:web程序与winform的思想是不不同的。web是无序的、界面和程序分布在客户端和服务器端
    【孟子E章】
    2009年6月17日 4:52
    版主

全部回复

  •     public DataSet MakeDataTableAndDisplay()
        {
            DataTable table = new DataTable();
    
            DataColumn column;
            DataRow row;
            DataView view;
            DataSet ds = new DataSet();
    
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.Int32");
            column.ColumnName = "id";
            table.Columns.Add(column);
    
            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "item";
            table.Columns.Add(column);
    
            for (int i = 0; i < 10; i++)
            {
                row = table.NewRow();
                row["id"] = i;
                row["item"] = "item " + i.ToString();
                table.Rows.Add(row);
            }
    
            view = new DataView(table);
    
            ds.Merge(table);
    
            return ds;
        }
    
    2009年6月16日 9:28
  • 2009年6月16日 9:37
    版主
  • 放到viewstate里


    http://feiyun0112.cnblogs.com/

    能说具体吗?TKS.
    2009年6月16日 9:41
  • 如果是在一个页面执行过程中使用,这样写是没有问题的。如果有页面的回发,则可以采用ViewState或者Cache都可以

    Cache.Add("ds",ds);存入
    ds = (DataSet )Cache["ds"];提取


    【孟子E章】
    2009年6月16日 12:23
    版主
  • 如题:如何生public DataSet,我想在一页面Load时生成一DataSet ,当前页面的其它方法可以引用它。
    public partial class ASPX_test : System.Web.UI.Page
        {
            private int i = 0;
            public DataSet ds;
                ...
                ...
                ...

    以上是我的代码报错。应如何做呢?TKS

    Hi,
       你一定生命了一个DataSet ds引用了,在page_load方法里你在给它实例化一个DataSet 对象。
    ds=new DataSet();
    DataTable t = new DataTable();
    ds.Merge(t);
      这个也是是在一个页面生命周期里能操作,页面销毁以后就没有了,其它几个的建议无论放到viewstate还是cache里 都是在内存了保存一个副本。
    下次再进入这个页面还可以看到数据。
      如果你只需要在当前页面每次操作完毕后不需要下次进入页面共享原有的数据,就不需要存放了。需要耗费内存~


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://www.cnblogs.com/frank_xl
    2009年6月16日 13:04
    版主
  •     public DataSet Employee
        {
            get
            {
                if (Session["Employee"] == null)
                {
                    DataTable fEmployee = new DataTable();
                    fEmployee.Columns.Add(new DataColumn("EmployeeKey", typeof(int))); // 员工 Id
                    fEmployee.Columns.Add(new DataColumn("Name", typeof(string))); // 员工名称
                    fEmployee.Columns.Add(new DataColumn("ModifyDate", typeof(string))); // 员工名称
    
                    fEmployee.Rows.Add(new object[] { 0, "X.X.Y", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 1, "Chole", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 2, "Tony", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 3, "John", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 4, "Chirs", DateTime.Now });
                    fEmployee.Rows.Add(new object[] { 5, "Li", DateTime.Now });
    
                    DataSet fDataSet = new DataSet();
                    fDataSet.Tables.Add(fEmployee);
                    Session["Employee"] = fDataSet;
                }
    
                return (DataSet)Session["Employee"];
            }
        }

    知识改变命运,奋斗成就人生!
    2009年6月17日 1:17
    版主
  • 谢谢各位,按你们提示作了如个修改:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    
     
    
        public partial class ASPX_test : System.Web.UI.Page
        {
            myClass myFun = new myClass();
    
            private int i = 0;
            public DataSet ds ;
         
            //   private SqlConnection pncon;
            //   public SqlDataAdapter sda;
            //   public SqlCommandBuilder cmdBuild;
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
                DataSet ds = myFun.GetDataSet("select   A,B,C,D  from   Goods where 1=1");
              
                this._CursorSkip();
    
            }
    
            protected void _CursorSkip()
            {         
    
                this.TextBox2.Text = ds.Tables[0].Rows[i][0].ToString();
                this.TextBox3.Text = ds.Tables[0].Rows[i][1].ToString();
                this.TextBox4.Text = ds.Tables[0].Rows[i][2].ToString();
                this.TextBox5.Text = ds.Tables[0].Rows[i][3].ToString();
    
            }
    
     
    
     
    
            protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
            {
    
            }
            protected void Button3_Click(object sender, EventArgs e)
            {
                this.MultiView1.ActiveViewIndex = 2 - 1;
    
            }
            protected void Button2_Click(object sender, EventArgs e)
            {
                this.MultiView1.ActiveViewIndex = 3 - 1;
    
            }
            protected void Button4_Click(object sender, EventArgs e)
            {
                this.MultiView1.ActiveViewIndex = 1 - 1;
    
            }
            protected void Button8_Click(object sender, EventArgs e)
            {
                i = ds.Tables[0].Rows.Count;
            }
            protected void Button12_Click(object sender, EventArgs e)  
            {
                if (i < ds.Tables[0].Rows.Count)
                {
                    i += 1;
                }
                this._CursorSkip();
    
            }
            protected void Button11_Click(object sender, EventArgs e)
            {
                if (i > 0)
                {
                    i -= 1;
                }
                this._CursorSkip();
            }
            protected void Button6_Click(object sender, EventArgs e)
            {
                i = 0;
                this._CursorSkip();
            }
    }
    
    


    说明:其中GetDataSet是我写在myClass中的一个通用函数


    运行报错如下:
    未将对象引用设置到对象的实例。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

    源错误:


    行 44:             //da.Fill(ds);
    行 45:
    行 46:             this.TextBox2.Text = ds.Tables[0].Rows[i][0].ToString();
    行 47:             this.TextBox3.Text = ds.Tables[0].Rows[i][1].ToString();
    行 48:             this.TextBox4.Text = ds.Tables[0].Rows[i][2].ToString();

    应如何纠错.TKS


     

    2009年6月17日 1:37
  • 你好,索引越界了!
    邹俊才
    2009年6月17日 1:48
    版主
  • 能说具体点吗?应如何纠正
    2009年6月17日 1:51
  • 谢谢各位,按你们提示作了如个修改:

    using System;
    
    using System.Data;
    
    using System.Configuration;
    
    using System.Collections;
    
    using System.Web;
    
    using System.Web.Security;
    
    using System.Web.UI;
    
    using System.Web.UI.WebControls;
    
    using System.Web.UI.WebControls.WebParts;
    
    using System.Web.UI.HtmlControls;
    
    using System.Data.SqlClient;
    
    
    
     
    
    
    
        public partial class ASPX_test : System.Web.UI.Page
    
        {
    
            myClass myFun = new myClass();
    
    
    
            private int i = 0;
    
            public DataSet ds ;
    
         
    
            //   private SqlConnection pncon;
    
            //   public SqlDataAdapter sda;
    
            //   public SqlCommandBuilder cmdBuild;
    
    
    
            protected void Page_Load(object sender, EventArgs e)
    
            {
    
    
                
                       
    
                this._CursorSkip();
    
    
    
            }
    
    
    
            protected void _CursorSkip()
    
            {         
    
                 DataSet ds = myFun.GetDataSet("select   A,B,C,D  from   Goods where 1=1"); //放在这里页面就可运行了
    
    
    
                this.TextBox2.Text = ds.Tables[0].Rows[i][0].ToString();
    
                this.TextBox3.Text = ds.Tables[0].Rows[i][1].ToString();
    
                this.TextBox4.Text = ds.Tables[0].Rows[i][2].ToString();
    
                this.TextBox5.Text = ds.Tables[0].Rows[i][3].ToString();
    
    
    
            }
    
    
    
     
    
    
    
     
    
    
    
            protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
    
            {
    
    
    
            }
    
            protected void Button3_Click(object sender, EventArgs e)
    
            {
    
                this.MultiView1.ActiveViewIndex = 2 - 1;
    
    
    
            }
    
            protected void Button2_Click(object sender, EventArgs e)
    
            {
    
                this.MultiView1.ActiveViewIndex = 3 - 1;
    
    
    
            }
    
            protected void Button4_Click(object sender, EventArgs e)
    
            {
    
                this.MultiView1.ActiveViewIndex = 1 - 1;
    
    
    
            }
    
            protected void Button8_Click(object sender, EventArgs e)
    
            {
    
                i = ds.Tables[0].Rows.Count;
    
            }
    
            protected void Button12_Click(object sender, EventArgs e)  
    
            {
    
                if (i < ds.Tables[0].Rows.Count)
    
                {
    
                    i += 1;
    
                }
    
                this._CursorSkip();
    
    
    
            }
    
            protected void Button11_Click(object sender, EventArgs e)
    
            {
    
                if (i > 0)
    
                {
    
                    i -= 1;
    
                }
    
                this._CursorSkip();
    
            }
    
            protected void Button6_Click(object sender, EventArgs e)
    
            {
    
                i = 0;
    
                this._CursorSkip();
    
            }
    
    }
    
    
    
    
    
    


    说明:其中GetDataSet是我写在myClass中的一个通用函数


    运行报错如下:
    未将对象引用设置到对象的实例。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

    源错误:


    行 44:             //da.Fill(ds);
    行 45:
    行 46:             this.TextBox2.Text = ds.Tables[0].Rows[i][0].ToString();
    行 47:             this.TextBox3.Text = ds.Tables[0].Rows[i][1].ToString();
    行 48:             this.TextBox4.Text = ds.Tables[0].Rows[i][2].ToString();

    应如何纠错.TKS


     

    把这句 DataSet ds = myFun.GetDataSet("select   A,B,C,D  from   Goods where 1=1");  放在_cursorskip()中,页面就可运行了,但运行到第二行记录就无效了,再点"Next"页面数据还是停留在行2上. 难道 i+=1 没执行?
    2009年6月17日 2:18
  • 楼主:

     DataSet ds = myFun.GetDataSet("select   A,B,C,D  from   Goods where 1=1"); //放在这里页面就可运行了
    
    
    
                this.TextBox2.Text = ds.Tables[0].Rows[i][0].ToString();
    
                this.TextBox3.Text = ds.Tables[0].Rows[i][1].ToString();
    
                this.TextBox4.Text = ds.Tables[0].Rows[i][2].ToString();
    
                this.TextBox5.Text = ds.Tables[0].Rows[i][3].ToString();


    你可以设置断点 , 看看 ds 是否取到值! 问题就清晰了!
    2009年6月17日 2:33
    版主
  • 在page_load上面呀,经调试发现 每次页面load时,i又重置为0了,这Web程序怎么与winform区别这么大呀,应如何避免呢?
    (重新学一门语言真痛苦呀,经验0起步......)
    2009年6月17日 2:54
  • 在page_load上面呀,经调试发现 每次页面load时,i又重置为0了,这Web程序怎么与winform区别这么大呀,应如何避免呢?
    (重新学一门语言真痛苦呀,经验0起步......)
    两者思想是完全不同的。你不要使用winform的思想做web程序,切记切记。

    上面不是告诉你使用缓存了吗??
    【孟子E章】
    2009年6月17日 3:09
    版主
  • 在第一次加载的时个把数据放到 Cache, Session 或 ViewState 中
    知识改变命运,奋斗成就人生!
    2009年6月17日 3:28
    版主
  • 谢谢以上两位.

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    
     
    
        public partial class ASPX_test : System.Web.UI.Page
        {
            myClass myFun = new myClass();
    
          //  public int i = 0;
            public DataSet ds=null;
            
       
    
           // Cache.Add("ds",ds);//存入
           // ds = (DataSet )Cache["ds"];//提取
            
    
    
    
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    Session["nCurrentPage"] ="0";
                }
                    
                    this._CursorSkip();
                   
            }
    
            protected void _CursorSkip()
            {
                     ds = myFun.GetDataSet("select   a,b,c,d  from  Goods where 1=1");
                string   ii = Session["nCurrentPage"].ToString();
                int i = Convert.ToInt32(ii);
    
                this.TextBox2.Text = ds.Tables[0].Rows[i][0].ToString();
                this.TextBox3.Text = ds.Tables[0].Rows[i][1].ToString();
                this.TextBox4.Text = ds.Tables[0].Rows[i][2].ToString();
                this.TextBox5.Text = ds.Tables[0].Rows[i][3].ToString();
    
    
            }
    
    
    
    
    
            protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
            {
    
            }
            protected void Button3_Click(object sender, EventArgs e)
            {
                this.MultiView1.ActiveViewIndex = 2 - 1;
    
            }
            protected void Button2_Click(object sender, EventArgs e)
            {
                this.MultiView1.ActiveViewIndex = 3 - 1;
    
            }
            protected void Button4_Click(object sender, EventArgs e)
            {
                this.MultiView1.ActiveViewIndex = 1 - 1;
    
            }
    
    
            /// <summary>
            ///   this is  test for andy
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Button8_Click(object sender, EventArgs e)
            {
                Session["nCurrentPage"] =Convert.ToString(ds.Tables[0].Rows.Count - 1);
                this._CursorSkip();
            }
            protected void Button12_Click(object sender, EventArgs e)
            {
               // if (i < ds.Tables[0].Rows.Count-1)
               // {
                Session["nCurrentPage"] = Convert.ToString( Convert.ToInt32(Session["nCurrentPage"].ToString())+ 1);
              //  }
                this._CursorSkip();
    
            }
            protected void Button11_Click(object sender, EventArgs e)
            {
               // if (i > 0)
              //  {
                    //i -= 1;
                Session["nCurrentPage"] =Convert.ToString(Convert.ToInt32(Session["nCurrentPage"].ToString()) - 1);
              //  }
                this._CursorSkip();
            }
            protected void Button6_Click(object sender, EventArgs e)
            {
                Session["nCurrentPage"] = "0";
                this._CursorSkip();
            }
    }
    
    


    最后改为Session实现了要求,但总感觉查询时慢时快,性能不好。以上代码是每次都从后台取一次结果集,能不能只在第一次页面加载时得出结果集,后续Prior,Next时移动记录指针定位到相应行即可,应如何改?TKS。

    2009年6月17日 4:33
  • 你可以采用存储过程来实现。

    再次提醒:web程序与winform的思想是不不同的。web是无序的、界面和程序分布在客户端和服务器端
    【孟子E章】
    2009年6月17日 4:52
    版主
  • 结贴,谢谢各位.
    2009年6月17日 5:54