并非所有代码路径在循环时都返回值

时间:2018-12-15 13:04:21

标签: c# sql error-handling while-loop return-value

我编写了以下代码,用数据库中的数据填充列表。

 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个值。

然后我的问题是,如何解决该错误,使数据库充满数据库中的每一行?

谢谢。

-如果您对命名有疑问,请这样做,因为它是荷兰语。 -非常欢迎有关异常的提示,因为这对编程来说是非常新的。 -并且非常欢迎有关“最佳做法”的提示。

3 个答案:

答案 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();
    }
}