从sql获取List <object>

时间:2018-01-23 15:11:21

标签: c# sql-server wcf

public List<Menu> Getmonan()
    {
        string cs = ConfigurationManager.ConnectionStrings["RestaurantConnection"].ConnectionString;
        List<Menu> menulist = new List<Menu>();
        Menu menu = new Menu();
        using (SqlConnection conn = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand("Getmenu", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while(reader.Read())
            {
                menu.Tenmon = reader["TenMon"].ToString();
                menu.Loaimon = reader["LoaiMon"].ToString();
                menulist.Add(menu);
            }

        }

        return menulist;
    }

我的程序和sql结果:

My procedure and sql result

我的WCF测试客户端结果: My WCF test client result 我的代码有什么问题?为什么我在menulist中得到相同的菜?

4 个答案:

答案 0 :(得分:1)

您必须在循环中创建新菜单。

您基本上创建了一个在循环中多次更改的对象,然后将其多次添加到列表中。它产生一个列表,其中所有元素都是同一条数据。

public List<Menu> Getmonan()
    {
        string cs = ConfigurationManager.ConnectionStrings["RestaurantConnection"].ConnectionString;
        List<Menu> menulist = new List<Menu>();

        using (SqlConnection conn = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand("Getmenu", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while(reader.Read())
            {
                Menu menu = new Menu();
                menu.Tenmon = reader["TenMon"].ToString();
                menu.Loaimon = reader["LoaiMon"].ToString();
                menulist.Add(menu);
            }

        }

        return menulist;
    }

答案 1 :(得分:1)

您需要创建多个对象,而不是覆盖旧对象:

public List<Menu> Getmonan()
{
    string cs = ConfigurationManager.ConnectionStrings["RestaurantConnection"].ConnectionString;
    List<Menu> menulist = new List<Menu>();
    // Menu menu = new Menu();  // <--- remove this!!
    using (SqlConnection conn = new SqlConnection(cs))
    {
        SqlCommand cmd = new SqlCommand("Getmenu", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        while(reader.Read())
        {
            Menu menu = new Menu();   // <--- put it here...
            menu.Tenmon = reader["TenMon"].ToString();
            menu.Loaimon = reader["LoaiMon"].ToString();
            menulist.Add(menu);
        }

    }

    return menulist;
}

答案 2 :(得分:1)

这应该有效:

public List<Menu> Getmonan()
{
    string cs = ConfigurationManager.ConnectionStrings["RestaurantConnection"].ConnectionString;

    List<Menu> menulist = new List<Menu>();

    using (SqlConnection conn = new SqlConnection(cs))
    {
        SqlCommand cmd = new SqlCommand("Getmenu", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        conn.Open();
        using (SqlDataReader sdr = cmd.ExecuteReader()) 
        {
            while(sdr.Read())
            {
                Menu menu = new Menu()
                {
                    Tenmon = sdr.GetString(Column Index);
                    Loaimon = sdr.GetString(Column Index);
                };
                menulist.Add(menu);
            }
        }
    }
    return menulist;
}

答案 3 :(得分:0)

正如我和我所指出的那样

您需要为列表中的每个项目添加一个新菜单,否则您将更新相同的项目,但会反复将其添加到列表中,以便您最终获得相同内容的多个副本。