質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

2297閲覧

PostgreSQL(C++/ODBC接続)

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/18 03:10

編集2021/01/18 05:59

前提・実現したいこと

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)

添付画像はODBCアドミニストレータの設定です。
ODBCアドミニストレータ
PostgreSQL ANSI ODBC セットアップ
高度な設定:設定1
高度な設定:設定2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/01/18 03:34

現状のご提示のコードでは、 rc = SQLAllocEnv(&henv); rc = SQLAllocConnect(henv,&hdbc); ...以下続く のように、SQLxxx関連の関数実行時の返り値をすべて無視しています。これらの返り値を関数リファレンスと突き合せてひとつひとつチェックし、関数が正しく終了しているかを確認してください。現状ですとどこまでOKなのか分かりません。
退会済みユーザー

退会済みユーザー

2021/01/18 03:43

回答ありがとうございます。 rcに代入される関数の戻り値が全て数字で帰ってきてしまい内容が分かりません。 どのように判断すればよいのかご教授お願いできませんでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/18 04:03

大変失礼いたしました。 if文にて追加を行い確認したところ SQLDriverConnectにてエラーが発生していました。 内容はSQL_ERRORです。
dodox86

2021/01/18 04:03

> rcに代入される関数の戻り値が全て数字で帰ってきてしまい内容が分かりません。 いや、それは当然です。どういう経緯で導入されたのか分かりませんが、大抵の場合、コードを流用してすぐ動くほど簡単ではありません。 > どのように判断すればよいのかご教授お願いできませんでしょうか? ODBCのAPIリファレンスを見ます。大抵の場合、返り値はエラーの要因を示す値になります。 以下はマイクロソフトのものですが、Microsoft SQL Serverに依っているかもしれないので気を付けてください。 https://docs.microsoft.com/ja-jp/sql/odbc/reference/syntax/odbc-api-reference?view=sql-server-ver15 PostgreSQLのODBCドライバーは商用も含めて色々あるようなので、その製品にあったものを利用するのが確実です。 お使いのインストーラーのパッケージに同梱しているのではないでしょうか。(詳細は、分かりません) 尚、本コメントは回答でなく、「現状の質問内容では情報が少なくて有効な回答を得られないと思いますよ。」との思いからの単なるコメントです。
退会済みユーザー

退会済みユーザー

2021/01/18 04:06

ありがとうございます。 参考にさせていただきます。 無礼な質問大変失礼いたしました。
退会済みユーザー

退会済みユーザー

2021/01/18 04:18 編集

書いてる間にコメント付いてたので削除
退会済みユーザー

退会済みユーザー

2021/01/19 06:20

connection successfulと表示されます。 ローカルホストでの接続が出来れば問題ないとのことですので、IP等は入力しておりません。IPをローカルの127.0.0.1で試してみましたが、テスト自体は成功。C++コードの同じ場所で接続が出来ていません。
退会済みユーザー

退会済みユーザー

2021/01/19 06:25

コンソールに出力しているエラー文字列では、どこで何のエラーが起きているか他人からはさっぱりなので、もう少し真面目にエラー表示処理を実装した方がよいでしょう。 APIリファレンスにも戻り値や診断の説明が書いてあるので、人に何か聞く前にまずきちんとリファレンスを隅々まで読んでください。
退会済みユーザー

退会済みユーザー

2021/01/19 06:44

リファレンスは読みました。 SQLError関数やそのほかの関数を利用し、Error内容を確認したくても、接続が出来ていないので値が返ってこず原因が分からないから質問しているのです。 その他バージョンや、セッティングファイルなどの見直し等も行いました。 分からないならコメントしないでください。時間の無駄ですよ。
退会済みユーザー

退会済みユーザー

2021/01/19 08:24 編集

DB接続失敗の原因もAPIで取得出来るようになっていますし、リファレンスでも触れられているのですが。自分の読解力が無いのを私に逆ギレされても困ります。 > 診断 >SQLConnectが SQL_ERROR または SQL_SUCCESS_WITH_INFO を返した場合、 > 関連付けられた SQLSTATE 値を取得するには、 handletype SQL_HANDLE_DBC > およびconnectionhandleのハンドルを指定してSQLGetDiagRecを呼び出します。 何か難しい事書いてあります? 基本的な資料に目を通す程度が出来ないのであれば、それこそやるだけ時間の無駄ですので諦めた方が無難です。MicrosoftにC++のサンプルもありますが、多分それすらも読んでなさそうですね。
退会済みユーザー

退会済みユーザー

2021/01/19 08:46

私の理解力が足りないことは認めます。 そこを議論しても意味がありません、なぜなら分からないから質問しているからです。 その上で再度投稿させていただきますが、 リファレンスは全て読みました。その上で分からないから質問しているのです。 リファレンスの文章を引用して投稿するなら私にもできます。 掲示されている関数は全て施行済みですが値が戻ってこないことは再三記述しています。 Microsoftのリファレンス及びサンプルコードは一番初めに目を通しています。 あなたがこの問題を解決できないことは十分に分かりました。 あなたの時間をこれ以上頂くわけにはいきませんので、これ以上の解答はご遠慮ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問