2

VS2008でPostgreSQLODBCドライバーをビルドし、odbcad32.exeを実行し、DSNを作成して、[テスト]ボタンをクリックします。正常に動作します。次に、フォルダをコピーしてVS2010で再構築し、同じアクションを実行しました。エラーメッセージが表示されます。クエリを送信できません(接続が停止しています)。

それから私は作りました:VS2005でコンパイルされました-すべての作品。Vs2012では-動作しません。デバッガーにチェックインしました:はい、そうです、短いクエリ実行中にソケットが閉じられました。ボタンテストは次のような一連のクエリを生成します。

set DateStyle to 'ISO'
....
set extra_float_digits to 2
...
[5912-1.471]CC_send_query: conn=04460048, query='select oid, typbasetype from pg_type where typname = 'lo''
[5912-1.472]send_query: done sending query 63bytes flushed
[5912-1.473]in QR_Constructor
[5912-1.473]exit QR_Constructor
[5912-1.473]read -1, global_socket_buffersize=4096
[5912-1.474]Lasterror=10035
[5912-1.474](5)Error while reading from the socket. ERRNO=10035
[5912-1.475]CC_error_statements: self=04460048
[5912-1.475]CONN ERROR: func=CC_send_query, desc='', errnum=107, errmsg='No response from the backend'
...
[5912-1.481]CC_lookup_characterset: entering...
[5912-1.481]CC_send_query: conn=04460048, query='select pg_client_encoding()'
[5912-1.482]CC_error_statements: self=04460048
[5912-1.482]CONN ERROR: func=CC_send_query, desc='', errnum=104, errmsg='Could not send Query(connection dead)'

この異なる動作の理由は何でしょうか?

4

1 に答える 1

2

「問題」は、VS2010 EWOULDBLOCK (errno.h で定義) != WSAEWOULDBLOCK 以来、開発者はこれら 2 つの値が同じであることに依存していましたが、次のようになります。

r = recv( ... );
if (r == -1 && WSAGetLastError() == EWOULDBLOCK) { ... }

以前のバージョンの VS で機能していたものが機能しなくなりました。

于 2013-02-06T17:11:57.477 に答える