使用命令对象甚至可以做到吗?我需要更改此代码或代码,以在基于同一连接的一组参数(从“记录列表”对象创建的)中多次运行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();
}
答案 0 :(得分: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
而不是存储过程,那可能是最快的选择。