【问题标题】:How to return multiple objects in a method with c#?c# 如何在一个方法中返回多个对象?
【发布时间】:2014-08-02 14:15:31
【问题描述】:

我有一个从我的数据库中检索多个结果的方法,我想将这些结果中的每一个作为一个对象返回到我的页面,但是目前它只是返回 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;
}

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

提前致谢

【问题讨论】:

  • 什么是Personen?听起来好像已经是Person 的集合了,所以你必须在循环中填充它。
  • 你需要返回一个personen列表,你只是返回一个
  • 我猜你想要一个List<Personen>,然后需要修改while (rdr.Read()) 内容以添加到每一行的列表中。
  • Tim,在荷兰语中的意思是人。然而,这并不相关。此方法检索人们选择的菜单及其预订编号。

标签: c# object return


【解决方案1】:

您有多种选择:

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

b.用尽例如void MyMethod(out object obj1, out object obj2);

【讨论】:

    【解决方案2】:

    您可以为您的方法返回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】:

      只需返回人员列表。

      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】:

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

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

        例如:

        ...
        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,这样它就代表一个单身

        【讨论】:

        • 被打败了10秒:(
        • 我通常更喜欢返回 IEnumerable&lt;Personen&gt; 而不是列表 - 以防万一您只需要前 X 项等。
        • @Ian:你的意思是懒惰地开始获取它,使用yield return?是的,这是可能的。
        • 这很好,但是如何从我的页面访问此列表中的信息?您不能在代码后面创建列表
        • @Ian:嗯,它确实有一些其他的后果——比如在你使用它的整个过程中保持连接打开,并且理解甚至参数验证等都是惰性的。鉴于目前 OP 代码的复杂程度,我宁愿不使用更高级的技术。 (老实说,我怀疑使用 LINQ to SQL 或 EF 实际上会更好......)
        【解决方案5】:

        首先,您需要更改方法签名以返回项目集合,最简单的方法是使用 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;
        }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 一个ArrayList?认真的吗?
          • 即使有了更新,这个答案与其他答案相比也严重相形见绌。
          【解决方案7】:

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

          您可以返回 List&lt;Personen&gt;IEnumerable&lt;Personen&gt; 并使用 yield return。 顺便说一句,“Personen”可能是比“Personen”更好的名字。

          【讨论】:

          • Stackoverflow 的问题:在您完成输入之前出现 5 个答案...
          【解决方案8】:

          您将在下面检索具有所提供 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;
              }
          

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2017-07-12
            • 1970-01-01
            • 1970-01-01
            • 2011-03-21
            • 1970-01-01
            • 2010-10-02
            • 2020-11-01
            • 2013-02-16
            相关资源
            最近更新 更多