2011-12-21 3 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 есть ошибка, либо в вашем коде есть ошибка (возможно, ваша строка соединения или запрос, который вы не указываете в вашем примере кода, где ошибка лежит), а затем Npgsql плохо справляется с сообщение из его внутренних компонентов, а не хорошее объяснение проблемы. –

+1

Кроме того, вы могли бы показать свою настоящую '' connstring ''и' "команду" 'только с именем пользователя, именем сервера и паролем, измененным на XXXX. Очевидно, вы не хотите публиковать это, но проблема может быть там. –

+1

Это похоже на проблему в Npgsql, где она неправильно обрабатывает ситуацию с ошибкой. Странная часть - это то, почему вы получаете IOExceptions при удалении соединения. Отключаете ли вы от сервера во время запуска вашей программы? –

ответ

3

Npgsql не обрабатывает взаимосвязи соединений, если вы используете datareader с Idisposable. Если сервер завершает соединение до того, как он связывается с приложением, и когда соединение возвращается в пул соединений, он переходит к серверу, чтобы проверить соединение, и к этому времени, datareader не будет правильно настроен. В многопоточной среде это произойдет в неудачных обстоятельствах. Если сервер отключается от соединения, он не должен заканчиваться так немедленно, что Npgsql не сможет связаться с ним. Увеличьте время отключения сервера, чтобы оно было выше. Шахта - это случай внезапного принудительного отключения сервера.

Решение: Npgsql должно обрабатывать исключение внутри, которое еще не существует.

Смежные вопросы