1
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でMySQLに照会(Tcl評価のtdbc:odbc)

1
Posted at

はじめに

日本語プログラミング言語Mindのバージョン9の言語拡張機能「評価」でTclのODBCデータベース操作ライブラリをつかってSQLServer、Mysql、PostgreSQL、SQLiteに対する共通処理単語を実装しております。今回はMysqlでの動作を検証します。Mind9ベータ版で実装のリリース版での追検証となります。本記事はマニュアル未記載な内容でMind9の本来のサポートレベルを超えた内容です。

前提条件

Windows11 Pro 22H2 22621.4317
mind version 9.03

MySQL Community Server 8.3.0 winx64
mysql-workbench-community-8.0.36-winx64
mysql-connector-odbc-8.0.35-win32 odbcドライバーは32bit版です。

Mind9の言語拡張機能「評価」とは

ご関心があるようでしたならば、たいへんお手数ですが、こちらの記事をご参照ください。
また、こちらの記事より「評価した値」ではなく、エラー結果を返す「評価した値0」を使用することにより、エラー情報の取得を別途、単語「参照0」を使用して行っています。

参考情報

tclDatabaseにはMysql、PostgreSQL、SQLLite固有のパッケージがありますが、今回評価しているのはtdbc:odbcというODBC接続用パッケージです。

お題のデータべース

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

db.png

お題のソースコード

前記ODBC接続用パッケージを使ったMind記述のodbctclライブラリを使用します。ODBC接続用TclランタイムはMind9パッケージに含まれていますが、当ライブラリはユーザー作成ライブラリです。また、TclはMind9の場合Tcl/Tkを利用するために導入されているため、GUIライブラリに依存する関係となります。

TCL用ODBCライブラリ

たいへんお手数ですが、ソースコード全体はこちらの記事をご参照ください。この範囲のコードはMind9依存です。Mind9非依存のC言語拡張のODBCライブラリと概ねMind単語の仕様を揃えています。

DB接続とDB接続の単語です。

構文 = <接続文字列>を DB接続する → <真/偽>
構文 = DB切断する → <真/偽>

SQL文とプレースホルダをセットする単語です。

構文 = <SQL文字列>SQL文をセットし
構文 = <プレースホルダ文字列>と <数値>で 整数のSQLパラメータをセット → ・
構文 = <プレースホルダ文字列>と <文字列>で 文字列のSQLパラメータをセット → ・

SQL文を実行する単語で前者は結果セットが返るもの、後者は結果セットが返らないものです。

構文 = 結果セット取得 → <結果文字列> <真/偽>
構文 = SQLコマンド実行 → <真/偽>

結果セットを構造体に格納するコード

こちらのコードは型のキャストは行っていない簡易コードなので、各DB共通コードとなっています。こちらの記事をご参照ください。

この範囲のコードはMind7/8/9で動作します。

MySQL版テスト用コード

このソースコードはSQL文の記法が若干DB固有コードとなっています。この範囲では接続文字列以外はSQLServerと同じです。

mysqlodbctcl3.src
"odbctcl3.src"を コンパイル。
"wordsSeparate.src"を コンパイル。
"viewmodel2.src"を コンパイル。

datasourceMysqlは 文字列定数 「Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Port=3306;Database=日本語プログラミング言語;UID=root;PWD=********」。

TCLのODBCで照会するとは (・ → ・)
  SELECTは   文字列定数 「SELECT LN.言語ID,LN.言語名,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 (:id1,:id2)」
    成否は 変数

    ODBCライブラリをロードし 成否に 入れ
    成否が 失敗に 等しい
    ならば エラーをモニタし 終わり
    つぎに
    datasourceMysqlで DB接続し 成否に 入れ
    成否が 失敗に 等しい
    ならば エラーをモニタし 終わり
    つぎに

    SELECTで SQL文をセットし
    "id1"と 1で 整数のSQLパラメータをセットし
    "id2"と 7で 整数のSQLパラメータをセットし
    コマンドラインをモニタ
    結果セット取得し 成否に 入れ
    成否が 失敗に 等しい
    ならば  捨て 
            エラーをモニタし
            DB切断し 捨て 終わり
    つぎに
 
    結果をVIEW開発言語に格納し
    VIEW開発言語を出力し

    DB切断し 失敗に 等しい
    ならば エラーをモニタし 終わり
    つぎに。

※ テスト用
メインとは
    コンソールを開く

    TCLのODBCで照会すること。

お題のソースコードのMind9でのビルド

TclはMind9の場合Tcl/Tkを利用するために導入されているため、GUIアプリケーション用のライブラリguilibからのコンパイルが必須となります。

C:\developments\vscode\mind9\odbc>mind mysqlodbctcl3 guilib

日本語プログラミング言語 Mind Version 9.03 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\Mind9\bin\mindexw.exe --> mysqlodbctcl3.exe

お題のMind9での実行の様子

それでは実行してみます。実際にはMindがコンソールウィンドウを開いています。


set stmt [$db prepare  {SELECT LN.言語ID,LN.言語名,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 (:id1,:id2)}]
set id1 1
set id2 7


結果をVIEW開発言語に格納する開始
1       Mind    まいんど        1985    1       C
1       Mind    まいんど        1985    8       Mind
1       Mind    まいんど        1985    10      Tcl/Tk
7       MindforAndroid  あたらしいよみがな      2012    3       Java

結果の行数:4
1|Mind|まいんど|1985|1|C
1|Mind|まいんど|1985|8|Mind
1|Mind|まいんど|1985|10|Tcl/Tk
7|MindforAndroid|あたらしいよみがな|2012|3|Java

無事に動作しました:tada:
「結果をVIEW開発言語に格納する開始」という行出力の後の4行が、Tclが返している結果セットの文字列をそのまま出力したものです。

「結果の行数:4」の後が、結果セットの文字列を構造体配列に格納してから、それをパイプ区切りでコンソール出力したものです。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。普段はJavaの場合はSpringBootといっしょにmybatisを、C#の場合はEntityFrameworkをよく使います。

1
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
1
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?