はじめに
この記事のお題はMindでデータベースPostgreSQL16.1にクエリーしてみる(ステップ1.6)」です。ステップ1.6は「CでデータベースMySQL8.3 クエリーしてみる(ステップ1.6)結果セット文字列返し書式解除」と同レベルを意味します。
ステップ1.5では結果セットの文字列返しの際にDLL側でパイプを付ける書式制御を残していましたが、1.6はそれをとりましたという意味です。今回はMind側で書式制御してみます。
この記事内容の作業環境
Windows11 Pro 22H2
CPU Intel(R) Core(TM) i3-5005U 2.00 GHz
Microsoft Visual Studio Community 2022 Version 17.4.4
Microsoft Visual C++ 2022
Mind Version 8.0.08 for Windows
postgresql-16.1-1-windows-x64
pgAdmin4↑これにはいってたやつ
psqlodbc_16_00_0000-x86
お題のデータべース
データベース名 日本語プログラミング言語
テーブル構成はC(ステップ0.0)をご参照ください。
EncordingはUTF8、文字タイプはJapanese_Japan.932(Shift-JIS)、照合順序はJapanese_Japan.932です。
お題のソースコード
C
C側のプロジェクト配置構成はC(ステップ0.5)を
ソースコードはC(ステップ1.3)dll化SJIS対応とC(ステップ1.5)結果セット文字列返し対応とCでデータベースMySQL8.3 クエリーしてみる(ステップ1.6)結果セット文字列返し書式解除をご参照ください。
C状態での変更点
DLLは1.6からの変更点はありません。検証用コンソールアプリケーションはMind側と同様に接続文字列を変更し、SELECT文の列名のダブルクォーテーション囲みを行って検証しました。
Mind
Mindのソース全体像はMind(ステップ1.0)とMind(ステップ1.1)をご参照ください。
ODBC接続文字列を変更しました。データベース名とテーブル名は日本語で問題ありませんでしたが、列名はダブルクオーテーションで囲わないとエラーになってしまいました。
また、パイプ「|」を各列の値の間に挿入しています。
メインとは
datasourceは 文字列定数 「Driver={PostgreSQL UNICODE};Server=localhost;Port=5432;Database=日本語プログラミング言語;UID=postgres;PWD=****;&00&&00&」
SELECTは 文字列定数 「SELECT * FROM 言語名 WHERE "言語ID" IN (1,7)&00&
retは 変数
resultSetは 変数
iは 変数
API初期処理しておき retに 入れ
[ret ≠ 0] ならば 終わり つぎに
datasourceで DB接続し retに 入れ
[ret = 0] ならば 「DB接続 成功」を 一行表示し
SELECTで SQL実行し resultSetに 入れ
[resultSet ≠ 0] ならば
[i := 1]
ここから
resultSetの 列データ(i)が 0に 等しい ならば 打ち切り つぎに
「|」を 表示し
resultSetの 列データ(i)を Mind文字列に変換し 表示し
iを 一つ増加し
繰り返し
つぎに
DB切断し
さもなければ 「DB接続 失敗」を 一行表示し
つぎに
API破棄処理すること。
実行結果
では実行します。
C:\pmind\sample>mssqlodbc.exe
ODBCライブラリをロードする
ロード成功
関数アドレス群を取得
取得成功
DSText --> Driver={PostgreSQL UNICODE};Server=localhost;Port=5432;Database=日本語プログラミング言語;UID=postgres;PWD=mind;
SQLAllocEnv --> 0
SQLAllocConnect --> 0
SQLConnect --> 0
SQLAllocStmt --> 0
DB接続 成功
SQLText(char) --> SELECT * FROM 言語名 WHERE "言語ID" IN (1,7)
SQLText --> SELECT * FROM 言語名 WHERE "言語ID" IN (1,7)
SQLExecDirect --> 0
|言語ID|言語名|公開年|よみがな|
|1|Mind|1985|まいんど|
|7|Mind for Android|2012|まいんどふぉーあんどろいど|
resultset --> free
SQLDisconnect --> 0
SQLFreeConnect --> 0
SQLFreeEnv --> 0
SUCCESS CLOSE
ODBCライブラリを破棄する
C:\pmind\sample>
無事に正常動作しました!
当初、言語IDの列名でひっかかっていることがなかなかわからず、ちょっとあせりました。(接続まではすんなり成功したのですが、その後のSELECT文実行でSQLExecDirectが-1を返していました。)偶然、PostgreSQL管理ツールのpgAdmin4で定義SQLを生成させたら、DB名、テーブル名、列名がすべてダブルクオーテーションで囲われていたので、囲ってみたらあっさり動きました。
おわりに
次回はクエリのパラメータ化またはトランザクション制御に進行したいですが、ちょっとお休みします。たぶん。
参考情報
PostgreSQLのODBCドライバーは下記のサイトよりダウンロードしました。サーバー本体の32bitサポートは終了していますが、ドライバの32bitサポートは継続しているようです。