我正在像这样的伪代码循环处理文件:
foreach (filename in files) {
database("insert into file_processed(filename) values (@filename)")
database("delete from file_staging")
foreach (line in filename) {
database("insert into filestaging(column, list) values (@line.split()")
}
database("merge filestaging into filepermanent")
database("commit");
}
问题是:一旦我执行commit(),循环的顶部插入就会失败,因为提交终止了事务。
是否可以在不终止事务的情况下进行commit()?
注意:我很确定答案是否定的,但我很高兴感到惊讶。
是否可以将新事务与现有SqlCommand相关联?
该问题的上下文是,目前我仅看到一种关联New SqlCommand(...)
上交易的方法。在设置参数的所有其他开销中,让它一直循环运行似乎是一种浪费。
public void InsertRunHistory(string datasource, DateTime rundate)
{
SqlCommand command = InsertIVS_RUNHISTORY;
command.SetTransaction(transaction); // Does this exist?
command.Parameters[0].Value = datasource;
command.Parameters[1].Value = rundate;
command.Parameters[2].Value = r_activity_id;
ivs_runhistory_id = (int)command.ExecuteScalar();
}
答案 0 :(得分:0)
我找到了魔术命令。 这行代码来自我的示例:
command.SetTransaction(transaction);
已替换为:
command.Transaction = transaction;
也就是说,它是由SqlCommand对象上的属性设置的。
在我的实际代码中,我没有在与Execute相同的方法中进行设置,而是在循环的顶部进行了操作。
无需创建新的SqlCommand,因为可以为现有的SqlCommand分配新的SqlTransaction。