0

再利用できない醜いコードがあります。似たような質問がたくさんあります。SqlParameterCollectionExtensionsまたは他のより良い方法で書き直したいと思います。しかし、私はSqlParameterCollectionExtensionsについてはまったく知りません。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        SqlConnection con = new SqlConnection(strCon);
        con.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "UPDATE Problem_DE SET ProbDesc = @ProbDesc, field_1 = @field_1, field_2 = @field_2, field_3 = @field_3, field_4 = @field_4, field_5 = @field_5, field_6 = @field_6, field_7 = @field_7 WHERE (ProbId = @ProbId)";
        if (e.NewValues["ProbDesc"] == null)
            cmd.Parameters.AddWithValue("@ProbDesc", DBNull.Value);
        else
            cmd.Parameters.AddWithValue("@ProbDesc", e.NewValues["ProbDesc"]);
        if (e.NewValues["field_1"] == null)
            cmd.Parameters.AddWithValue("@field_1", DBNull.Value);
        else
            cmd.Parameters.AddWithValue("@field_1", e.NewValues["field_1"]);
        if (e.NewValues["field_2"] == null)
            cmd.Parameters.AddWithValue("@field_2", DBNull.Value);
        else
            cmd.Parameters.AddWithValue("@field_2", e.NewValues["field_2"]);
        if (e.NewValues["field_3"] == null)
            cmd.Parameters.AddWithValue("@field_3", DBNull.Value);
        else
            cmd.Parameters.AddWithValue("@field_3", e.NewValues["field_3"]);

        if (e.NewValues["field_4"] == null)
            cmd.Parameters.AddWithValue("@field_4", DBNull.Value);
        else
            cmd.Parameters.AddWithValue("@field_4", e.NewValues["field_4"]);
         \\ blah blah
        cmd.ExecuteNonQuery();
        con.Close();
     }

SQLパラメータはeまたはテキストボックスなどから取得されます。ありがとうございます。

4

2 に答える 2

1

多分このようなもの?問題は、問題のテーブルに応じて、値の数が可変であるということだと思いますか?

private void UpdateProblem(string problemName, string problemDescription, int problemId, object[] fieldValues)
{
    SqlConnection   con = null;
    SqlCommand      cmd = new SqlCommand();
    StringBuilder   sql = new StringBuilder();
    int             fieldCounter = 1;

    // start building the sql statement
    sql.AppendFormat("UPDATE {0} SET ProbDesc = @ProbDesc", problemName);

    // add the 'description' parameter
    cmd.Parameters.Add(new SqlParameter("@ProbDesc", problemDescription));

    // add each field value to the update statement... the SqlParameter will infer the database type.
    foreach(object fieldValue in fieldValues)
    {
        // add additional SET clauses to the statement
        sql.AppendFormat(",field{0} = @field{0}", fieldCounter);

        // add the field parameter to the command's collection
        cmd.Parameters.Add(new SqlParameter(String.Format("@field{0}", fieldCounter), fieldValue));

        fieldCounter++;
    }

    // finish up the SQL statement by adding the where clause
    sql.Append(" WHERE (ProbId = @ProbId)");

    // add the 'problem ID' parameter to the command's collection
    cmd.Parameters.Add(new SqlParameter("@ProbId", problemId));

    // finally, execute the SQL
    try
    {
        con.Open();

        cmd.Connection = con;

        cmd.CommandText = sql.ToString();

        cmd.ExecuteNonQuery();
    }
    catch(SqlException ex)
    {
        // do some exception handling
    }
    finally
    {
        if(con != null)
            con.Dispose();
    }
}

このコードを呼び出す例は次のとおりです。

public void UpdateProblemDe()
{
    int         problemId = FetchCurrentProblemId();
    string      field1 = e.NewValues["field_1"];
    string      field2 = e.NewValues["field_2"];
    string      field3 = ddlField3.SelectedValue;
    int         field4 = Convert.ToInt32(e.NewValues["field_4"]);
    string      field5 = txtField5.Text;
    DateTime    field6 = DateTime.Now.AddSeconds(Convert.ToInt32(ddlField6.SelectedValue));
    string      field7 = txtField7.Text;
    object[6]   fieldValues;

    if(field1 != null)
        fieldValues[0] = field1;
    else
        fieldValues[0] = DBNull.Value;

    if(field2 != null)
        fieldValues[1] = field2;
    else
        fieldValues[1] = DBNull.Value

    fieldValues[2] = field3;
    fieldValues[3] = field4;    
    fieldValues[4] = field5;
    fieldValues[5] = field6;
    fieldValues[6] = field7;

    UpdateProblem("Problem_DE", "Houston, we have a problem", problemId, fieldValues);  
}   

上記のサンプルコードは、明らかにページコントロール値から格納されたオブジェクトの配列を作成する方法のデモンストレーションであり、本番コードに実装する必要のあるデータ検証は含まれていません。

実行時にobject[]配列の大きさがわからない場合は、オブジェクトの汎用リストに変更して、アイテムを動的に追加できます。

于 2012-04-12T00:55:45.860 に答える
0

この回答に基づいて、 新しいSQLCommandを作成するか 、次の方法でコードをリファクタリングできる同じものを再利用します

public class DbHepler
    {
        private readonly string _connectionString;
        public DbHepler(string connectionString)
        {
            _connectionString = connectionString;
        }

        public void ExecuteNonQuery(string query)
        {
            ExecuteNonQuery(query, null);
        }

        public void ExecuteNonQuery(string query, Dictionary<string, object> parameters)
        {
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = query;

                    if (parameters != null)
                    {
                        foreach (string parameter in parameters.Keys)
                        {
                            cmd.Parameters.AddWithValue(parameter, parameters[parameter] ?? DBNull.Value);
                        }
                    }

                    cmd.ExecuteNonQuery();
                }

                conn.Close();
            }
        }
    }

コードは次のようになります。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            string query = "UPDATE Problem_DE SET ProbDesc = @ProbDesc, field_1 = @field_1, field_2 = @field_2, field_3 = @field_3, field_4 = @field_4, field_5 = @field_5, field_6 = @field_6, field_7 = @field_7 WHERE (ProbId = @ProbId)";
            Dictionary<string, object> parameters = new Dictionary<string, object>();

            if (e.NewValues["ProbDesc"] == null)
                parameters.Add("@ProbDesc", null);
            else
                parameters.Add("@ProbDesc", e.NewValues["ProbDesc"]);

            //blah blah

            DbHepler dbHepler = new DbHepler("your sql connection info");
            dbHepler.ExecuteNonQuery(query, parameters);
         }
于 2012-04-12T00:56:16.217 に答える