【问题标题】:C# Making Multiple else-if statements more efficient. Methods?C# 使多个 else-if 语句更有效。方法?
【发布时间】:2020-07-22 13:00:36
【问题描述】:
private void displayButton_Click(object sender, EventArgs e)
    {


        string connectionString;
        SqlConnection cnn;

        connectionString = "Server= myservername; Database= nba_database; Integrated Security=True";

        cnn = new SqlConnection(connectionString);

        cnn.Open();
       // MessageBox.Show("Connection Established!");

   

        // define variables
        SqlCommand command;
        
        String sql;

        // define SQL statement
        if (listBox1.SelectedIndex == 0)
        {
            sql = "SELECT LastName, FirstName " +
            "FROM Players, Teams " +
            "WHERE Players.TeamID = Teams.TeamID " +
            "AND Teams.Nickname = 'Hawks'";

            // command statement
            command = new SqlCommand(sql, cnn);


            textBox1.Text = command.ExecuteScalar().ToString();
            // Scalar returns the first column of the first row of the query


            cnn.Close();
            
            command.Dispose();
        }
        else if (listBox1.SelectedIndex == 1)
        {
            String sql2 = "SELECT FirstName, LastName FROM Players WHERE Team = 'Milwaukee Bucks'" +
                            "AND Number <= 24";

            

            // command statement
            command = new SqlCommand(sql2, cnn);

            SqlDataReader reader = command.ExecuteReader();


            // Get table values

            StringBuilder sb = new StringBuilder();
            while (reader.Read())
            {
                sb.AppendLine(reader.GetString(0).ToString() + " " + reader.GetString(1).ToString());
            }

            textBox1.Text = sb.ToString();


            cnn.Close();

            command.Dispose();
        }   

    }

我有这个连接到 SQL Server 数据库的代码。有一个列表框供用户选择,根据他们的选择,查询将运行并在文本框中返回查询结果。

就目前而言,感觉就像我有一堆重复的代码,而我在列表框中只有 2 个选项。我将需要添加更多选项,并且嵌套的 if else 语句将继续增长。

有没有更好的方法来做到这一点?我正在考虑使用方法,但是当我尝试时,我不知道如何从方法中返回值,以及如何将其用作查询的参数。

任何帮助/建议将不胜感激

【问题讨论】:

  • cnn.Close(); command.Dispose(); 是重复的,但是通过(无论如何推荐)使用 using 块,它们都可以变得多余。
  • 我投票结束这个问题,因为我相信这个问题对于Code Review 来说会更好,因为代码可以工作,但操作人员需要有关如何使代码“更好”的指针。跨度>
  • “有更好的方法吗?”这取决于您对“更好”的标准,1)您可以使用 switch/case,2)将索引甚至 ListBoxItem.Tag(例如枚举)映射到相应的 sql 查询甚至包含所有属性信息,3)继承的多态性,甚至组合或策略模式。除此之外,我建议您将 UI 逻辑与 Businesslogic 分开,尤其是与 DB-Access 代码分开。这种单一的方法将在未来的变化中为您带来大量工作。
  • 如果单个表达式针对三个或更多条件进行测试,您可以尝试switch。但是你的demo里只有两种情况,if...else会更好。

标签: c# sql visual-studio


【解决方案1】:

好吧,最初switch 语句会整理它:

   var i = listbox1.SelectedIndex;

   switch (i)
    {
        case 1:
            // do stuff
            break;
        case 2:
            // do other stuff
            break;
        default:
            break;
    }

但这很快也会变得笨拙。

【讨论】:

    【解决方案2】:

    我会做这样的事情。

    但是将 SelectIndexZero/SelectIndexOne 重命名为更具描述性的名称。

    我会保留 IF 语句,不要更改大小写,因为您没有默认大小写。只有2个非常具体的案例。如果 0 是默认值,我会将其更改为大小写。

    private void displayButton_Click(object sender, EventArgs e)
    {
        string connectionString = "Server= myservername; Database= nba_database; Integrated Security=True";
    
        SqlConnection cnn = new SqlConnection(connectionString);
    
        cnn.Open();
        // MessageBox.Show("Connection Established!");
    
        // define variables
        SqlCommand command;
        
        // define SQL statement
        if (listBox1.SelectedIndex == 0)
        {
            SelectIndexZero(cnn, command);
        }
        else if (listBox1.SelectedIndex == 1)
        {
            SelectIndexOne(cnn, command);
        }
    
        Dispose(cnn, command);
    }
    
    private void SelectIndexZero(SqlConnection cnn, SqlCommand command)
    {
        string sql = "SELECT LastName, FirstName " +
            "FROM Players, Teams " +
            "WHERE Players.TeamID = Teams.TeamID " +
            "AND Teams.Nickname = 'Hawks'";
    
        // command statement
        command = new SqlCommand(sql, cnn);
    
        textBox1.Text = command.ExecuteScalar().ToString();
        // Scalar returns the first column of the first row of the query
    }  
    
    private void SelectIndexOne(SqlConnection cnn, SqlCommand command)
    {
        string sql = "SELECT FirstName, LastName FROM Players WHERE Team = 'Milwaukee Bucks'" +
                            "AND Number <= 24";
    
        // command statement
        command = new SqlCommand(sql, cnn);
    
        SqlDataReader reader = command.ExecuteReader();
    
    
        // Get table values
    
        StringBuilder sb = new StringBuilder();
        while (reader.Read())
        {
            sb.AppendLine(reader.GetString(0).ToString() + " " + reader.GetString(1).ToString());
        }
    
        textBox1.Text = sb.ToString();
    }
    
    private void Dispose(SqlConnection cnn, SqlCommand command)
    {
        cnn.Close();
        command.Dispose();
    }
    

    【讨论】:

    • 如果SelectIndexZero 抛出异常,任何开放资源会发生什么。
    • 为什么要将SqlCommand 的实例作为参数传递给SelectedIndexZero 只是为了用新实例覆盖它:command = new SqlCommand(sql, cnn);
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多