我一直在使用ExcelDataReader
阅读xls文件,并将完整的DataTable
放入Session
变量中并附带以下代码
DataSet result = excelReader.AsDataSet(true,Convert.ToInt32(e.Parameter), 20);
if (result.Tables.Count > 0)
{
if (result.Tables[0].Rows.Count > 0)
{
Session["CellDirData"] = result.Tables[0];
}
}
在其他一些功能中,我使用以下代码从DataTable
变量中获取此Session
DataTable dtTemp = (DataTable) Session["CellDirData"];
dtTemp.Rows.RemoveAt(0); // Removing first row from local variable dtTemp
当我从局部变量dtTemp
中删除第一行时,它还会更新Session
变量,即现在dtTemp
和Session["CellDirData"]
都有19行。
我的问题是为什么Session
只在我使用局部变量时获得更新?
答案 0 :(得分:2)
因为默认会话状态模式为InProc
(正在进行中)。也就是说,您正在创建指向同一DataTable
对象的引用,因为进程内也意味着内存中。
或者换句话说:您的会话,类字段和局部变量共享相同的沙盒环境和内存,这意味着创建新的会话状态键几乎与声明新引用(类字段和局部变量)相同。
请参阅会话state modes article on MSDN,详细了解可用模式及其详细信息。
如果要在某种状态下存储会话密钥并继续编辑源对象而不影响存储的对象,则应将其序列化为XML或JSON(或任何其他序列化格式)。在StackOverflow上查看此其他Q& A:How to convert datatable to json string using json.net?