Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

4
2

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βでSQLServer、Mysql、PostgreSQLにTclODBC接続

Last updated at Posted at 2025-01-25

はじめに

今年の1月にMind9βを開発元@killyさんの御厚意により評価用としてご提供いただきましたので、前回の記事からMind関係者の中では以前から話題となっていたTclのデータベースアクセス機能について検討してみました。TclのODBCデータベース操作ライブラリやTcl自体についてほぼ知識がないので手探り状態からのスタートです。

昨年2024年のいまごろは
MindでデータベースSQLServer2022 トランザクションしてみる(ステップ2.0)トランザクション事始めというような記事を投稿していました。

これはマイクロソフトのODBC規格のインターフェースをC/C++で実装された公開サンプルをCで調整実装してMind用のインターフェースとしてDLL化した事案でした。

他に下記のようなデータベースについても接続検証しておりましたので、今回これらの環境も引き続き利用いたします。
MindでデータベースMySQL8.3 クエリーしてみる(ステップ1.5)結果セット受け取り
MindでデータベースPostgreSQL16.1 クエリーしてみる(ステップ1.6)結果セット文字列返し書式解除

前提条件

Windows11 Pro 22H2 22621.4169
mind version9-BETA-6

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
postgresql-16.1-1-windows-x64
pgAdmin4↑これにはいってたやつ
psqlodbc_16_00_0000-x86

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

ご関心があるようでしならば、たいへんお手数ですが、こちらの記事をご参照ください。

参考情報

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

お題のデータべース

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

db.png

お題のソースコード

今回は各データベースへの接続情報はSQL文はテストプログラムソース側に移して、ライブラリ側はよりライブラリっぽくしました。

ライブラリ

odebctcl.src
コマンドトークン設定は コマンドラインにトークンを設定と 等価。
コマンドトークン追加は コマンドラインにトークンを追加と 等価。

接続文字列最大長は 定数 400バイト。
SQL文字列最大長は 定数 2000バイト。

改行コマンドトークン設定とは (トークン → ・)
    コマンドトークン設定し
    「&LF&」を コマンドトークン追加すること。

改行コマンドトークン追加とは (トークン → ・)
    コマンドトークン追加し
    「&LF&」を コマンドトークン追加すること。

ODBCライブラリをロードとは (・ → ・)
    "package require tdbc::odbc"を 評価すること。

SQL実行とは 	 (接続文字列 SQL文字列 → 結果文字列)
        connectStrは 文字列実体 長さ 接続文字列最大長
        commandStrは 文字列実体 長さ SQL文字列最大長
    commandStrに 入れ
    connectStrに 入れ
    「set stdout [open "CONOUT$" "w"]」を 改行コマンドトークン設定し
    「fconfigure $stdout -buffering line」を 改行コマンドトークン追加し
    「set connectionString {」を コマンドトークン追加し
    connectStrを コマンドトークン追加し
    「}」を 改行コマンドトークン追加し
    「set db [tdbc::odbc::connection create db $connectionString]」を 改行コマンドトークン追加し
    「set stmt [$db prepare {」を コマンドトークン追加し
    commandStrを コマンドトークンを追加し
    「}]」を 改行コマンドトークン追加し
    「set result [$stmt execute]」を 改行コマンドトークン追加し
    「$result foreach row {」を 改行コマンドトークン追加し
    「puts $stdout [dict get $row]」を 改行コマンドトークン追加し
    「}」を 改行コマンドトークン追加し
    「$result close」を 改行コマンドトークン追加し
    「$stmt close」を 改行コマンドトークン追加し
    「$db close」を 改行コマンドトークン追加し
    「close $stdout」を コマンドトークン追加し
     コマンドラインを 評価した値を 返すこと。 

結果をモニタするとは (結果文字列 → ・)
    表示し 改行すること。

コマンドラインをモニタするとは (・ → ・)
    改行し
    コマンドラインを 表示し 改行し 改行すること。

