Параметры IDBCommand для многострочной вставки

Я хочу создать многострочную инструкцию вставки по этим направлениям:

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

где количество строк для вставки является переменной. Есть ли способ построить этот запрос, используя IDBCommand параметризация?

2 ответа

Решение

Примерно так должно работать нормально.

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(",;", ";");

Насколько мне известно, нет способа предоставить переменное число параметров 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();
    }
}

Особенно в рамках транзакции это должно быть быстрым, если производительность была вашей заботой. См. Эту ветку для обсуждения производительности одной большой объединенной вставки против нескольких ExecuteNonQueryс в транзакции.

Другие вопросы по тегам