C# 将嵌套的select值检索到datatable c中

C# 将嵌套的select值检索到datatable c中,c#,sql,asp.net,datatable,asmx,C#,Sql,Asp.net,Datatable,Asmx,我需要从SQL数据库中填充数据表。表的标题是项目名称和团队成员。我想从Projects表中检索项目名称,从User_Projects表中检索团队成员,并在datatable中显示他们。所有项目名称都已成功显示,但我不知道如何显示每个项目的团队成员。我想要这样的结果: 这是我的代码: aspx: ProjectMembersService.asmx: 您需要根据所做的列定义将名为developer\u name的字段添加到项目类中 class Projects { public int

我需要从SQL数据库中填充数据表。表的标题是项目名称和团队成员。我想从Projects表中检索项目名称,从User_Projects表中检索团队成员,并在datatable中显示他们。所有项目名称都已成功显示,但我不知道如何显示每个项目的团队成员。我想要这样的结果:

这是我的代码:

aspx: ProjectMembersService.asmx:
您需要根据所做的列定义将名为developer\u name的字段添加到项目类中

class Projects
{
    public int project_number { get; set; }
    public string project_name { get; set; }
    public string developer_name { get; set; }
}
并添加一组开发人员名称

    using (SqlConnection conn = new SqlConnection("Data Source=RC-8573\\SQLEXPRESS;Initial Catalog=DataManagment;Integrated Security=SSPI;MultipleActiveResultSets=True"))
    {
        var projects = new List<Projects>();
        conn.Open();
        using (var cmd = new SqlCommand("getProjects", conn) { CommandType = CommandType.StoredProcedure })
        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            if (dr.HasRows)
                while (dr.Read())
                {
                    var Project = new Projects
                    {
                        project_number = Convert.ToInt32(dr[1].ToString()),
                        project_name = dr[2].ToString(),
                    };
                    projects.Add(Project); 
                    // open new sqldatareader for each project_id >>  need add MultipleActiveResultSets=True to connectionstring(added)
                    using (SqlCommand com = new SqlCommand("SELECT user_name FROM Users WHERE user_id IN (SELECT user_id FROM User_Projects WHERE project_number = @project_number)", conn))
                    {
                        com.Parameters.Add("@project_number", Project.project_number);
                        List<string> developerNames = new List<string>();
                        using (SqlDataReader rdrDev = com.ExecuteReader())
                        {
                            if (rdrDev.HasRows)
                            {
                                while (rdrDev.Read())
                                {
                                    developerNames.Add((string)rdrDev["user_name"]);
                                }
                            }
                        }
                        // set names to project object
                        Project.developer_name = string.Join(", ", developerNames);
                    }

                }
        }
        var js = new JavaScriptSerializer();
        Context.Response.Write(js.Serialize(projects));
    }

我收到以下错误:System.InvalidOperationException:“已经有一个与此命令关联的打开的DataReader,必须先关闭它。”当我将MultipleActiveResultSets=true添加到连接字符串中时,它会起作用,但是;如果项目有1个成员,则会在表中成功检索,如果项目有多个成员,则不会显示!将查询替换为SELECT user\U name FROM Users WHERE user\U id IN SELECT user\U id FROM user\U Projects WHERE project\U number=@project\U number当鼠标悬停为用户名时,是否有方法将用户名文本更改为图像或图标以及标签?我在哪里可以这样做?在c代码中还是在aspx代码中?是的,您可以使用jquery datatable行模板来完成
class Projects
{
    public int project_number { get; set; }
    public string project_name { get; set; }
    public string developer_name { get; set; }
}
    using (SqlConnection conn = new SqlConnection("Data Source=RC-8573\\SQLEXPRESS;Initial Catalog=DataManagment;Integrated Security=SSPI;MultipleActiveResultSets=True"))
    {
        var projects = new List<Projects>();
        conn.Open();
        using (var cmd = new SqlCommand("getProjects", conn) { CommandType = CommandType.StoredProcedure })
        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            if (dr.HasRows)
                while (dr.Read())
                {
                    var Project = new Projects
                    {
                        project_number = Convert.ToInt32(dr[1].ToString()),
                        project_name = dr[2].ToString(),
                    };
                    projects.Add(Project); 
                    // open new sqldatareader for each project_id >>  need add MultipleActiveResultSets=True to connectionstring(added)
                    using (SqlCommand com = new SqlCommand("SELECT user_name FROM Users WHERE user_id IN (SELECT user_id FROM User_Projects WHERE project_number = @project_number)", conn))
                    {
                        com.Parameters.Add("@project_number", Project.project_number);
                        List<string> developerNames = new List<string>();
                        using (SqlDataReader rdrDev = com.ExecuteReader())
                        {
                            if (rdrDev.HasRows)
                            {
                                while (rdrDev.Read())
                                {
                                    developerNames.Add((string)rdrDev["user_name"]);
                                }
                            }
                        }
                        // set names to project object
                        Project.developer_name = string.Join(", ", developerNames);
                    }

                }
        }
        var js = new JavaScriptSerializer();
        Context.Response.Write(js.Serialize(projects));
    }