c# - Npgsql 奇怪的异常

标签 c# .net postgresql exception npgsql

这是手册中给出的示例。当我尝试同样的操作时,我得到了无数的异常(exception)。这有什么错误。

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

现在可以正常工作了。有什么区别:

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]);
    }
}

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

最佳答案

如果您使用带有 Idisposable 的数据读取器,Npgsql 不会处理连接中断。如果服务器在与应用程序通信之前终止连接,并且当连接返回到连接池时,它会去服务器检查连接,此时数据读取器没有得到正确处理。在多线程环境中,这会在不幸的情况下出现。如果服务器正在断开连接,它不应该立即终止以至于 Npgsql 无法与它通信。将服务器的断开连接时间增加得更长。我的是突然强行断开服务器的情况。

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

关于c# - Npgsql 奇怪的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8584055/

相关文章:

c# - 如何将 C# 库添加到 Monaco 编辑器(代码完成)并限制可能的库?

c# - VB.Net 和 C# 之间 LINQ 语法的差异

c# - 从字符串中删除所有内容,包括XYZ

.net - RX : Execute an action when a subscription is started or disposed?

c# - 缓存绝对过期是否保证缓存在准确的时间被淘汰?

.net - WinForm控件列出目录中的文件

.net - 为我的脚本语言切换到 DLR 的主要优势是什么?

linux - postgresql-9.4-postgis-2.1 的包依赖问题

mysql - 另一个表中存在的引用数 - PostgreSQL

node.js - 美元符号 ('$' ) 在 .query 的字符串中是什么意思?