2015-01-07 5 views
2

Я читал файл XLS с помощью ExcelDataReader и положить полный DataTable в Session переменной со следующим кодомПочему переменная 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

Проверьте порядок событий и места, где вы устанавливаете сеанс. – Amit

+0

Пожалуйста, ознакомьтесь с http://www.albahari.com/valuevsreftypes.aspx. Если вам нужна копия, используйте [DataTable.Copy] (http://msdn.microsoft.com/en-us/library/system.data.datatable .copy% 28v = vs.110% 29.aspx) –

+0

@SriramSakthivel приветствую ваше предложение. Но здесь я не устанавливаю переменную сессии, которая может вызвать обновление из-за изменения ссылочной переменной. Я получаю сессию в локальной переменной. –

ответ

2

Поскольку режим состояния сеанса по умолчанию - InProc (in-process). То есть вы создаете ссылки, указывающие на один и тот же объект DataTable, поскольку в процессе означает также в памяти.

или, другими словами: ваша сессия, поля классов и локальные переменные совместно используют одну и ту же изолированную среду и память, а это значит, что создание новых ключей состояния сеанса почти совпадает с объявлением новых ссылок (полей классов и локальных переменных).

См. Сеанс state modes article on MSDN, чтобы узнать больше о доступных режимах и их деталях.

Если вы хотите сохранить ключ сеанса в каком-либо состоянии и продолжить редактирование исходного объекта, не затрагивая его, вы должны сериализовать его XML или JSON (или любой другой формат сериализации). См. Этот раздел Q & A здесь, на StackOverflow: How to convert datatable to json string using json.net?

Смежные вопросы