2011-12-21 101 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應處理內部尚未出現的異常。