2011-01-09 18 views
0

私は3 colのテーブルを持っています。 viz id,profile_id,plugin_id .thereには1つのプロファイルに複数のプラグインを関連付けることができます。どのようにデータベースから取得できますか?ログインページで定義されたセッション変数から来るprofile_idに関連付けられたすべてのプラグイン それはあなたのように見える、なぜ同じことが1つのテーブルの複数の行

SqlCommand cmd1 = new SqlCommand(
    "select plugin_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(); 
+0

何が質問ですか? –

+0

'System.Collections.Generic.List'1型の[System.Int32]型のオブジェクトをキャストできません' System.IConvertible'howこれを削除できます –

+0

下記の私の答えを参照してください。上記のメッセージ。 –

答えて

0

を次のようにクエリを使用すると、同じ変数にあなたのwhileループの毎回の間に割り当てるために「エラー」があるで最後のレコード のplugin_idでデータを返し、thatsの最後の行だけを取得してください!

+0

ちょっとおかげで、再配置されたコードを提供することができます –

0

データベースから値を取得するための別の関数を書くことをお勧めします。

public IEnumerable<int> GetPluginIds(int profileId) 
{ 
    using (var connection = new SqlConnection("SOME CONNECTION STRING")) 
    using (var cmd = connection.CreateCommand()) 
    { 
     connection.Open(); 
     cmd.CommandText = "SELECT plugin_id FROM profiles_plugins WHERE profile_id = @profile_id"; 
     cmd.Parameters.AddWithValue("@profile_id", profileId); 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return reader.GetInt32(0); 
      } 
     } 
    } 
} 

してから、このような関数を呼び出します:また、あなたは、SQLインジェクションを防ぐためにパラメータ化クエリを使用する必要があります

// get the profile_id from session 
int profileId = Convert.ToInt32(Session["cod"]); 

// fetch associated plugin ids 
int[] pluginIds = GetPluginIds(profileId).ToArray(); 

// store the resulting array into session 
Session["pluginIds"] = pluginIds; 
0

私はあなたがセッション内のすべての値を保存したいと思いますし、ここにどのようにありますそれを実行します。

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(); 
cmd1.Dispose(); 

そして、あなたはセッションから読んだとき、あなただけのタイプ:

var yourList = (List<int>)Session["edp1"]; 

しかし、実際にコードをリファクタリングする必要があります。コードは、同じ場所でデータアクセスとセッション処理を管理するべきではありません。

関連する問題