0

私はasp.netのプログラマーです。私はC#を使用しています。毎回クエリを実行するための非常に長いコードを作成しました。次のコードをリファクタリングして整理するにはどうすればよいですか?

MySqlConnection connection = new MySqlConnection(connstring);
string query = "Select fo_region_Name from fo_region where fo_region_DeleteStatus=0";
MySqlCommand command = new MySqlCommand(query, connection);
MySqlDataReader reader;
connection.Open();
reader = command.ExecuteReader();
while (reader.Read())
{
    ddl_Country.Items.Add(UppercaseFirst(reader[0].ToString()));
}
connection.Close();

query = "Select Fo_Nationality_Name from fo_Nationality a, Fo_region b where a.Fo_Nationality_Type=1 and "
        + "LEFT(a.Fo_Nationality_Code,2)=LEFT(b.fo_region_Name,2)  and  a.Fo_Nationality_DeleteStatus=0 and "
        + "b.fo_region_DeleteStatus=0 Union Select Fo_Nationality_Name from fo_nationality where Fo_Nationality_DeleteStatus=0";
command = new MySqlCommand(query, connection);
connection.Open();
reader = command.ExecuteReader();
while (reader.Read())
{
    ddl_Nationality.Items.Add(UppercaseFirst(reader[0].ToString()));
}
connection.Close();

query = "select mcs_CreditCard_CardName from mcs_creditcard where mcs_CreditCard_DeleteStatus=0";
command = new MySqlCommand(query, connection);
connection.Open();
reader = command.ExecuteReader();
while (reader.Read())
{
    ddl_CreditCard.Items.Add(UppercaseFirst(reader[0].ToString()));
}
connection.Close();
4

2 に答える 2

2

いくつかの考え:

  • 複数行の文字列を使用してSQLステートメントをフォーマットします。
  • 各コマンドの実行の間に接続を閉じて再度開く必要はありません。
  • また、新しい接続オブジェクトとコマンドオブジェクトを作成する必要もありません(この場合)。
    • コマンドオブジェクトにパラメータがある場合は、古いパラメータをクリアするよりも、新しいコマンドオブジェクトを作成する方が簡単です。
  • ステートメントを使用varして、C#コンパイラに変数の型を自動的に決定させます。
  • 廃棄する必要のあるオブジェクトをusingブロックにラップします。

using (var connection = new MySqlConnection(connstring)) {
    connection.Open();

    using (var command = new MySqlCommand()) {
        MySqlDataReader reader;

        command.CommandText = @"
            SELECT fo_region_Name
            FROM fo_region
            WHERE fo_region_DeleteStatus=0
        ";
        using (reader = command.ExecuteReader()) {
            while (reader.Read()) {
                ddl_Country.Items.Add(UppercaseFirst(reader[0].ToString()));
            }
        }

        command.CommandText = @"
            SELECT Fo_Nationality_Name
            FROM fo_Nationality a,
                Fo_region b
            WHERE a.Fo_Nationality_Type = 1
                AND LEFT(a.Fo_Nationality_Code,2) = LEFT(b.fo_region_Name,2)
                AND b.fo_region_DeleteStatus=0

            UNION SELECT Fo_Nationality_Name 
            FROM fo_nationality
            WHERE Fo_Nationality_DeleteStatus=0
        ";
        using (reader = command.ExecuteReader()) {
            while (reader.Read()) {
                ddl_Nationality.Items.Add(UppercaseFirst(reader[0].ToString()));
            }
        }

        command.CommandText = @"
            SELECT mcs_CreditCard_CardName
            FROM mcs_creditcard
            WHERE mcs_CreditCard_DeleteStatus = 0
        ";
        using (reader = command.ExecuteReader()) {
            while (reader.Read()) {
                ddl_Nationality.Items.Add(UppercaseFirst(reader[0].ToString()));
            }
        }
    }
}

LINQの場合(using System.Data.Commonステートメントを追加):

        using (reader = command.ExecuteReader()) {
            /*while (reader.Read()) {
                ddl_Country.Items.Add(UppercaseFirst(reader[0].ToString()));
            }*/
            ddl_Country.Items.AddRange((
                from DbDataRecord row in reader
                select new ListItem(
                    UppercaseFirst(reader.GetString(0))
                )
            ).ToArray());
        }
于 2012-12-18T07:29:24.927 に答える
-2

たぶん、データベースを扱うコードの量を減らすために、EnterpriseLibraryを使用することができます。

于 2012-12-18T06:34:11.030 に答える