sqlServer模式下 DataTable存session后,sesssion更新后取不到最新的Session

解决方案 »

  1.   

    Session更新后取不到新的session什么意思?
      

  2.   

    #region 保存选中的数据
    private DataTable SaveData()//string GoodsID)
    {
    try
    {
    int rowcount;
    //读取内容中的数据
    DataTable  dt=Session["ExecCaptureData"] as DataTable;
    BLL.PublicClass.DataSetSerializer.erroLog(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+Session.SessionID+"行号:(263)保存选中的数据\n\r");
    BLL.PublicClass.DataSetSerializer.erroLog(Session["ExecCaptureTable"].ToString()+"\n\r");
    BLL.PublicClass.DataSetSerializer.erroLog(dt.Rows.Count.ToString()+"\n\r");
    rowcount=dt.Rows.Count;
    DataRow  dr=dt.NewRow();
    // dr["GoodsID"]="";//主键
    if(dt.Rows.Count==1)
    {
    dr["Num"]="1";
    }
    else
    {
    int num=int.Parse(dt.Rows[dt.Rows.Count-1]["Num"].ToString())+1;//当前最大的号加1
    dr["Num"]=num.ToString();
    }
    dr["GoodsID"]=dr["Num"].ToString();//主键
    dr["GoodsName"]="";//ProofID没赋值
    dr["GoodsUnit"]="";
    dr["GoodsNum"]="";
    dr["GoodsCharacter"]="";
    dr["Re"]="";
    // dr["Menu_ID"]=""; dt.Rows.Add(dr);
    this.Session.RemoveAll();
    this.Session.Clear();
    this.Session.Remove("ExecCaptureData");
    //存储
    Session["ExecCaptureData"]=dt;
    BLL.PublicClass.DataSetSerializer.erroLog(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+Session.SessionID+"行号:(289)保存选中的数据\n\r");
    BLL.PublicClass.DataSetSerializer.erroLog(Session["ExecCaptureTable"].ToString()+"\n\r");
    BLL.PublicClass.DataSetSerializer.erroLog(dt.Rows.Count.ToString()+"\n\r");
    Session["CardState"]=""; return dt;
    }
    catch(Exception ex)
    {
    return null;
    }
    }
    #endregion  //更改缓存中的数据
    [AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)]
    public bool Ajax_SaveData(string str)
    {
    try
    {
    DataTable  dt=Session["ExecCaptureData"] as DataTable;
    string [] arr=str.Split(',');
    for(int i=0;i<dt.Rows.Count;i++)
    {
    if(dt.Rows[i]["GoodsID"].ToString()==arr[0])
    {
    dt.Rows[i]["GoodsName"]=arr[1];//名称
    dt.Rows[i]["GoodsUnit"]=arr[2];//规格
    dt.Rows[i]["GoodsNum"]=arr[3];//数量
    dt.Rows[i]["GoodsCharacter"]=arr[4];//特征
    dt.Rows[i]["Re"]=arr[5];//发还情况<br>(接收人签收)
    }
    }


    //存储
    Session["ExecCaptureData"]=dt;
    BLL.PublicClass.DataSetSerializer.erroLog(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+Session.SessionID+"行号:(384)\n\r");
    BLL.PublicClass.DataSetSerializer.erroLog(Session["ExecCaptureTable"].ToString()+"\n\r");
    BLL.PublicClass.DataSetSerializer.erroLog(dt.Rows.Count.ToString()+"\n\r"); return true;
    }
    catch
    {
    return true;
    }
    }
      

  3.   

    Session["ExecCaptureData"]这个本来存了的数据时一个datatable得内容有三条数据,但是当我给更新成四条数据之后,再取还是取到三条数据
      

  4.   

    private DataTable SaveData()//string GoodsID) 

    try 

    int rowcount; 
    //读取内容中的数据 
    DataTable  dt=Session["ExecCaptureData"] as DataTable; 
    BLL.PublicClass.DataSetSerializer.erroLog(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+Session.SessionID+"行号:(263)保存选中的数据\n\r"); 
    BLL.PublicClass.DataSetSerializer.erroLog(Session["ExecCaptureTable"].ToString()+"\n\r"); 
    BLL.PublicClass.DataSetSerializer.erroLog(dt.Rows.Count.ToString()+"\n\r"); 
    rowcount=dt.Rows.Count; 
    DataRow  dr=dt.NewRow(); 
    // dr["GoodsID"]="";//主键 
    if(dt.Rows.Count==1) 

    dr["Num"]="1"; 

    else 

    int num=int.Parse(dt.Rows[dt.Rows.Count-1]["Num"].ToString())+1;//当前最大的号加1 
    dr["Num"]=num.ToString(); 

    dr["GoodsID"]=dr["Num"].ToString();//主键 
    dr["GoodsName"]="";//ProofID没赋值 
    dr["GoodsUnit"]=""; 
    dr["GoodsNum"]=""; 
    dr["GoodsCharacter"]=""; 
    dr["Re"]=""; 
    // dr["Menu_ID"]=""; dt.Rows.Add(dr); //存储 
    Session["ExecCaptureData"]=dt; 
    BLL.PublicClass.DataSetSerializer.erroLog(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+Session.SessionID+"行号:(289)保存选中的数据\n\r"); 
    BLL.PublicClass.DataSetSerializer.erroLog(Session["ExecCaptureTable"].ToString()+"\n\r"); 
    BLL.PublicClass.DataSetSerializer.erroLog(dt.Rows.Count.ToString()+"\n\r"); 
    Session["CardState"]=""; return dt; 

    catch(Exception ex) 

    return null; 


    #endregion 
      

  5.   

    DataTable  dt=Session["ExecCaptureData"] as DataTable; 
    此处取不到更新的,只能取到以前的
      

  6.   

    1.你调试一下,确定 SaveData 正确执行完毕
    2.有可能是ajax缓存的问题。所以SaveData 后,你可写个函数取一下,或者在另一个页面取session中的dt的行数。
      

  7.   

    在sessionState mode='InProc'  这种模式下是完全正常的,当更改成sqlserver模式后才不正常的
      

  8.   

    尽量少用session  很容易丢失的
      

  9.   

    在sessionState mode='InProc'  这种模式下是完全正常的,当更改成sqlserver模式后才不正常的
    ==========
    还有这种事?我来试试。
      

  10.   

    我的测试代码,session模式也是sqlserver     void _AddData()
            {
                DataTable dt;
                if (Session["dt"] == null)
                {
                    dt = new DataTable();
                    dt.Columns.Add("name");            }
                else
                {
                    dt = Session["dt"] as DataTable;
                }
                dt.Rows.Add(DateTime.Now.ToLongTimeString());
                Session["dt"] = dt;        }        void _ShowData()
            {
               DataTable  dt = Session["dt"] as DataTable;
               Response.Write(dt.Rows.Count.ToString());
            }        protected void btn1_Click(object sender, EventArgs e)
            {
                this._AddData();
            }        protected void Button2_Click(object sender, EventArgs e)
            {
                this._ShowData();
            }
            
      

  11.   

    ajax +session+sqlserver模式有冲突吗?
      

  12.   

    1.你调试一下,确定 SaveData 正确执行完毕 
    2.有可能是ajax缓存的问题。所以SaveData 后,你可写个函数取一下,或者在另一个页面取session中的dt的行数。 
      

  13.   

    经测试不在ajax获取条数是2
    2009-07-24 10:53:45aszmyo55v2iy0z23drlsuc45行号:(289)保存选中的数据
    NoFirst
    2
    2009-07-24 10:53:53aszmyo55v2iy0z23drlsuc45行号:(481)
    NoFirst
    1
      

  14.   

    随机数没问题,就是session取不到最新的都试过了,别的方法调用时最新的
      

  15.   

    单步跟踪看看,在ajax方法中,能不能取到新的值。
      

  16.   

    有可能是ajax缓存的问题。所以SaveData 后,你可写个函数取一下,或者在另一个页面取session中的dt的行数。 
      

  17.   

    但不调试了,就是ajax中取不到,只要不在ajax中就可以取到
      

  18.   

    我也遇到这种问题了 我的代码
    if (Session["shopping"] == null)
                {
                    DataTable dt = ShopingCar.createShop();
                    dt = ShopingCar.Add(productID, goodName, 1, Convert.ToDouble(goodPrice), Convert.ToDouble(goodPrice), dt);
                    Session["shopping"] = dt;                this.GridView1.DataSource = dt;
                    GridView1.DataBind();
                    DataTable session11 = (DataTable)Session["shopping"];
                    Label4.Text = Convert.ToString(ShopingCar.GetSum(session11));
                }
                else
                {
                    DataTable session = (DataTable)Session["shopping"];
                    for (int i = 0; i < session.Rows.Count; i++)
                    {
                        if (Convert.ToInt32(session.Rows[i]["goodID"]) == productID)
                        {
                            int counta = Convert.ToInt32(session.Rows[0]["goodCount"]) + 1;
                            session = ShopingCar.Update(productID, counta, session);
                            Label4.Text = Convert.ToString(ShopingCar.GetSum(session));
                            GridView1.DataSource = session;
                            GridView1.DataBind();
                            DataTable session11 = (DataTable)Session["shopping"];
                            this.Label4.Text = (ShopingCar.GetSum(session11)).ToString();
                            return;
                        }                }
                    session = ShopingCar.Add(productID, goodName, 1, Convert.ToDouble(goodPrice), Convert.ToDouble(goodPrice), session);
                    GridView1.DataSource = session;
                    GridView1.DataBind();
                }
                DataTable session1 = (DataTable)Session["shopping"];
                this.Label4.Text = (ShopingCar.GetSum(session1)).ToString();
    session有时候得到有时候得不到