为什么会话变量得到更新?
Why Session variable gets update?
我一直在使用 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];
}
}
在其他一些函数中,我使用以下代码从 Session
变量中获取此 DataTable
DataTable dtTemp = (DataTable) Session["CellDirData"];
dtTemp.Rows.RemoveAt(0); // Removing first row from local variable dtTemp
当我从局部变量 dtTemp
中删除第一行时,它还会更新 Session
变量,即现在 dtTemp
和 Session["CellDirData"]
都有 19 行。
我的问题是为什么 Session
在我只使用局部变量的同时获取更新?
因为默认 session 状态模式是 InProc
(in-process)。也就是说,您正在创建指向相同 DataTable
object 的引用,因为 in-process 也意味着 in-memory。
或者换句话说:您的 session、class 字段和局部变量共享相同的沙盒环境和内存,这意味着创建新的 session 状态键几乎与声明新引用(class 字段和局部变量)。
请参阅 session state modes article on MSDN 以了解有关可用模式及其详细信息的更多信息。
如果您想以某种状态存储 session 密钥并继续编辑源 object 而不影响存储的密钥,您应该 序列化 它到 XML 或 JSON(或任何其他序列化格式)。在 Whosebug 上查看其他问答:How to convert datatable to json string using json.net?
我一直在使用 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];
}
}
在其他一些函数中,我使用以下代码从 Session
变量中获取此 DataTable
DataTable dtTemp = (DataTable) Session["CellDirData"];
dtTemp.Rows.RemoveAt(0); // Removing first row from local variable dtTemp
当我从局部变量 dtTemp
中删除第一行时,它还会更新 Session
变量,即现在 dtTemp
和 Session["CellDirData"]
都有 19 行。
我的问题是为什么 Session
在我只使用局部变量的同时获取更新?
因为默认 session 状态模式是 InProc
(in-process)。也就是说,您正在创建指向相同 DataTable
object 的引用,因为 in-process 也意味着 in-memory。
或者换句话说:您的 session、class 字段和局部变量共享相同的沙盒环境和内存,这意味着创建新的 session 状态键几乎与声明新引用(class 字段和局部变量)。
请参阅 session state modes article on MSDN 以了解有关可用模式及其详细信息的更多信息。
如果您想以某种状态存储 session 密钥并继续编辑源 object 而不影响存储的密钥,您应该 序列化 它到 XML 或 JSON(或任何其他序列化格式)。在 Whosebug 上查看其他问答:How to convert datatable to json string using json.net?