2010-02-23 21 views
3

Je rencontre des problèmes lors de l'utilisation des variables de session car elles sont utilisées comme Référence et je souhaite les utiliser comme valeur.Utilisation de variables comme valeur et non comme référence

Je suis arrivé à ce debug ma solution et je crée quelque chose comme:

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; 

mon idée était d'avoir dans « DataTableSchema » seul le DataTable avec les colonnes du schéma et dans « DataTable » la Colonnes + lignes.

Le problème est que lorsque je effacer toutes les lignes de DataTableSchema, la dt variable ont les lignes décochée (!!)

Comment éviter cela? Comment affecter une variable (dans ce cas une variable Session) en tant que valeur et non en tant que référence?

Merci.


Réponse

cette

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

a besoin d'être ceci:

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

:-)

Répondre

3

Vous devrez faire une copie de votre tableau.

+0

oublié tout sur DataTable.Copy() :) – balexandre

2

Une partie intéressante est que le comportement dépendra de votre fournisseur d'état de session. Vous utilisez vraisemblablement le fournisseur en cours de traitement pour le moment, qui conserve des références - mais la plupart des fournisseurs (compréhensible) utilisent la sérialisation.

Cela mord souvent les gens quand ils essaient de passer à l'échelle, car ils trouvent qu'ils ont quelque chose de non sérialisable en session. Donc, vous pourriez envisager de pousser l'état dans un autre fournisseur; SQL-Server, memcached, etc - ils feront tous la sérialisation de sorte que les données seront indépendantes.

+0

Le bien de savoir quoi et comment. NET gère les choses :) BTW: Êtes-vous "toujours" en ligne? Tu ne dors pas? Travail? ;-) – balexandre

+0

Si vous regardez de près mon utilisation, vous verrez * très * des lacunes clairement définies pendant le temps de travail (sauf peut-être pour le déjeuner) ... disons simplement que nous "avions des mots" à ce sujet ;-p Mais dorment est surévalué ... –

0

Egalement Vous pouvez cloner le schéma DataTable en utilisant la méthode Clone. Ensuite, chargez les données via les méthodes Load et CreateReader.