C# 事务抛出中的多个Dapper Execute()语句npgsqltransation已完成;它不再可用
我将dapper与npgsql一起使用。(.net核心3.1) 多个C# 事务抛出中的多个Dapper Execute()语句npgsqltransation已完成;它不再可用,c#,.net,postgresql,dapper,npgsql,C#,.net,Postgresql,Dapper,Npgsql,我将dapper与npgsql一起使用。(.net核心3.1) 多个连接。对一个连接执行(查询、参数、事务),并在一个事务内抛出此NpgsqlTransaction已完成;它不再可用。在末尾调用commit()时出现异常 每个sql execute语句都不会发生异常 调试代码时,我注意到事务的IsCompleted属性在第一次执行()调用后设置为true 所以我不能在一个事务中多次运行Execute() using (var connection = new NpgsqlConnection(_
连接。对一个连接执行(查询、参数、事务)
,并在一个事务内抛出此NpgsqlTransaction已完成;它不再可用。
在末尾调用commit()
时出现异常
每个sql execute语句都不会发生异常
调试代码时,我注意到事务的IsCompleted
属性在第一次执行()调用后设置为true
所以我不能在一个事务中多次运行Execute()
using (var connection = new NpgsqlConnection(_connectionString)) {
connection.Open();
using (var tr = connection.BeginTransaction()) {
foreach (var script in scripts)
{
try
{
connection.Execute(script.SqlQuery, script.Params);
}
catch (Exception e)
{
throw; //nothing crashes here
}
}
tr.Commit(); //NpgsqlTransaction has completed; it is no longer usable
}
}
当事务未使用时,一切正常,但我需要它
Upd 感谢@Marc Gravell让我看一下执行的sql代码 我有DDL脚本
创建表如果不存在名称(列类型);结束代码>。结束此处不需要code>运算符,但它导致事务的完成。在创建连接之后和创建事务之前,请自己添加连接。Open()
:
使用(var连接=新的NpgsqlConnection(_connectionString))
{
connection.Open();
使用(var tr=connection.BeginTransaction())
{
通常Dapper会在内部处理这个问题,但是如果您有多个操作必须在同一个底层连接上,它就不能
另外:告诉Dapper有关交易的信息:
connection.Execute(script.SqlQuery,script.Params,事务:tr);
@bidev脚本是否有可能提交事务本身?此处执行的脚本是什么?感谢@Marc gravel让我查看执行的sql代码。如果不存在名称(列类型),我将使用DDL脚本创建表;END;
。此处不需要END;
运算符,但它导致事务完成。