尝试在同一连接中运行多个命令时 C# Winforms Npgsql 3.0.5“操作已在进行中”错误

Posted

技术标签:

【中文标题】尝试在同一连接中运行多个命令时 C# Winforms Npgsql 3.0.5“操作已在进行中”错误【英文标题】:C# Winforms Npgsql 3.0.5 "An operation already in progress" error when trying to run multiple commands inside same connection 【发布时间】:2016-07-16 23:33:17 【问题描述】:

我正在尝试在 C# Winforms 中运行以下 sn-p。这段代码适用于 pgsql 2.2.6 适配器。为了与 pgsql3.0.5 适配器正常工作,可以进行哪些更正?谢谢。

NpgsqlConnection conn = new NpgsqlConnection(MainForm2.MyConString);
        
            conn.Open();
            using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT rfid,name,sc_id from passenger ORDER by name", conn))
            
                NpgsqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                
                    var obj = new PassengerClass
                    
                        RFID = dr.GetString(0),
                        Name = dr.GetString(1),
                        sc_id = dr.GetInt32(2)
                    ;
                    s = dr.GetString(0);
                    try  ret.Add(s, obj); 
                    catch (Exception ex)  SM.Debug("Fail to add RFID Name in hash RFID:" + s + ex.ToString()); 
                
            
            MainForm2.PassHash = ret;
            try
            
                using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format("UPDATE place set useridx =0 where useridx=0", MainForm2.userIDX), conn))
                    cmd.ExecuteNonQuery();

                using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format("UPDATE zonename set useridx =0 where useridx=0", MainForm2.userIDX), conn))
                    cmd.ExecuteNonQuery();
            
            catch (Exception ex)
            
                SM.Debug("Error on update users IDX for place and zone with value 0 :" + ex.ToString());
            

所以,在第二个命令语句中,它给了我以下错误:

“System.InvalidOperationException”类型的第一次机会异常 发生在 Npgsql.dll 中

附加信息:操作已在进行中。

编辑附加信息:

【问题讨论】:

【参考方案1】:

您需要处理在第一个 ExecuteReader 调用中获得的 NpgsqlDataReader:使用 using 语句包装它,就像使用 NpgsqlCommand 一样。

处理 NpgsqlDataReader 不会关闭连接 - 只有处理连接才会这样做。打开的阅读器对应于当前正在运行的打开命令,您必须在执行新命令之前关闭该命令。对于原子性,您可以只启动一个包含多个命令的事务。

【讨论】:

Disposing NpgsqlDataReader 会关闭连接,所以在读取一些数据后我需要重新打开它吗?必须是原子性的,以不同的方法隔离每个sql语句吗?谢谢。 释放 NpgsqlDataReader 不会关闭连接 - 只有释放连接才会这样做。打开的阅读器对应于当前正在运行的打开命令,您必须在执行新命令之前关闭该命令。为了原子性,只需启动一个包含多个命令的事务。

以上是关于尝试在同一连接中运行多个命令时 C# Winforms Npgsql 3.0.5“操作已在进行中”错误的主要内容,如果未能解决你的问题,请参考以下文章

同一端口套接字C ++上的多个连接

thrift中c#同一个服务怎么运行多个service

C# directshow 连接多个图

如何打开 telnet 连接并在 C# 中运行一些命令

C#:在多个进程和/或线程之间共享数据的最佳方式

C# linq:在同一属性字段的列表中检查多个条件