在同一连接中多次执行存储过程

时间:2018-09-08 00:13:33

标签: c# executescalar command-objects

使用命令对象甚至可以做到吗?我需要更改此代码或代码,以在基于同一连接的一组参数(从“记录列表”对象创建的)中多次运行proc(sp_insertRecord)。现在,它将创建逗号分隔的插入脚本并立即执行所有操作。团队负责人建议使用分号立即将存储的过程和参数分开。我如何按照Leader的建议进行操作,而不是在为每个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 :(得分:1)

这使用相同的DbConnectionDbCommand,但是遍历记录:

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而不是存储过程,那可能是最快的选择。

相关问题