0

我有一张 3 col 的桌子。viz id,profile_id,plugin_id.现在可以有多个与单个配置文件关联的插件我如何从数据库中获取与 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();
4

3 回答 3

0

有一个“错误”,因为你在你的 while 循环中每次都分配给同一个变量,这就是为什么看起来你只得到最后一行!

于 2011-01-09T09:55:17.970 回答
0

我建议您编写一个单独的函数来从数据库中检索值。您还应该使用参数化查询来避免 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;
于 2011-01-09T09:57:12.863 回答
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"];

但是你真的应该重构你的代码,代码不应该在同一个地方管理数据访问和会话处理。

于 2011-01-09T13:28:06.623 回答