我有一个从我的数据库中检索多个结果的方法,我希望将每个结果作为一个对象返回到我的页面,但是目前它只是返回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;
}
它只返回对象中的最后一个结果。
提前致谢
答案 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
语句来关闭您的连接,命令和阅读器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 statement
和command 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;
}
我希望有所帮助。