2

これらの行に沿って複数行の挿入ステートメントを作成したいと思います。

insert into foo (
    value1,
    value2,
    value3
) values 
( "1", "2", "3"),
( "4", "5", "6"),
( "7", "8", "9");

ここで、挿入される行数は可変です。IDBCommandパラメータ化を使用してこのクエリを作成する方法はありますか?

4

2 に答える 2

1

このようなものはうまくいくはずです。

IDbCommand cmd = new SqlCommand();
StringBuilder sb = new StringBuilder();
sb.Append("insert into foo(col, col2, col3), values");
int parms = 0;

for(int i = 0 ; i<3; i++)
{
    sb.AppendFormat("( @{0}, @{1}, @{2}),", parms, parms + 1, parms + 2);
    cmd.Parameters.Add(new SqlParameter((parms++).ToString(), ""));
    cmd.Parameters.Add(new SqlParameter((parms++).ToString(), ""));
    cmd.Parameters.Add(new SqlParameter((parms++).ToString(), ""));
}
sb.Append(";");
cmd.Parameters;
cmd.CommandText = sb.ToString().Replace(",;", ";");
于 2013-02-07T20:19:17.357 に答える
0

私の知る限り、IDbCommand一度に可変数のパラメーターを提供する方法はありません。ただし、一度作成してIDbCommand、パラメータ値の各セットに再利用できます。

using (IDbCommand command = myConn.CreateCommand())
{
    command.CommandText = "insert into foo (value1, value2, value3) values (@v1, @v2, @v3)";
    IDbDataParameter param1 = command.CreateParameter() { ParameterName = "@v1" };
    // param2, param3
    foreach (string[] row in records)
    {
        param1.Value = row[0];
        // param2, param3
        command.ExecuteNonQuery();
    }
}

特にトランザクション内では、パフォーマンスが懸念される場合、これは高速になるはずです。トランザクション内の1つの大きな連結挿入と複数の挿入のパフォーマンスについては、このスレッドを参照してください。ExecuteNonQuery

于 2013-02-07T20:06:00.673 に答える