Это пример, приведенный в руководстве. Когда я пытаюсь сделать то же самое, я получаю множество исключений. В чем ошибка в этом.
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 плохо справляется с этим с помощью сообщение от его внутренних органов, а не хорошее объяснение проблемы. - person Jon Hanna   schedule 21.12.2011"connstring"
и"select command"
только с именем пользователя, именем сервера и паролем, измененными на XXXX. Очевидно, вы не хотите публиковать это, но проблема может заключаться в этом. - person Jon Hanna   schedule 21.12.2011