2

タイトルでどう説明したらいいのか本当にわかりませんが、ここに私の問題があります。

多くのオーバーロード メソッドの中で、特定の値を特定のテーブルに挿入することを唯一の目的とするこのメソッドを作成しました。

public static int Insert(string cs, string table, string[] values)
{
    using (SqlConnection con = new SqlConnection(cs))
    {
        try
        {
            string strCommand = string.Format(
                "INSERT INTO {0} VALUES ({1})", 
                table, 
                values.Aggregate((a, b) => (a + ", " +b)));
            SqlCommand com = new SqlCommand(strCommand, con);
            con.Open();
            int result = com.ExecuteNonQuery();
            return result;

        }
        catch (SqlException ex)
        {
            HttpContext.Current.Response.Write(ex.Message);
            return 0;
        }
    }
}

現在、パラメーター化されたクエリを使用していませんね。

このコンセプトを実際に実装したいのですが、方法がわかりません。

4

3 に答える 3

1

パラメータ名を含む文字列配列と、パラメータ値を含むオブジェクトの等しい長さの配列を渡すようにメソッドを変更する必要があります

public static int Insert(string cs, string table, string[] paramNames, object[] paramValues)
{
    using (SqlConnection con = new SqlConnection(cs))
    {
        try
        {
            string strCommand = string.Format(
                "INSERT INTO {0} VALUES ({1})", table, 
                paramNames.Aggregate((a, b) => (a + ", " +b)));

            SqlCommand com = new SqlCommand(strCommand, con);
            for(int x = 0; x < paramNames.Length; x++)
                com.Parameters.AddWithValue(paramNames[x], paramValues[x]);

            con.Open();
            int result = com.ExecuteNonQuery();
            return result;
        }
        catch (SqlException ex)
        {
            HttpContext.Current.Response.Write(ex.Message);
            return 0;
        }
    }
}

このようなものを使用してこのプロシージャを呼び出すことができます

string[] parNames = new string[] {"@keyID", "@custName"};
object[] parValues = new object[] {1, "Mike"};
DBHelper.Insert("constring", "customers", parNames, parValues);

ただし、このアプローチには多くの欠点があると言っておきましょう。特定の列のセットを渡さないため、すべての列の値を渡す必要があり、テーブルに Identity 列が含まれていると問題が発生します。(Identity 列の値を明示的に設定することはできません。)

したがって、パラメーター名の配列ではなく、列名の配列を渡す方がはるかに優れています。
この配列を使用すると、クエリをより適切にカスタマイズでき (フィールドを省略するなど)、パラメーター名を列名から派生させることができます。

public static int Insert(string cs, string table, string[] colNames, object[] paramValues)
{
    ......
          string strCommand = string.Format(
                "INSERT INTO {0} ({1}) VALUES ({2})", table, 
                colNames.Aggregate((a, b) => (a + ", " +b)),
                colNames.Select(n => "@" + n).Aggregate((a, b) => (a + ", " + b)));
    .....

            for(int x = 0; x < colNamesNames.Length; x++)
                com.Parameters.AddWithValue("@" + colNames[x], paramValues[x]);

}

もちろん、呼び出しのパラメーターを変更して、パラメーター名の代わりに列名を使用します。

string[] colNames = new string[] {"ID", "Name"};
于 2012-12-25T22:15:23.223 に答える