はじめに
Qiitaに参加して3年目に突入しました。2年目にあたる昨年2024年のいまごろは
MindでデータベースSQLServer2022 トランザクションしてみる(ステップ2.0)トランザクション事始めというような記事を投稿していたようです。
これはマイクロソフトのODBC規格のインターフェースをC/C++で実装された公開サンプルをCで調整実装してMind用のインターフェースとしてDLL化した事案でした。
そして、今年の1月にMind9βを開発元@killyさんの御厚意により評価用としてご提供いただきましたので、Mind関係者の中では以前から話題となっていたTclのデータベースアクセス機能について検討してみました。TclのODBCデータベース操作ライブラリやTcl自体についてほぼ知識がないので手探り状態からのスタートです。
前提条件
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
9βの言語拡張機能「評価」とは
ご関心があるようでしならば、たいへんお手数ですが、こちらの記事をご参照ください。
お題のデータべース
データベース名 sample
テーブル名 language
項目名 | 項目型 |
---|---|
id | int |
name | nvarchar(50) |
お題のソースコード
ODBC接続文字列は前記の昨年のC言語での検証時の環境を流用しているためSQLServerとMySqlを定義していますが、今回検証しているのはSQLServerです。
当初のうち実行時エラーがいろいろ出ていた時はいったん日本語テーブルという要素を除いたため、SQLServer接続先は同じく当時評価用につかっていた英字テーブルとしております。
参考情報
ライブラリ
コマンドトークン設定は コマンドラインにトークンを設定と 等価。
コマンドトークン追加は コマンドラインにトークンを追加と 等価。
接続文字列最大長は 定数 400バイト。
SQL文字列最大長は 定数 2000バイト。
datasourceSqlsvrは 文字列定数 「Driver={ODBC Driver 17 for SQL Server};Server=(local)\SQLEXPRESS;Database=sample;UID=sa;PWD=****;」。
datasourceMysqlは 文字列定数 「Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Port=3306;Database=日本語プログラミング言語;UID=root;PWD=*****;charset=cp932」。
SELECT1は 文字列定数 「SELECT * FROM language WHERE id IN (1,2,3,4,5)」。
SELECT2は 文字列定数 「SELECT * FROM 言語名 WHERE 言語ID IN (1,7)」。
ODBCライブラリをロードとは (・ → ・)
"package require tdbc::odbc"を 評価すること。
SQL実行とは (接続文字列 SQL文字列 → ・)
connectStrは 文字列実体 長さ 接続文字列最大長
commandStrは 文字列実体 長さ SQL文字列最大長
commandStrに 入れ
connectStrに 入れ
「set stdout [open "CONOUT$" "w"]&LF&」を コマンドトークン設定し
「fconfigure $stdout -buffering line&LF&」を コマンドトークン追加し
「set connectionString {」を コマンドトークン追加し
connectStrを コマンドトークン追加し
「}&LF&」を コマンドトークン追加し
「set db [tdbc::odbc::connection create db $connectionString]&LF&」を コマンドトークン追加し
「set stmt [$db prepare {」を コマンドトークン追加し
commandStrを コマンドトークンを追加し
「}]&LF&」を コマンドトークン追加し
「set result [$stmt execute]&LF&」を コマンドトークン追加し
「$result foreach row {&LF&」を コマンドトークン追加し
「puts $stdout [dict get $row]&LF&」を コマンドトークン追加し
「}&LF&」を コマンドトークン追加し
「$result close&LF&」を コマンドトークン追加し
「$stmt close&LF&」を コマンドトークン追加し
「$db close&LF&」を コマンドトークン追加し
「close $stdout」を コマンドトークン追加し
コマンドラインを 表示し 改行し 改行し
コマンドラインを 評価した値を 表示し 改行すること。
TCLのODBCでクエリするとは (・ → ・)
ODBCライブラリをロードし
datasourceSqlsvrと SELECT1で SQL実行すること。
テスト用コード
"odbctcl.src"を コンパイルする。
※ テスト用
メインとは
TCLのODBCでクエリすること。
お題のソースコードのMind9βでのビルド
C:\developments\vscode\mind9>mind sqlsvrtcl guilib
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> sqlsvrtcl.exe
ビルド成功しました!
実はビルド成功はすんなりいくのですがTclスクリプトの実行時エラーを解消するのにだいぶ手間どりました。
お題のMind9βでの実行の様子
今回はコンソールウィンドウを展開していますので、CUI出力を以下に示します。
前半はMindのTcl評価へ与えたTclスクリプトの確認用出力です。このスクリプトを与えて実行した結果がその下のプログラミング言語名のような出力です。
set stdout [open "CONOUT$" "w"]
fconfigure $stdout -buffering line
set connectionString {Driver={ODBC Driver 17 for SQL Server};Server=(local)\SQLEXPRESS;Database=sample;UID=sa;PWD=mind;}
set db [tdbc::odbc::connection create db $connectionString]
set stmt [$db prepare {SELECT * FROM language WHERE id IN (1,2,3,4,5)}]
set result [$stmt execute]
$result foreach row {
puts $stdout [dict get $row]
}
$result close
$stmt close
$db close
close $stdout
id 1 name C
id 2 name C++
id 3 name Java
id 4 name C#
id 5 name Mind
動きました
どんな風に出力されるのかもわかってはいなかったので、とりあえずフィールド名と値が空白区切りで出力されることがわかりました。
次回は日本語データベースに接続してみます。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!
Qiitaに参加して3年目に突入しました。最初の記事が2023年1月22日の
トランスコンパイラの作り方 C言語を日本語プログラミング言語Mindにトランスコンパイルしてみる(四則演算版
という記事でした。