2011-12-21 153 views
2

这是手册中给出的一个例子。当我尝试相同的时候,我得到了很多例外。这是什么错误。Npgsql奇怪的异常

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一起使用?

+0

您是否在异常之前得到任何结果,并且postgres日志中是否有错误? 'NpgsqlState.IterateThroughAllResponses'解析非结果查询的响应,并且在连接正在清理时发送内部查询。我认为在这里,或者Npgsql有bug或者你的代码中存在一个bug(也许你的连接字符串或者查询中没有给出你的示例代码就是错误所在),然后Npgsql使用来自内部的消息而不是对问题的一个很好的解释。 – 2011-12-21 01:44:04

+1

此外,你可以显示你真正的''connstring''和''select命令'',只需将用户名,服务器名和密码改为XXXX即可。显然你不想公布那个,但问题可能在那里。 – 2011-12-21 01:45:02

+1

这似乎是Npgsql中的一个问题,它无法正确处理错误情况。奇怪的部分是为什么处理连接时出现IOException。运行程序时是否断开与服务器的连接? – 2011-12-21 03:11:39

回答

3

如果您将DataReader与Idisposable一起使用,Npgsql不处理连接中断。如果服务器在与应用程序通信之前终止连接,并且连接返回到连接池,则连接会到服务器以检查连接,并且此时数据读取器不会正确处理。在多线程环境中,这会在不幸的情况下出现。如果服务器将自己从连接中断开,它不应该立即终止,否则Npgsql无法与其通信。将服务器的断开时间提高一些。我是强行断开服务器的情况。

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