テスト用コード

testodbctcl.src
"odbctcl.src"を コンパイル。

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;」。
SELECT1は   文字列定数 「SELECT * FROM 言語名 WHERE 言語ID IN (1,7)」。
SELECT2は   文字列定数 「SELECT * FROM 言語名 言語名 WHERE "言語ID" IN (1,7)」。

TCLのODBCでクエリするとは (・ → ・)

    ODBCライブラリをロードし
    datasourceSqlsvrと SELECT1で SQL実行し 結果をモニタし
    コマンドラインをモニタし
    datasourceMySqlと SELECT1で SQL実行し 結果をモニタし
    コマンドラインをモニタし
    datasourcePgsqlと SELECT2で SQL実行し 結果をモニタし
    コマンドラインをモニタすること。

※ テスト用
メインとは
    コンソールを開く
    
    TCLのODBCでクエリすること。

SQLServerとMysqlのSELECT文はいまのところ共通ですが、PostgreSQLは日本語列名をダブルクォーテーションで囲わないと「言語id」になってしまうため囲っています。

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

C:\developments\vscode\mind9>mind testodbctcl guilib 

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

ビルド成功しました!:tada:

お題のMind9βでの実行の様子

コンソールウィンドウを展開していますので、CUI出力を以下に示します。
前半は実行した結果、後半はMindのTcl評価へ与えたTclスクリプトの確認用出力です。これを3つのデータベースに対して実行しました。

言語ID 1 言語名 Mind 公開年 1985 よみがな まいんど
言語ID 7 言語名 {Mind for Android} 公開年 2012 よみがな まいんどふぉーあんどろいd


set stdout [open "CONOUT$" "w"]
fconfigure $stdout -buffering line
set connectionString {Driver={ODBC Driver 17 for SQL Server};Server=(local)\SQLEXPRESS;Database=日本語プログラミング言語;UID=sa;PWD=****;}
set db [tdbc::odbc::connection create db $connectionString]
set stmt [$db prepare {SELECT * FROM 言語名 WHERE 言語ID IN (1,7)}]
set result [$stmt execute]
$result foreach row {
puts $stdout [dict get $row]
}
$result close
$stmt close
$db close
close $stdout

言語ID 1 言語名 Mind 公開年 1985 よみがな まいんど
言語ID 7 言語名 {Mind for Android} 公開年 2012 よみがな まいんどふぉーあんどろいど


set stdout [open "CONOUT$" "w"]
fconfigure $stdout -buffering line
set connectionString {Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Port=3306;Database=日本語プログラミング言語;UID=root;PWD=****;charset=cp932}
set db [tdbc::odbc::connection create db $connectionString]
set stmt [$db prepare {SELECT * FROM 言語名 WHERE 言語ID IN (1,7)}]
set result [$stmt execute]
$result foreach row {
puts $stdout [dict get $row]
}
$result close
$stmt close
$db close
close $stdout

言語ID 1 言語名 Mind 公開年 1985 よみがな まいんど
言語ID 7 言語名 {Mind for Android} 公開年 2012 よみがな まいんどふぉーあんどろいど


set stdout [open "CONOUT$" "w"]
fconfigure $stdout -buffering line
set connectionString {Driver={PostgreSQL UNICODE};Server=localhost;Port=5432;Database=日本語プログラミング言語;UID=postgres;PWD=****;}
set db [tdbc::odbc::connection create db $connectionString]
set stmt [$db prepare {SELECT * FROM 言語名 言語名 WHERE "言語ID" IN (1,7)}]
set result [$stmt execute]
$result foreach row {
puts $stdout [dict get $row]
}
$result close
$stmt close
$db close
close $stdout

動きました:tada:

次回はもう少し複雑な結合クエリーやパラメータ化、結果の項目切り出し方法などを検討してみます。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!

4
2
5

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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?