2011-01-09 37 views
2

私の質問をする前に、このシナリオを検討してください。私のウェブサイトのユーザーはprofileIDです。このprofileIDにはpluginIDが関連付けられています。複数の値をセッション変数に格納

例:User1は、プロフィールに関連付けられた2,3,5のプラグインを持っている可能性があります。

ユーザーがログインすると、ユーザーのprofileIDがセッション変数codに保存されます。特定のページで、ユーザーは自分のプロフィールに関連付けられたpluginsを編集しようとします。だから、そのページで、私はそれらのpluginIDをDBから取り出さなければなりません。

私はこのコードを適用しましたが、これはDBから最大pluginIDだけを取り込み、pluginIDのすべてを取り出すわけではありません。

SqlCommand cmd1 = new SqlCommand("select plugin_id from profiles_plugins where id=(select id from profiles_plugins where profile_id=" + Convert.ToInt32(Session["cod"]) + ")", con); 
SqlDataReader dr1 = cmd1.ExecuteReader(); 
if (dr1.HasRows) 
{ 
    while (dr1.Read()) 
    { 
    Session["edp1"] = Convert.ToInt32(dr1[0]); 
    } 
} 
dr1.Close(); 
cmd1.Dispose(); 

このセッション変数に複数のpluginIDを保存するにはどうすればいいですか?

おかげ

+2

脇に:コマンド、リーダー、および接続のそれぞれの周りに '使用中 'があるはずです。 –

+1

そして**あなたのクエリを**パラメータ化する必要があります!一般的なルールとして、**決して**あなたのSQLクエリを連結しない - これはSQLインジェクション攻撃の扉を開く - それをしないでください。 –

+0

また、同じコードでデータアクセスとセッション処理を混在させないでください。ここでは奇妙なことがたくさん起こっています...また、これは "質問" [複数の単一のテーブルの行]の重複かもしれません(http://stackoverflow.com/questions/4638578/multiple-rows-of-a単一のテーブル)。 –

答えて

5

最初のリストや配列に値を読み、そのリストまたは配列格納します。また

using(SqlCommand cmd1 = new SqlCommand("select plugin_id from profiles_plugins where id=(select id from profiles_plugins where profile_id=" + Convert.ToInt32(Session["cod"]) + ")", con)) 
{ 

    SqlDataReader dr1 = cmd1.ExecuteReader(); 
    var yourList = new List<int>(); 
    if (dr1.HasRows) 
    { 
     while (dr1.Read()) 
     { 
      yourList.Add(Convert.ToInt32(dr1[0])); 
     } 
    } 
    Session["edp1"] = yourList; 
    dr1.Close(); 
} 

を、あなたの質問にマルクGravellさんのコメントを読んでください。

+0

Ok、Listを使用してセッションに値を格納できましたセッションからこれらの値を取得するにはどうすればよいですか? – Cipher

+0

'var yourList =(リストセッション[" edp1 "]);'は動作するはずです。しかし、私はあなたのコードを本当にリファクタリングするので、同じ場所でデータアクセスとセッション処理をしないでください。 –

+0

最後のコメントの入力ミスは: 'var yourList =(List )Session [" edp1 "];' –

3

あなたは、セッションキーの下だけでなく、スカラー値を好きなオブジェクト保存することができます。したがって、保存するすべての値を含むカスタムタイプを定義し、このタイプのインスタンスを作成してセッションに挿入します。

+0

セッションでカスタムタイプを保存する場合は、ASP.NET State ServerまたはSQL State Serverを使用する場合はSerializableとしてマークする必要があります – sh1rts

関連する問題