前提・実現したいこと
C++とODBCを用いてPostgreSQLに接続しようとしています。
select文を実行するプログラムを作成したいのですが、データベースにうまく接続できていないようです。
発生している問題・エラーメッセージ
以下コンソールアウトプットです。
接続成功 接続成功 不明なエラー 不明なエラー 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa (6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6) 1878278344(0),Lo@(1878356328),do@oa(6)
・・・以下無限ループ
ODBCアドミニストレータ側の設定を見直してみましたがうまく動きません。
どなたかご教授願います。
該当のソースコード
C++
1#include <iostream> 2#include <string> 3 4#include <windows.h> 5#include <sql.h> 6#include <sqlext.h> 7 8#define data_size 64 9 10using namespace std; 11 12void rc_hantei(int rc); 13 14int main( int argc , char* argv[] ){ 15 16 //ODBCハンドル設定 17 HENV henv; //ODBC環境のハンドル 18 HDBC hdbc; //現在接続中のODBCハンドル 19 HSTMT hstmt; //SQL文実行用のハンドル(クエリ実行,テーブル値取得) 20 RETCODE rc; //関数の処理結果(戻り値保持用) 21 SQLCHAR CompliteConnect[255];//データの保管用 22 SWORD len; 23 24 //接続 25 rc = SQLAllocEnv(&henv); 26 rc_hantei(rc); 27 rc = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); 28 rc_hantei(rc); 29 rc = SQLConnect(hdbc, 30 (unsigned char*)"postgresqltest",SQL_NTS, 31 (unsigned char*)"postgres",SQL_NTS, 32 (unsigned char*)"Gen97702",SQL_NTS); 33 rc_hantei(rc); 34 rc = SQLAllocStmt(hdbc,&hstmt); 35 rc_hantei(rc); 36 37//********************************************************************* 38 SQLCHAR name[data_size],add[data_size]; 39 SQLINTEGER no,cbname,cbadd,cbno; 40//--------------------------------------------------------------------- 41 SQLCHAR mei[] ="SELECT * FROM test_table01;"; 42 rc = SQLExecDirect(hstmt, 43 mei,SQL_NTS); 44 SQLBindCol(hstmt,1,SQL_C_ULONG,&no,0,&cbno); 45 SQLBindCol(hstmt,2,SQL_C_CHAR,name,data_size,&cbname); 46 SQLBindCol(hstmt,3,SQL_C_CHAR,add,data_size,&cbadd); 47 while(TRUE) { 48 rc = SQLFetch(hstmt); 49 if( rc == SQL_NO_DATA )break; 50 if( rc == SQL_ERROR )break; 51 cerr << no << "(" << cbno << ")," 52 << name << "(" << cbname << ")," 53 << add << "(" << cbadd << ")" << endl; 54 } 55//********************************************************************* 56 57 //後処理 58 rc = SQLFreeStmt(hstmt,SQL_DROP);//ステートメントリソース解放 59 rc = SQLDisconnect(hdbc); //データベース切断 60 rc = SQLFreeConnect(hdbc); //接続リソースの解放 61 rc = SQLFreeEnv(henv); //ドライバリソースの解放 62} 63 64void rc_hantei(int rc){ 65 if( rc == SQL_SUCCESS )cout << "接続成功" << endl; 66 else if( rc == SQL_SUCCESS_WITH_INFO )cout << "警告あり" << endl; 67 else if( rc == SQL_INVALID_HANDLE )cout << "無効なハンドル" << endl; 68 else if( rc == SQL_ERROR )cout << "不明なエラー" << endl; 69 else cout << "?? debug error! ??" << endl; 70}
試したこと
ODBCアドミニストレータ側の設定見直し。
ソースコード中のSQLDriverConnect文の内容見直し
補足情報(FW/ツールのバージョンなど)
開発環境を記述します
言語:C++14
コンパイラ:MinGW
エディター:Visual Studio Code
OS:Windows10 home(64bit)
DB:PostgreSQL
ODBCドライバ情報:PostgreSQL ODBC Driver(ANSI)
あなたの回答
tips
プレビュー