这是手册中提供的例子。然而当我尝试相同操作时,却出现了很多异常。问题在哪里呢?
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一起使用?
NpgsqlState.IterateThroughAllResponses
用于解析非结果查询的响应,当连接被清理时会发送内部查询。我认为这里可能是Npgsql存在缺陷,或者您的代码存在缺陷(也许是连接字符串或查询,在您的示例代码中没有给出),然后Npgsql处理不当,从其内部发出消息而不是对问题的良好解释。 - Jon Hanna"connstring"
和"select command"
,只需将用户名、服务器名和密码更改为 XXXX 即可。显然您不想公开这些信息,但问题可能就出在这里。 - Jon Hanna