-2

フォーム ロードでデータベース上の複数のデータを取得したいと考えています。しかし、コードが長くて繰り返していることがわかりました。誰かがこのコードをもう少し短くできますか?

これは私のコードです

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

        }
    }
4

2 に答える 2

1

まず、同じデータベースに 2 回接続しています。そして、あなたは同じ方法でそれを行っています(一度だけ接続するかどうかの決定に対して完全な力を持っていることは明らかです)。

次に、実際の選択実行を別のメソッドでラップできます。その別のメソッドは、呼び出し元からの接続を受信する必要があります (この特定のケースでは、データベースに 1 回だけ接続できますが、必要な数の選択を行うことができます)。

第三に、ExecuteReader を使用しないでください。ExecuteScalar を使用してください。

さらに: FormLoad で多くのことを行うべきではありません (UI がフリーズします)。そして、なぜ label の値に基づいてデータベースを照会しているのですか? それはあなたが何を意味するかを示すためにあなたが本当に速く書いた単なるサンプルでしたか、それとも実際のビジネスロジックですか?

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);
    }
}
于 2013-02-25T15:38:15.333 に答える
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();
            }
        }

    }
于 2013-02-25T15:33:37.820 に答える