3

我在使用 Session Variables 时遇到了一些麻烦,因为它们被用作Reference并且我想将它们用作value

我开始调试我的解决方案,并创建了类似的东西:

DataTable dt = 
     (DataTable)HttpContext.Current.Session[
                      "SearchReturn-DataTableSchema"];

// Adding Rows of Data to DataTable dt

HttpContext.Current.Session["SearchReturn-DataTable"] = dt;

((DataTable)HttpContext.Current.Session[
     "SearchReturn-DataTableSchema"]).Rows.Clear();

return dt;

我的想法是在“ DataTableSchema ”中只有带有列模式的DataTable,在“ DataTable ”中只有列+行。

问题是当我从DataTableSchema清除所有行时,变量 dt 也会清除 Rows (!!)

如何避免这种情况?如何将变量(在本例中为 Session 变量)分配为值而不是引用?

谢谢你。


回答

DataTable dt = (DataTable)Session["SearchReturn-DataTableSchema"];

需要是这样的:

DataTable dt = ((DataTable)Session["SearchReturn-DataTableSchema"]).Copy();

:-)

4

4 回答 4

3

您必须复制您的表格。

于 2010-02-23T13:01:53.227 回答
2

其中一个有趣的部分是行为将取决于您的会话状态提供程序。您目前可能正在使用进程内提供程序,它保留引用 - 但大多数提供程序(可以理解)使用序列化。

当他们试图扩大规模时,这经常会咬人,因为他们发现他们在会话中有一些不可序列化的东西。因此,您可能会考虑将状态推送到不同的提供者;SQL-Server、memcached 等——它们都将进行序列化,因此数据将是独立的。

于 2010-02-23T13:07:22.783 回答
0

使用 DataTable 的 .Copy() 方法:http:
//msdn.microsoft.com/en-us/library/system.data.datatable.copy.aspx

于 2010-02-23T13:04:29.843 回答
0

您也可以使用 Clone 方法克隆 DataTable Schema。然后通过 Load 和 CreateReader 方法加载数据。

于 2010-02-23T13:08:07.043 回答