2010-02-23 100 views
3

我有一些麻烦使用会话变量,因为它们被用作引用,我想用它们作为使用变量作为值而不是作为参考

我得到这个调试运行我的解决方案,我创建了类似:

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”的列+行。

问题是,当我清除DataTableSchema所有行,变量DT必须排清以及(!!)

如何避免这种情况?如何分配一个变量(在本例中是一个Session变量)作为一个值而不是一个参考?

谢谢。


回答

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

需求是这样的:

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

:-)

回答

3

你必须复制你的表格。

+0

忘了所有关于DataTable.Copy():) – balexandre 2010-02-23 13:06:27

2

这方面的一个有趣的部分是该行为将取决于您的会话状态提供。您大概现在正在使用进程内提供程序,这会保持引用 - 但大多数提供程序(可以理解)使用序列化。

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

+0

知道什么和如何处理的东西的东西好:)顺便说一句:你是否“永远”在线?你不睡觉吗?工作? ;-) – balexandre 2010-02-23 13:09:43

+0

如果仔细观察我的使用情况,在工作时间内你会看到*非常明显的缺陷(除了可能是午餐)......让我们只是说我们对此有“言语”; -p但是睡眠被高估了... – 2010-02-23 13:26:13

0

另外 您可以使用克隆方法克隆DataTable模式。 然后通过Load和CreateReader方法加载数据。