我编写了以下代码,用数据库中的数据填充列表。
public List<Transactie> FillTransacties()
{
try
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlCommand cmd = new SqlCommand("SELECT transactieID, opdrachtID, medewerkerID, soort, datum, bedrag FROM Financien", connection);
SqlDataReader transactieinformatie = cmd.ExecuteReader();
List<Transactie> transacties = new List<Transactie>();
while (transactieinformatie.Read())
{
string transactieID = transactieinformatie["transactieID"].ToString();
string opdrachtID = transactieinformatie["opdrachtID"].ToString();
string medewerkerID = transactieinformatie["medewerkerID"].ToString();
string soort = transactieinformatie["soort"].ToString();
string datum = transactieinformatie["datum"].ToString();
string bedrag = transactieinformatie["bedrag"].ToString();
Transactie transactie = new Transactie(transactieID, opdrachtID, medewerkerID, soort, datum, bedrag);
transacties.Add(transactie);
connection.Close();
return transacties;
}
}
catch (InvalidCastException ICE)
{
MessageBox.Show("De data in de database is incorrect", ICE.Message);
return new List<Transactie>();
}
catch (Exception e)
{
MessageBox.Show("Er is een onbekende error opgetreden.", e.Message);
return new List<Transactie>();
}
}
现在我知道了问题所在,我在while循环中返回了值。问题是,当我尝试“返回交易”时,在while循环之外,列表仅填充1个值。
然后我的问题是,如何解决该错误,使数据库充满数据库中的每一行?
谢谢。
-如果您对命名有疑问,请这样做,因为它是荷兰语。 -非常欢迎有关异常的提示,因为这对编程来说是非常新的。 -并且非常欢迎有关“最佳做法”的提示。
答案 0 :(得分:0)
您应该使用using
语句重写代码。一旦您的代码完成,这些将自动清理数据读取器,命令和连接:
using(SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand cmd = new SqlCommand("SELECT transactieID, opdrachtID, medewerkerID, soort, datum, bedrag FROM Financien", connection))
using (SqlDataReader transactieinformatie = cmd.ExecuteReader())
{
List<Transactie> transacties = new List<Transactie>();
while (transactieinformatie.Read())
{
string transactieID = transactieinformatie["transactieID"].ToString();
string opdrachtID = transactieinformatie["opdrachtID"].ToString();
string medewerkerID = transactieinformatie["medewerkerID"].ToString();
string soort = transactieinformatie["soort"].ToString();
string datum = transactieinformatie["datum"].ToString();
string bedrag = transactieinformatie["bedrag"].ToString();
Transactie transactie = new Transactie(transactieID, opdrachtID, medewerkerID, soort, datum, bedrag);
transacties.Add(transactie);
}
return transacties;
}
}
因此,我从循环中关闭了连接(以便您可以继续阅读更多信息),现在将列表返回到循环外。
答案 1 :(得分:0)
删除SqlCommand之后的每一行代码(从sqldatareader开始),并替换为:
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
您现在将拥有一个DataTable对象,该对象代表您的数据库数据(所有数据)。您可以将其作为一组行进行迭代并使用数据
在此之后不久,您应该考虑阅读Entity Framework教程(由Microsoft提供),并努力忽略完全从数据库中获取数据的这种方法(目前;当您变得更加熟练时,可以随时重新访问它,但这是一种非常低级的工作方式,不利于编写好的,封装良好的,健壮的和高性能的代码,尤其是作为新手。)。
答案 2 :(得分:0)
实际上,当您返回while statement
时,循环已经中断,您必须考虑并处理closing the connection
。
您需要对代码进行一些更改,
按照:
public List<Transactie> FillTransacties()
{
try
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlCommand cmd = new SqlCommand("SELECT transactieID, opdrachtID, medewerkerID, soort, datum, bedrag FROM Financien", connection);
SqlDataReader transactieinformatie = cmd.ExecuteReader();
List<Transactie> transacties = new List<Transactie>();
while (transactieinformatie.Read())
{
string transactieID = transactieinformatie["transactieID"].ToString();
string opdrachtID = transactieinformatie["opdrachtID"].ToString();
string medewerkerID = transactieinformatie["medewerkerID"].ToString();
string soort = transactieinformatie["soort"].ToString();
string datum = transactieinformatie["datum"].ToString();
string bedrag = transactieinformatie["bedrag"].ToString();
Transactie transactie = new Transactie(transactieID, opdrachtID, medewerkerID, soort, datum, bedrag);
transacties.Add(transactie);
}
return transacties;
}
catch (InvalidCastException ICE)
{
MessageBox.Show("De data in de database is incorrect", ICE.Message);
return new List<Transactie>();
}
catch (Exception e)
{
MessageBox.Show("Er is een onbekende error opgetreden.", e.Message);
return new List<Transactie>();
}
finally
{
connection.Close();
}
}