C# Npgsql奇怪异常

C# Npgsql奇怪异常,c#,.net,postgresql,exception,npgsql,C#,.net,Postgresql,Exception,Npgsql,这是手册中给出的一个示例。当我尝试同样的方法时,我会遇到无数的异常。这有什么错 using(NpgsqlConnection conn = new NpgsqlConnection("connstring")) { conn.Open(); using(NpgsqlCommand command = new NpgsqlCommand("select command", conn)) { command.Parameters.Add(new NpgsqlP

这是手册中给出的一个示例。当我尝试同样的方法时,我会遇到无数的异常。这有什么错

using(NpgsqlConnection conn = new NpgsqlConnection("connstring"))
{
    conn.Open();
    using(NpgsqlCommand command = new NpgsqlCommand("select command", conn))
    {
        command.Parameters.Add(new NpgsqlParameter("column1", NpgsqlDbType.Integer);
        command.Parameters[0].Value = 4;
        using(NpgsqlDataReader dr = command.ExecuteReader())
        {
            dr.Read();
            Console.Write("{0} \t", dr[0]);
        }
    }
}
例外情况:

System exception System.IO.IOException: I/O error occurred.
at Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__a.MoveNext()
at Npgsql.NpgsqlState.IterateThroughAllResponses(IEnumerable`1 ienum)
at Npgsql.NpgsqlState.Query(NpgsqlConnector context, NpgsqlCommand command)
at Npgsql.NpgsqlConnector.Query(NpgsqlCommand queryCommand)
at Npgsql.NpgsqlConnector.ReleaseRegisteredListen()
at Npgsql.NpgsqlConnector.ReleaseResources()
at Npgsql.NpgsqlConnectorPool.UngetPooledConnector(NpgsqlConnection Connection, NpgsqlConnector Connector)
at Npgsql.NpgsqlConnectorPool.ReleasePooledConnectorInternal(NpgsqlConnection Connection, NpgsqlConnector Connector)
at Npgsql.NpgsqlConnectorPool.ReleasePooledConnector(NpgsqlConnection Connection, NpgsqlConnector Connector)
at Npgsql.NpgsqlConnectorPool.ReleaseConnector(NpgsqlConnection Connection, NpgsqlConnector Connector)
at Npgsql.NpgsqlConnection.Close()
at Npgsql.NpgsqlConnection.Dispose(Boolean disposing)
at System.ComponentModel.Component.Dispose()

为什么datareader不能与Idisposable一起使用?

如果您将datareader与Idisposable一起使用,Npgsql不会处理连接中断。如果服务器在与应用程序通信之前终止连接,并且当连接返回到连接池时,它将转到服务器检查连接,此时datareader无法正确处理。在多线程环境中,这将在不幸的情况下出现。如果服务器正在断开自身与连接的连接,那么它不应该立即终止,以致Npgsql无法与其通信。将服务器的断开连接时间延长一点。我的例子是突然强行断开服务器的连接


解决方案:Npgsql应在内部处理尚未出现的异常。

在异常发生之前,您是否得到任何结果,以及postgres日志中是否存在任何错误
NpgsqlState.iteratethrawallresponses
正在解析非结果查询的响应,并且在清理连接时会发送内部查询。不过,我认为在这里,要么Npgsql有缺陷,要么代码中有缺陷(也许示例代码中没有给出的连接字符串或查询就是缺陷所在),然后Npgsql用内部消息处理它,而不是对问题进行很好的解释。另外,您能展示一下真正的
“connstring”吗
“选择命令”
,仅将用户名、服务器名和密码更改为XXXX。显然,您不想发布它,但问题可能就在那里。这似乎是Npgsql中的一个问题,它没有正确处理错误情况。奇怪的是,为什么在处理连接时会出现IOException。您在运行程序时是否与服务器断开连接?@FranciscoJunior:我编辑了这个问题,因为如果datareader未与using(不可识别)一起使用,它会工作。请检查并建议为什么这没有正确发生。好奇者和好奇者。如果有什么区别的话,应该是相反的。Npgsql这样做绝对不正确。您的代码中可能有一个bug(同样,我们可以看到真正的字符串吗?)。这绝对是一个错误列表。
using(NpgsqlConnection conn = new NpgsqlConnection("connstring"))
{
    conn.Open();
    using(NpgsqlCommand command = new NpgsqlCommand("select command", conn))
    {
        command.Parameters.Add(new NpgsqlParameter("column1", NpgsqlDbType.Integer);
        command.Parameters[0].Value = 4;
        NpgsqlDataReader dr = command.ExecuteReader();            
        dr.Read();
        Console.Write("{0} \t", dr[0]);
    }
}