我在使用会话变量方面遇到了一些麻烦,因为它们被用作参考,我想将它们用作值。
我得到了这个解决方案,我创造了类似的东西:
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也会清除行数(!!)
怎么能避免这个?如何将变量(在本例中为Session变量)指定为值而不是作为引用?
谢谢。
答案
这个
DataTable dt = (DataTable)Session["SearchReturn-DataTableSchema"];
需要这样:
DataTable dt = ((DataTable)Session["SearchReturn-DataTableSchema"]).Copy();
: - )
答案 0 :(得分:3)
你必须复制你的桌子。
答案 1 :(得分:2)
这个有趣的部分是行为取决于你的会话状态提供者。您可能目前正在使用进程内提供程序,它会保留引用 - 但大多数提供程序(可以理解)使用序列化。
当他们试图扩大规模时,这往往会让人们感到害怕,因为他们发现他们在会话中有一些不可序列化的东西。所以你可能会考虑将状态推送到另一个提供者; SQL-Server,memcached等 - 它们都将进行序列化,因此数据将是独立的。
答案 2 :(得分:0)
使用DataTable的.Copy()方法:
http://msdn.microsoft.com/en-us/library/system.data.datatable.copy.aspx
答案 3 :(得分:0)
另外 您可以使用克隆方法克隆DataTable架构。 然后通过Load和CreateReader方法加载数据。