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

More than 1 year has passed since last update.

CでデータベースSQLServer2022 クエリーしてみる(ステップ-1.5)

Last updated at Posted at 2023-12-29

はじめに

この記事のお題は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

データソースはこんな感じです。

mssql2.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か所くらいです。

odbcsql.c
    //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ファイルを選択します。
odbc.jpg

パスワードを入力します。言語はjapaneseを選択できます。
odbc2.jpg

ダイアログを[OK]で閉じますと、コマンドプロンプトに「Connected!」と出力されれば接続しています。その手前の2行が文字化けしていますが、とりあえず無視です。続いてSQLを投入します。
odbc3.jpg

無事に結果が返りました。

おわりに

すみません、タイムアウトです。このままCの状態でODBCダイアログが開くところはソースコード上の接続文字列とかに書き換えたいです。また日本語に対応させていきます。

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