Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事务抛出中的多个Dapper Execute()语句npgsqltransation已完成;它不再可用_C#_.net_Postgresql_Dapper_Npgsql - Fatal编程技术网

C# 事务抛出中的多个Dapper Execute()语句npgsqltransation已完成;它不再可用

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(_

我将dapper与npgsql一起使用。(.net核心3.1)

多个
连接。对一个连接执行(查询、参数、事务)
,并在一个事务内抛出
此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脚本
创建表如果不存在名称(列类型);结束
结束运算符,但它导致事务的完成。

在创建连接之后和创建事务之前,请自己添加
连接。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;
运算符,但它导致事务完成。