1

非常に多数の列を持つテーブルに一連の挿入を行う必要があります。例:

INSERT INTO Table1 (A,B,C,...,Z) VALUES (@a,@b,@c,...,@z)

すべてのフィールド(AからZ)はNULL可能です。コマンドテキストに記述されているコマンドパラメータを明示的に設定しないと、挿入を実行できません。

列名は実際には連続していないため(すべてかなりランダムな名前が付いています)、コマンドテキストのパラメーターをループして、それらをに設定する簡単な方法はありますDBNull.Valueか?または、手動で書き出す必要がありますか?

cmd.Parameters.AddWithValue("@a", DBNull.Value);
cmd.Parameters.AddWithValue("@b", DBNull.Value);
cmd.Parameters.AddWithValue("@c", DBNull.Value);
...
cmd.Parameters.AddWithValue("@z", DBNull.Value);

または、実際に使用されている列を作成し、それらを連結して(および使用されているパラメーター)、使用されているパラメーターを設定するための適切なソリューションはありますか?

インジェクション攻撃の可能性を回避するために、クエリの連結ソリューションを敬遠する傾向があります。

4

4 に答える 4

4

各パラメータをnullに設定するためのより簡潔でクリーンな方法は次のとおりです。

foreach (var param in new[] { "@a", "@b", ... })
    cmd.Parameters.AddWithValue(param, DBNull.Value);

また、連結ソリューションを敬遠する傾向がありますが、列にDBで定義されたデフォルト値がある場合は異なる可能性があり、insertステートメントで明示的にnullを設定すると上書きされます(?)。

于 2012-06-26T13:00:19.857 に答える
2

はい、おそらく列名を読み取り、デフォルトのNULLに設定するコードを記述できます。その欠点は、システムデータベースを読み取るためにより高い権限が必要になることです。

次のようなストアドプロシージャの作成を検討することを強くお勧めします。

CREATE PROCEDURE [dbo].[spInsertTable1]
    @a type = NULL,
    @b type = NULL,
    @c type = NULL,
    -- ...
    @z type = NULL
AS
BEGIN
    INSERT INTO Table1 (A, B, C, ...., Z) VALUES
    (@a, @b, @c, ..., @z)
END

あなたは彼らがそれを次のように呼ぶことができます、

command.CommandText = "dbo.spInsertTable1";
command.CommandType = CommandType.StoredProcedure;
command.Paramaters.AddWithValue("@a", somevalue);
// No more are needed the stored procedure will default them to NULL.
于 2012-06-26T13:02:24.263 に答える
1

最初にテーブル定義を取得するには、テーブルに対して何かを実行する必要があります。次に、その定義を繰り返し処理して、パラメーターを作成できます。

したがって、「select top 0 * from tableName」を実行し、それをデータリーダーに取得してから、次のようにフィールドをループすることができます。

 for(int i=0;i<reader.FieldCount;i++)
 {
    cmd.Parameters.AddWithValue("@" + reader.GetName(i), DBNull.Value);
 }

これは、各フィールドがパラメーターとして同じように表されることを前提としています。

于 2012-06-26T13:03:50.987 に答える
1

1つの解決策は、さまざまなパラメーター名を格納する配列を作成し、その値を設定していない場合は、その配列を繰り返して各パラメーターをDBNullに設定することです。

// Assume paramNames is an array of strings containing each paramter name
foreach(strign param in paramNames)
{
    // Note: 'SettingValue()' and 'value' are a placeholders, as I don't 
    // know how you're determining which parameters are being used.
    if( SettingValue(param) )
    {
        cmd.Parameters.AddWithValue(param, value);
    }
    else
    {
        cmd.Parameters.AddWithValue(param, DBNull.Value);
    }
}

私は、連結ソリューションを敬遠することに同意します。自分自身に問いかけることの1つは、挿入に未使用の(そしてnull許容の)パラメーターが非常に多い場合、そもそもなぜそれらを持っているのかということです。そもそもそれらを含めずにINSERTを実行できるはずです。

後で参照するためにそれらが必要な場合は、パラメーター化されたクエリを使用するのではなく、データベースにストアドプロシージャを作成し、null許容パラメータにデフォルト値を指定できます。その場合、使用中のパラメーターを指定するだけで済みます。

于 2012-06-26T13:04:21.700 に答える