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

9
我正在尝试在C# Winforms中运行以下代码片段。这段代码在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 中发生

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

enter image description here

编辑 附加信息: 在此输入图像描述

1个回答

15

您需要处理第一个ExecuteReader调用中获得的NpgsqlDataReader:将其与NpgsqlCommand一样用using语句包装。

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


释放 NpgsqlDataReader 将关闭连接,因此在读取一些数据后我需要重新打开它吗?必须具有原子性,在不同的方法中隔离每个 SQL 语句吗?谢谢。 - Adrian Stanculescu
1
释放 NpgsqlDataReader 不会关闭连接 - 只有释放连接才能实现这一点。打开的读取器对应于当前正在运行的打开命令,您必须在执行新命令之前关闭它。为了保证原子性,只需启动一个涵盖多个命令的事务即可。 - Shay Rojansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接