0

这甚至可以使用命令对象吗?我需要更改此部分或代码以在同一连接中为一组参数(从记录列表对象创建)多次运行 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();          
}
4

1 回答 1

1

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

于 2018-09-08T01:05:13.880 回答