несколько строк в одной таблице - PullRequest
0 голосов
/ 09 января 2011

У меня есть стол с 3 цв.viz id,profile_id,plugin_id. Может быть более 1 плагина, связанного с одним профилем. Как я могу извлечь из базы данных все плагины, связанные с profile_id, который получается из переменной сеанса, определенной на странице входа в систему, когда я пытаюсь применить запросто же самое он возвращает данные с plugin_id последней записи запроса:

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();

Ответы [ 3 ]

0 голосов
/ 09 января 2011

Я бы рекомендовал вам написать отдельную функцию для извлечения значений из базы данных. Также вам следует использовать параметризованные запросы, чтобы избежать внедрения SQL:

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);
            }
        }
    }
}

и затем вызовите функцию следующим образом:

// 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 голосов
/ 09 января 2011

Я думаю, вы хотите сохранить все значения в сеансе, и вот как вы это делаете:

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"];

Но вы должны действительно реорганизовать свой код, код не должен управлять доступом к данным и обработкой сеансов в одном месте.

0 голосов
/ 09 января 2011

есть «ошибка», потому что вы каждый раз присваиваете во время цикла while одну и ту же переменную, поэтому похоже, что вы получаете только последнюю строку!

...