3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Mind9β Tcl拡張単語とC言語DLL拡張単語でPostgreSQLにODBCトランザクション

Last updated at Posted at 2025-03-01

はじめに

Mind9βを開発元@killyさんの御厚意により評価用としてご提供いただきましたので、Mind9βのTclとのインターフェース単語でTclのOdbc接続をSQLServer、MySql、PostgreSQLで評価してまいりました。また従来のMind7/8用に実装したC言語DLL拡張単語のodbcのC言語インターフェースが動作することをSQLServerで確認しました。今回はTcl評価時と同じSQLテキストを使ってC言語でのOdbc接続をPostgreSQLに対して行ってみます。

前提条件

Windows11 Pro 22H2 22621.4169
mind version9-BETA-6

Microsoft Visual Studio Community 2022 Version 17.4.4
Microsoft Visual C++ 2022

postgresql-16.1-1-windows-x64
pgAdmin4↑これにはいってたやつ
psqlodbc_16_00_0000-x86

下記のRDBにも対応はしていますが、今回検証環境はPostgreSQLです。
SQL Server 16.0.1000.6 Express Edition
SQL Server Management Studio 19.2.56.2
MySQL Community Server 8.3.0 winx64
mysql-workbench-community-8.0.36-winx64
mysql-connector-odbc-8.0.35-win32

お題のデータべース

SQLServer、Mysql、PostgreSQLでは共通のテーブル構成のデータベースを作成しています。データベース名は「日本語プログラミング言語」です。今回もそれを利用します。今回検証しているのはPostgreSQLです。

db.png

お題のソースコード

C

C側のプロジェクト配置構成はこちらの記事をご参照ください。

Mind

ライブラリ

ライブラリのソースコードはお手数ですがこちらの記事をご参照ください。

PostgreSQL版テスト用コード

基本的な書き味はSQLServer版と同じですが、SQLコマンドテキストの内容はTcl版のPostgreSQL版とほぼ同じにしています。ほぼというのは、C言語のODBCのプレースホルダーは「?」で動作しましたので、その点が異なっています。

testpsgodbcc.src
"odbcc"を コンパイルする。

datasourceSqlsvrは 文字列定数 「Driver={ODBC Driver 17 for SQL Server};Server=(local)\SQLEXPRESS;Database=日本語プログラミング言語;UID=sa;PWD=mind;」。
datasourceMysqlは 文字列定数 「Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Port=3306;Database=日本語プログラミング言語;UID=root;PWD=mind;charset=cp932」。
datasourcePgsqlは 文字列定数 「Driver={PostgreSQL UNICODE};Server=localhost;Port=5432;Database=日本語プログラミング言語;UID=postgres;PWD=mind;」。


