简体   繁体   中英

retrieve nested select values into datatable c#

I have datatable to be filled from SQL database. The header of the table is project name and Team members. I want to retrieve project name from Projects table and Team members from User_Projects table and display them in the datatable. all projects names are displayed successfully but, I don't know ho to display the Team Members for each project. I want the result like that: 在此处输入图片说明

This is my code:

aspx:

<script type="text/javascript">  
   $(document).ready(function () {
      $.ajax({
        type: "POST",
        dataType: "json",
        url: "ProjectMembersService.asmx/GetProjects",
        success: function (data) {
        var datatableVariable = $('#projects-progress').DataTable({
           data: data,
           columns: [
                   { 'data': 'project_name' },
                   { 'data': 'developer_name' },
                    ]
            });
         }
      });
  });
</script> 
<table id="projects-progress" class="table table-striped projects">
  <thead>
     <tr>
        <th style="width: 20%">Project Name</th>
        <th>Team Members</th>
     </tr>
  </thead>
</table> 

ProjectMembersService.asmx:

<%@ WebService Language="C#" CodeBehind="~/App_Code/ProjectMembersService.cs" Class="WebSite1.ProjectMembersService" %>

// using statements


namespace WebSite1
{
    public class ProjectMembersService : System.Web.Services.WebService
    {

        [WebMethod]
        public void GetProjects()
        {
            SqlConnection conn = new SqlConnection("Data Source=RC-8573\\SQLEXPRESS;Initial Catalog=DataManagment;Integrated Security=SSPI");

            var projects = new List<Projects>();
            var developers = new List<Developers>();

            using (conn)
            {
                var cmd = new SqlCommand("getProjects", conn) { CommandType = CommandType.StoredProcedure }; //select all projects inProjects table 
                conn.Open();
                var dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    var Project = new Projects
                    {
                       project_number = Convert.ToInt32(dr[1].ToString()),
                       project_name = dr[2].ToString(),
                    };
                    projects.Add(Project);    // This ok, it fill the datatable with all project_names

            // here I want for each project to retrieve the team members and display them in Team Members column

            SqlCommand com = new SqlCommand("SELECT user_name FROM Users WHERE user_id = (SELECT user_id FROM User_Projects WHERE project_number = @project_number)", conn); // retrieve all developers name 
                    SqlDataAdapter da = new SqlDataAdapter(com);
                    DataSet ds = new DataSet();
                    da.Fill(ds);

                    var Developer = new Developers
                    {
                        developer_name = ds.Tables[0].Columns["user_name"].ToString();
                    };

                    developers.Add(Developer);


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

        var js2 = new JavaScriptSerializer();
        Context.Response.Write(js2.Serialize(developers));
        }
    }
}

You need to add a field named developer_name to the Project class according to the column definitions that you did.

class Projects
{
    public int project_number { get; set; }
    public string project_name { get; set; }
    public string developer_name { get; set; }
}

and add set developer names

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM