はじめに
この記事のお題はCでデータベースSQLServer2022にクエリーしてみる(ステップ-1.5)」です。ステップ-1.5ということはまだうまくいってないことを意味します。
この記事内容の作業環境
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
SQL Server 16.0.1000.6 Express Edition
SQL Server Management Studio 19.2.56.2
お題のデータべース
データベース名 sample
テーブル名 language
項目名 | 項目型 |
---|---|
id | int |
name | nvarchar(50) |
お題のソースコード
learn.microsoft.comの日本語サイトの下記に公開されているソースコードを使用します。
このサンプルソースは下記のように紹介されています。
2013 年 10 月から 2019 年 7 月までの間に、このサンプルの C++ ODBC アプリケーションは 47,300 回ダウンロードされました。
これはC++で書かれていますが、後で述べます少しの変更でCで動きます。この記事の当座の目標はある言語用にSQLSeverのODBCを介した操作をCのライブラリとしておくことでした。ですので、C++での動作確認は現状有姿の挙動を最短で検証するためで、C++での深追いを目指してはおりません。
dsn
データソースはこんな感じです。
[ODBC]
DRIVER=ODBC Driver 17 for SQL Server
UID=sa
TrustServerCertificate=No
DATABASE=sample
WSID=DESKTOP-078KPRA
Trusted_Connection=No
SERVER=DESKTOP-078KPRA\SQLEXPRESS
Description=test
C++からCへの変更点
前提としてMSC++2022で動作するようにするための変更点は、C++の記事の余談を確認しておいてください。
Visual StudioでC++のソースコード(ここではodbcsql.cpp)を名前を付けて保存でodbcsql.cに変更して保存します。(ファイル拡張子をcppからcに変更)
ソリューションエクスプローラで[全てのファイルを表示]アイコンをクリックして、プロジェクト外のファイルも表示します。
odbcsql.cppを右クリックして「プロジェクトから除外」します。
odbcsql.cを右クリックして「プロジェクトへ追加」します。
そのままではけっこうな数のビルドエラーが出ますが、元を正すとすると4か所くらいです。
//bool fNoData = false;
int fNoData = 0;
do {
// Fetch a row
if (iCount++ >= gHeight - 2)
{
int nInputChar;
//bool fEnterReceived = false;
int fEnterReceived = 0;
while (!fEnterReceived)
{
wprintf(L" ");
SetConsole(cDisplaySize + 2, TRUE);
wprintf(L" Press ENTER to continue, Q to quit (height:%hd)", gHeight);
SetConsole(cDisplaySize + 2, FALSE);
nInputChar = _getch();
wprintf(L"\n");
if ((nInputChar == 'Q') || (nInputChar == 'q'))
{
goto Exit;
}
else if ('\r' == nInputChar)
{
//fEnterReceived = true;
fEnterReceived = 1;
}
// else loop back to display prompt again
}
iCount = 1;
DisplayTitles(hStmt, cDisplaySize + 1, pFirstBinding);
}
TRYODBC(hStmt, SQL_HANDLE_STMT, RetCode = SQLFetch(hStmt));
if (RetCode == SQL_NO_DATA_FOUND)
{
//fNoData = true;
fNoData = 1;
}
else
{
Cにはbooleanがないので、とりあえずint型にして0:false 1:trueとしています。もう少し力めば列挙型とかにすべきところかもしれません。
実行結果
それでは実行してみます。
コマンドプロンプトが開いた後、下図のようなデータソース選択ダイアログが開きますのであらかじめ用意しておいたDSNファイルを選択します。
パスワードを入力します。言語はjapaneseを選択できます。
ダイアログを[OK]で閉じますと、コマンドプロンプトに「Connected!」と出力されれば接続しています。その手前の2行が文字化けしていますが、とりあえず無視です。続いてSQLを投入します。
無事に結果が返りました。
おわりに
すみません、タイムアウトです。このままCの状態でODBCダイアログが開くところはソースコード上の接続文字列とかに書き換えたいです。また日本語に対応させていきます。