以下のエラー事象が発生した場合は、データベースの切り替えが発生した可能性があります。この場合、コネクションの再接続を行って、トランザクションを再実行してください。
PQresultErrorField()でPG_DIAG_SQLSTATEに"57P01"が返却される。
PQresultErrorField()でPG_DIAG_SQLSTATEにNULLが返却される。
PGconn *conn; PGresult *res; … res = PQexec(conn, "~"); if (PQresultStatus(res) != PGRES_COMMAND_OK) /* (注) */ { if (PQresultErrorField(res, PG_DIAG_SQLSTATE) == NULL || strcmp(PQresultErrorField(res, PG_DIAG_SQLSTATE),"57P01") == 0) { PQclear(res); /* 再接続処理へ */ } else { PQclear(res); /* その他のエラー */ } }
注)実行するSQL文により、PGRES_COMMAND_OK(データを返さないSQL文の場合) と、 PGRES_TUPLES_OK(データを返すSQL文の場合)を使い分けます。
注意
データベースの切り替えが完了するまでは、コネクションの接続がエラー終了します。PQstatus()はCONNECTION_BADを返却します。
5秒間隔で20回、再接続をリトライする場合。
PGconn *conn; int count = 0; do{ count++; PQreset(conn); if (PQstatus(conn) != CONNECTION_OK) { if (count < 20){ #if defined(WIN32) Sleep(5000); #else sleep(5); #endif }else{ /* 再接続失敗 */ } }else{ /* 再接続完了 */ } }while(1);