如何使用c#返回方法中的多个对象?

时间:2014-06-12 09:46:18

标签: c# object return

我有一个从我的数据库中检索多个结果的方法,我希望将每个结果作为一个对象返回到我的页面,但是目前它只是返回sql命令的最后一个结果。

我的页面上调用方法的代码:

Personen persoon1 = Personen.GetOneItem(int.Parse(TextBox_id.Text));

方法代码:

public static Personen GetAllPersonWithID(int id)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["RestaurantConnection"].Connection
String;
    SqlCommand cmd = new SqlCommand("SELECT * FROM Personen where reservering_id=" + id, con);
    con.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    Personen Item = new Personen();
    while (rdr.Read())
    {
        Item.id = Convert.ToInt32(rdr["id"]);
        Item.menu_id = Convert.ToInt32(rdr["menu_id"]);
        Item.reservering_id = Convert.ToInt32(rdr["reservering_id"]);
    }
    con.Close();
    return Item;
}

它只返回对象中的最后一个结果。

提前致谢

8 个答案:

答案 0 :(得分:5)

基本上,您应该返回List<Personen>或类似的集合类型。 (考虑将返回类型声明为IList<Personen>IEnumerable<Personen>并使用List<Personen>作为实现类型。)

请注意,目前您反复覆盖单个对象的属性 - 您也需要修复它。

例如:

...
List<Personen> list = new List<Personen>();
while (rdr.Read())
{
    Personen item = new Personen();
    item.id = Convert.ToInt32(rdr["id"]);
    item.menu_id = Convert.ToInt32(rdr["menu_id"]);
    item.reservering_id = Convert.ToInt32(rdr["reservering_id"]);
    list.Add(item);
}
...
return list;

此外:

  • 您应该使用using语句来关闭您的连接,命令和阅读器
  • 您应该使用参数化SQL而不是在SQL
  • 中嵌入参数
  • 您应该遵循.NET命名约定,例如MenuID代替menu_id
  • 考虑投放到int或使用rdr.GetInt32(),而不是致电Convert.ToInt32
  • 如果Personen已经是复数名词,请将其更改为Person,以便它代表

答案 1 :(得分:0)

您有多种选择:

一个。返回包含要返回的特定对象的复合对象

湾用完例如void MyMethod(out object obj1, out object obj2);

答案 2 :(得分:0)

您可以为您的方法返回List<Personen>。 建议使用using statementcommand parameter

public static List<Personen> GetAllPersonWithID(int id)
{
    List<Personen> lstPersonen = new List<Personen>();
    string constring = System.Configuration.ConfigurationManager.ConnectionStrings["RestaurantConnection"].ConnectionString;
    string sql = "SELECT * FROM Personen where reservering_id=@id";

    using(SqlConnection con = new SqlConnection(constring))
    {             
       con.Open();
       using(SqlCommand cmd = new SqlCommand(sql, con))
       {
          cmd.Parameters.AddWithValue("@id", id);
          using(SqlDataReader rdr = cmd.ExecuteReader())
          {
             while (rdr.Read())
             {
                 Personen Item = new Personen();
                 Item.id = Convert.ToInt32(rdr["id"]);
                 Item.menu_id = Convert.ToInt32(rdr["menu_id"]);
                 Item.reservering_id = Convert.ToInt32(rdr["reservering_id"]);
                 lstPersonen.Add(Item);
             }
          }
       }
    }

    return lstPersonen;
}

如何使用方法

//provide reservering_id here
List<Personen> lstPersonen = GetAllPersonWithID(int.Parse(TextBox_reservering_id.Text)); 

//find a person having id equals to value present in `TextBox_id.Text`
Personen persoon1;
foreach(Personen p in lstPersonen)
{
     //p gets each item present in list
     if(p.id == int.Parse(TextBox_id.Text))
     {  
         persoon1 = p;
         break;
     } 
}

答案 3 :(得分:0)

只需返回一份人员名单。

List<Personen> items = new List<Personen>();
while (rdr.Read())
{
    Personen p = new Personen();
    p.id = Convert.ToInt32(rdr["id"]);
    p.menu_id = Convert.ToInt32(rdr["menu_id"]);
    p.reservering_id = Convert.ToInt32(rdr["reservering_id"]);
    items.Add(p);
}
return items;

要考虑的问题:为什么不使用O / R-Mapper?

答案 4 :(得分:0)

首先,您需要更改方法签名以返回项集合,最简单的方法是使用IEnumerable:

public static IEnumerable<Personen> GetAllPersonWithID(int id){}

接下来,您需要修改实际返回多个项目的方法。在这种情况下,您经常覆盖Item对象的内容,只返回最后一个。将其更改为阅读

while (rdr.Read())
{
    Personen Item = new Personen();
    Item.id = Convert.ToInt32(rdr["id"]);
    Item.menu_id = Convert.ToInt32(rdr["menu_id"]);
    Item.reservering_id = Convert.ToInt32(rdr["reservering_id"]);
    yield return Item;
}

答案 5 :(得分:0)

尝试为项目创建列表。在每次迭代到rdr时,将项目添加到项目列表中。最后返回一个对象列表

答案 6 :(得分:0)

在while循环中,您正在重置要返回的Item的属性,因此只记住最后一个。有几种选择。

您可以返回List<Personen>IEnumerable<Personen>并使用收益率返回值。 顺便说一句,&#39; Persoon&#39;可能是比人格更好的名字。

答案 7 :(得分:0)

下面您将使用提供的ID检索所有人。但是,由于您没有使用SQL命令参数,因此您自己容易受到SQL注入攻击。

    public static List<Personen> GetAllPersonWithID(int id)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString =   System.Configuration.ConfigurationManager.ConnectionStrings["RestaurantConnection"].ConnectionString;

        SqlCommand cmd = new SqlCommand("SELECT * FROM Personen where reservering_id=" + id, con);
        con.Open();
        SqlDataReader rdr = cmd.ExecuteReader();

        List<Personen> rtnList = new List<Personen>();

        while (rdr.Read())
        {
            Personen personen = new Personen();
            personen.id = Convert.ToInt32(rdr["id"]);
            personen.menu_id = Convert.ToInt32(rdr["menu_id"]);
            personen.reservering_id = Convert.ToInt32(rdr["reservering_id"]);
            rtnList.Add(personen);
        }
        con.Close();
        return rtnList;
    }

我希望有所帮助。