2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MindでデータベースSQLServer2022 クエリーしてみる(ステップ1.1)select文渡し

Last updated at Posted at 2024-01-11

はじめに

この記事のお題はMindでデータベースSQLServer2022にクエリーしてみる(ステップ1.1)」です。ステップ1.1とはまだ最初のステップで足踏みを意味します。

CでデータベースSQLServer2022 クエリーしてみる(ステップ1.1)dll化select文渡しという記事で単純なODBC接続、SELECT実行・結果表示、切断の実装をDLLにした状態からSELECT文を引数渡しするようにしていますので、今回はそのエクスポート関数を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.07 for Windows
SQL Server 16.0.1000.6 Express Edition
SQL Server Management Studio 19.2.56.2

お題のデータべース

データベース名 日本語プログラミング言語
テーブル構成はC(ステップ0.0)をご参照ください。

お題のソースコード

C

C側のソースコード、プロジェクト配置構成はC(ステップ0.5)C(ステップ1.1)dll化select文渡しをご参照ください。

Mind

Mindのソースは下記のとおりです。

メイン

まずメインです。なるべくシンプルな雰囲気になるようにしています。Mind文字列のNULL終端はいちばんお手軽な方法のやつです。

mssqlodbc.src
メインとは
	SELECTは   文字列定数 「SELECT * FROM 言語名&00&」
	API初期処理しておき

	DB接続し
	SELECTで SQL実行し
	DB切断し

	API破棄処理すること。

「API初期処理」と「API破棄処理」はCのDLLをロードして関数アドレスを取得する処理とDLLをアンロードする処理です。

API初期処理

mssqlodbc.src
API初期処理とは (・ → ・)

    「ODBCライブラリをロードする」を 一行表示し
    ODBCライブラリをロードし 偽? ならば 「ロード失敗」を 一行表示し 終り
     つぎに
    「ロード成功」を 一行表示し

    「関数アドレス群を取得」を 一行表示し
    ODBC関数アドレス群を取得し エラー? ならば 「取得失敗」を 一行表示し 終り
     つぎに
    「取得成功」を 一行表示する。

SQL実行

mssqlodbc.src
SQL実行とは
	execで アドレス指定でAPI呼出1する。

その他のソースコードはMind(ステップ1.0)をご参照ください。

実行結果

それでは実行してみます。ほんとに動くのか!?

C:\pmind\sample>mssqlodbc.exe
ODBCライブラリをロードする
ロード成功
関数アドレス群を取得
取得成功
SQLAllocEnv --> 0
SQLAllocConnect --> 0
SQLConnect --> 1
SQLAllocStmt --> 0
SUCCESS OPEN
SQLText --> SQLExecDirect --> -1
SQLDisconnect --> 0
SQLFreeConnect --> 0
SQLFreeEnv --> 0
SUCCESS CLOSE
ODBCライブラリを破棄する

C:\pmind\sample>

動きませんでした!?:joy: C側はSELECT文を認識していないようです。

mssqlodbc32.c
#define _EXPORTING

#include "mssqlodbc32.h"

__declspec(dllexport) void exec(wchar_t* select){
    setlocale(LC_ALL, "Japanese_Japan.932");
    printf("SQLText --> %ws\n", select);//☆この時点で文字列が出力されていない
    //照会する
    doSelect(henv, hdbc, hstmt, select);
    return;
}

おわりに

ごめんなさい。タイムアウトです。次回は問題解決を試みます。MindはANSI系のSJISかもしれないのでC側でワイド文字とか使っちゃいけないのかもしれません。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?