【问题标题】:Not all code paths return a value while loop并非所有代码路径都在循环中返回值
【发布时间】:2019-05-16 11:36:26
【问题描述】:

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

 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 循环之外,List 仅填充 1 个值。

那么我的问题是,我该如何解决这个错误,使数据库将填充数据库中的每一行?

【问题讨论】:

  • 为什么要在循环中关闭数据库连接?这不会让读取更多数据变得困难吗?
  • 您不能使用这样的简单赋值将多个数据库行值存储在单个变量中。改用数据表
  • @John ,有什么提示可以放在哪里?我是编程新手,所以我承认我犯了很多错误。
  • @CaiusJard 纠正我如果我错了,但这就是你所说的断开层吗?我会调查一下,谢谢。 :)
  • @John 你给了我不少小费,伙计。通过获取 connection.Close() 并退出 while 循环来解决问题。我现在想知道,这是解决它的正确方法还是有其他“最佳实践”来做到这一点?

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


【解决方案1】:

您应该使用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;
    }
}

因此,我从循环中删除了连接关闭(以便您可以继续阅读更多信息),现在返回循环外的列表。

【讨论】:

  • 非常感谢,这很好用!也感谢您对“使用”语句的解释。
  • @Max 一般来说,如果某些东西实现了IDisposable(有.Dispose()),你应该在使用它们时将它们包装在using 语句中。你可以阅读更多关于usingin this question的信息。
【解决方案2】:

删除 SqlCommand 之后的每一行代码(如 sqldatareader 及更高版本)并将其替换为:

DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);

您现在将拥有一个代表您的数据库数据(全部)的 DataTable 对象。您可以将其作为一组行进行迭代并使用数据

在此之后不久,您应该考虑阅读 Entity Framework 教程(由 Microsoft 提供)并努力完全忽略这种从数据库中获取数据的方法(暂时;当您变得更加熟练时,请随时重新访问它,但它是非常低级的工作方式,不利于编写良好、封装良好、健壮和高性能的代码,尤其是作为新手)..

【讨论】:

    【解决方案3】:

    其实,当你在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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2013-10-06
      • 2016-02-14
      相关资源
      最近更新 更多