在Form加载上获取数据库上的多个数据

时间:2013-02-25 15:26:33

标签: c# winforms

我想在表单加载中获取数据库中的多个数据。但我发现代码很长而且重复。有人可以让这段代码更短一些吗?

这是我的代码

private void Form1_Load(object sender, EventArgs e)
    {
        string a = label1.Text;
        string connString = "Server=Localhost;Database=this;Uid=root;password=root";
        using (var connection = new MySqlConnection(connString))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)");
                command.Parameters.AddWithValue("?room", a);
                command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    button1.Text = reader["Room_name"].ToString();
                }
            }
        }
        string b = label2.Text;
        string connString2 = "Server=Localhost;Database=this;Uid=root;password=root";
        using (var connection = new MySqlConnection(connString2))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)");
                command.Parameters.AddWithValue("?room", b);
                command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    button2.Text = reader["Room_name"].ToString();
                }
            }

        }
    }

2 个答案:

答案 0 :(得分:1)

首先,您要连接到同一个数据库两次。 而且你是用同样的方法做的(显然你对决定是否只连接一次有完全的权力)。

其次,您可以在单独的方法中包装实际的select执行。 这个单独的方法应该从调用者接收它的连接(因此在这种特殊情况下你能够只将ONCE连接到数据库,但是根据需要进行多次选择)。

第三,不要使用ExecuteReader,请使用ExecuteScalar。

另外:你不应该在FormLoad上做太多事情(UI会冻结)。 为什么要根据标签的值查询数据库? 这只是一个你写得非常快的样本,向我们展示你的意思,还是实际的商业逻辑?

private string GetRoomName_BasedOn_RoomNumber(string roomNumber, MyConnection connection) {
    using (var command = connection.CreateCommand())
    {
         command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)");
         command.Parameters.AddWithValue("?room", roomNumber);
         //command.ExecuteNonQuery();

         object response = command.ExecuteScalar();

         return response as string; // consider <null> as a "No such Room Number" signal
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    string a = label1.Text;
    string b = label2.Text;

    string connString = "Server=Localhost;Database=this;Uid=root;password=root";
    using (var connection = new MySqlConnection(connString))
    {
       connection.Open();
       button1.Text = this.GetRoomName_BasedOn_RoomNumber(a, connection);
       button2.Text = this.GetRoomName_BasedOn_RoomNumber(b, connection);
    }
}

答案 1 :(得分:0)

例如,您可以重构代码并将以下代码提取到方法中:

  private void DoSomething(MySqlConnection connection)
{            
using (var command = connection.CreateCommand())
        {
            command.CommandText = ("Select Room_name from firstfloor where Room_no=(?room)");
            command.Parameters.AddWithValue("?room", b);
            command.ExecuteNonQuery();

            MySqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                button2.Text = reader["Room_name"].ToString();
            }
        }

    }