メインとは

	※SELECTは   文字列定数 「SELECT * FROM 言語名 WHERE 言語ID IN (1,7)」
      SELECTは   文字列定数 「SELECT LN."言語ID",LN."言語名",LN."よみがな",DLN."開発言語ID",DLN."開発言語名" FROM "言語名" AS LN 」続
    「LEFT JOIN "開発言語" AS DL ON LN."言語ID" = DL."言語ID" 」続
    「LEFT JOIN "開発言語名" AS DLN ON DLN."開発言語ID"=DL."開発言語ID" WHERE LN."言語ID" IN (?,?)」
  INSERT1は   文字列定数 「INSERT INTO "開発言語名" ("開発言語ID","開発言語名") VALUES (?,?)」
  INSERT2は   文字列定数 「INSERT INTO "開発言語" ("言語ID","開発言語ID") VALUES (?,?)」
  UPDATEは   文字列定数 「UPDATE "言語名" SET "よみがな" = ? WHERE "言語ID" = ?」
  DELETEは   文字列定数 「DELETE "開発言語" WHERE "言語ID" = ? AND "開発言語ID" = ?」
	成否は 		変数

	API初期処理しておき 成功に 等しい でなければ 終わり つぎに

	datasourcePgsqlで DB接続し 成功に 等しい でなければ 終わり つぎに


		SELECTで SQL文をセットし
		1で 整数のSQLパラメータをセットし
		7で 整数のSQLパラメータをセットし
		結果セット取得し 結果セットを表示する

		トランザクションを開始し

        ここからトランザクションの スコープ開始

            UPDATEで SQL文をセットし
            「あたらしいよみがな」で 文字列のSQLパラメータをセットし
            7で 整数のSQLパラメータをセットし
            SQLコマンド実行し 成否に 入れ
            成否が 成功に 等しい でなければ スコープを抜け出し	
            つぎに

			INSERT1で SQL文をセットし
            10で 整数のSQLパラメータをセットし
            "Tcl/Tk"で 文字列のSQLパラメータをセットし
			SQLコマンド実行し 成否に 入れ
			成否が 成功に 等しい でなければ スコープを抜け出し
			つぎに

            INSERT2で SQL文をセットし
            1で 整数のSQLパラメータをセットし
            10で 整数のSQLパラメータをセットし
			SQLコマンド実行し 成否に 入れ
			成否が 成功に 等しい でなければ スコープを抜け出し
			つぎに
	
		ここまでスコープ

		成否が 成功に 等しい 
        ならば コミットし
		さもなければ	 
			SQLエラー取得し Mind文字列に変換し 一行表示し
			ロールバックし
		つぎに

		SELECTで SQL文をセットし
		1で 整数のSQLパラメータをセットし
		7で 整数のSQLパラメータをセットし
		結果セット取得し 結果セットを表示する

		DB切断し


	API破棄処理すること。

ビルド結果

ではビルドします。

C:\developments\vscode\mind9>mind testpsgodbcc file

日本語プログラミング言語 Mind Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> testpsgodbcc.exe

今回はすぐに成功しました。

実行結果

ではつづいて実行してみます。データベースの状態は過日のTcl版での成功済状態ですので、UPDATEの後のINSERT1がPK制約でエラーとなり、UPDATEがロールバックされる想定です。

C:\developments\vscode\mind9>testpsgodbcc
ODBCライブラリをロードする
ロード成功
関数アドレス群を取得
取得成功
DB接続 成功
|言語ID|言語名|よみがな|開発言語ID|開発言語名|
|1|Mind|まいんど|8|Mind|
|1|Mind|まいんど|1|C|
|7|Mind for Android|まいんどふぉーあんどろいど|3|Java|
23505 ERROR: 重複したキー値は一意性制約"開発言語名_pkey"違反となります
DETAIL: キー ("開発言語ID")=(10) はすでに存在します。;
Error while executing the query
|言語ID|言語名|よみがな|開発言語ID|開発言語名|
|1|Mind|まいんど|8|Mind|
|1|Mind|まいんど|1|C|
|7|Mind for Android|まいんどふぉーあんどろいど|3|Java|
ODBCライブラリを破棄する

無事にロールバック成功しました。「Mind for Android」のよみがなが更新されていませんね。次にデータべースの状態から重複要素を削除して再実行します。

C:\developments\vscode\mind9>testpsgodbcc
ODBCライブラリをロードする
ロード成功
関数アドレス群を取得
取得成功
DB接続 成功
|言語ID|言語名|よみがな|開発言語ID|開発言語名|
|1|Mind|まいんど|8|Mind|
|1|Mind|まいんど|1|C|
|7|Mind for Android|まいんどふぉーあんどろいど|3|Java|
|言語ID|言語名|よみがな|開発言語ID|開発言語名|
|1|Mind|まいんど|8|Mind|
|1|Mind|まいんど|1|C|
|1|Mind|まいんど|10|Tcl/Tk|
|7|Mind for Android|あたらしいよみがな|3|Java|
ODBCライブラリを破棄する

無事にトランザクションコミットしました。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?