Выполнить хранимую процедуру несколько раз в одном соединении - PullRequest
0 голосов
/ 08 сентября 2018

Возможно ли это даже с помощью командного объекта? Мне нужно изменить этот кусок или код для запуска proc (sp_insertRecord) несколько раз для набора параметров (созданных из объекта списка записей) в одном и том же соединении на основе. Сейчас он создает скрипт вставки через запятую и выполняет все сразу. Руководитель группы предложил вызвать хранимую процедуру и параметры, разделяя их точкой с запятой. Как мне сделать это, как советовал Лидер, вместо вызова всего цикла, который выполняется для каждого набора объекта Records. Это единственный способ, которым я могу думать.

sql.Append(first.GetSqlInsertStatment());
Records.ForEach(a => sql.Append(CreateInsertValuesCommaSeperated()));

sql.Length -= 2;
using (var connection = GetDbConnection())
using (var cmd = connection.CreateCommand())
{     
    cmd.Connection.ChangeDatabase(schema);
    cmd.CommandText = sql.ToString();
    cmd.ExecuteNonQuery();          
}

1 Ответ

0 голосов
/ 08 сентября 2018

Здесь используются те же DbConnection и DbCommand, но итерации по записям:

using (var connection = GetDbConnection())
using (var cmd = connection.CreateCommand())
{     
    cmd.Connection.ChangeDatabase(schema);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "sp_insertRecord";

    cmd.Parameters.Add("@stringVal", SqlDbType.NVarChar);
    cmd.Parameters.Add("@numVal", SqlDbType.Int);
    cmd.Parameters.Add("@dateVal", SqlDbType.DateTime);

    int insertCount = 0;
    foreach(var record in records)
    {
        cmd.Parameters["@stringVal"].Value = record["stringVal"];
        cmd.Parameters["@numVal"].Value = record["numVal"];
        cmd.Parameters["@dateVal"].Value = record["dateVal"];

        insertCount += cmd.ExecuteNonQuery();
    }        
}

Я не уверен, к какому типу относятся ваши записи, но вы поняли идею.Если у вас есть возможность использовать SQLBulkCopy, а не хранимые процедуры, это, вероятно, самый быстрый вариант.

...