【ODBC使用】C++でDBの代わりにテキストファイル(CSV)に接続する方法

こんなことが分かるよ

・ODBCの使い方

・C++でテキストファイルをSQL文で接続する方法

社畜
社畜

ODBCを使ってテキストファイルに接続する方法を学んだので共有します!

こんな人向け

・ODBCの使い方が知りたい

・テキストファイルをSQL文で接続したい

・とにかくC++のソースコードが見たい

環境

OS:Windows 11 Home

SDK:VisualStudio2022

開発言語:C++

プロジェクトテンプレート:コンソールアプリ

今回は目次のStep1~Step4に沿って操作すればテキストファイルにSQL文で接続する方法が分かる内容になっています。

Step1:テキストドライバーの準備

まずはテキストファイルとプログラム間のデータ転送を簡単に行うためのコンポーネント(ODBCドライバー)をインストールします。

下記URLから64bit版を選択してダウンロードしてください。

Download Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント from Official Microsoft Download Center

ダウンロードを押すと、プログラムの選択画面が表示されるので、

「AccessDatabaseEngine_X64.exe」を選択してください。

ダウンロードされた「AccessDatabaseEngine_X64.exe」を実行してください。

これで、テキストドライバーの準備は完了です。

Step2:ODBCの設定

検索アイコンで「ODBC データ ソース (64 ビット)」と検索して、アプリを開いてください。

追加をクリックしてください。

「Microsoft Access Tect Driver (*.txt, *.csv)」を選択して完了を押してください。

①データソース名は「csv64」と入力

 これは任意の名前で大丈夫です。

 この後プログラムでODBCにアクセスするときの接続文字列(DNS)に使われます。

②「現在のフォルダーを使用する」のチェックを外します。

③「フォルダーの選択」をクリックします。

④CドライブのODBC(CSV)フォルダを選択します。

 ※このフォルダはあらかじめ作成しておきます。

DNS(データソース名)とフォルダーを確認したら「OK」をクリックします。

これで、ODBCの設定は異常です。

Step3:CSVの配置

Step2の④で選択した「ODBC(csv)」フォルダの中に「test.csv」を作っておきます。

このファイルがDBのテーブルに該当します。

※ファイルににカラムと行を記入したら、プログラムでDBのようにSQL文のSELECT文の実行で読み取ることが可能です。今回は省略します。

これでCSVの配置は以上です。

Step4:C++で実装

それではC++でODBCドライバーとデータソース(csv)へアクセスするプログラムを実装します。

テンプレートはコンソールアプリを用いました。

※MFCの場合もっと簡単に接続やSQL文の実行が行えると思います。

社畜
社畜

今回はあえてMFCを使わずに実装してみます。

ソースコードの量が多いので、いやになりそうです。

下記のプログラムをコピペするだけで、データソースへの接続が確立されるはずです。

*プロジェクトのプロパティで文字セットは「マルチ バイト文字セットを使用する」に設定しました。

// ODBC(csv)Connect.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。


#include <iostream>
#include <windows.h>  
#include <sqlext.h>  


#define NAME_LEN 50  



int main()
{
    std::cout << "Hello World!\n";

    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN retcode;
    SQLWCHAR  szUserID[NAME_LEN] ;
    SQLWCHAR szLoginDate[NAME_LEN] ;
    SQLLEN cbUserID = 0, cbLoginDate = 0;

    SQLCHAR* OutConnStr = (SQLCHAR*)malloc(255);
    SQLSMALLINT* OutConnStrLen = (SQLSMALLINT*)malloc(255);

    // Allocate environment handle  
    // 環境、接続、ステートメント、または記述子ハンドルを割り当てます。
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

     
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
    {
        // Set the ODBC version environment attribute 
        // 環境の側面を制御する属性を設定します。
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

 
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
        {
            // Allocate connection handle  
            // 環境、接続、ステートメント、または記述子ハンドルを割り当てます。
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

            
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
            {
                // Set login timeout to 5 seconds  
                // 接続の側面を制御する属性を設定します。
                // ログインタイムアウトを5秒に設定
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                // Connect to data source
                // ドライバーとデータ ソースへの接続を確立します。
                retcode = SQLConnect(hdbc, (SQLCHAR*)"csv64", SQL_NTS, (SQLCHAR*)NULL, 0, NULL, 0);

                
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
                {
                    // 接続成功時にここを通る
                    std::cout << "Success SCLConnect\n";
                    // Allocate statement handle  
                    // 環境、接続、ステートメント、または記述子ハンドルを割り当てます
                    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
                    
                      
                    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
                    {
                        // Process data
                        // 特定の環境、接続、ステートメント、または記述子ハンドルに関連付けられているリソースを解放
                        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
                    }

                    // 特定の接続ハンドルに関連付けられている接続を閉じます。
                    SQLDisconnect(hdbc);
                }
                // 特定の環境、接続、ステートメント、または記述子ハンドルに関連付けられているリソースを解放します。
                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        }
        // 特定の環境、接続、ステートメント、または記述子ハンドルに関連付けられているリソースを解放します。
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }

}

結果

コンソールアプリの実行画面はこちらです。

「Success SQLConnect」が表示されていれば成功です。

社畜
社畜

ソースコードは長いけど、データソース名「”csv64″」の部分を書き換えるだけで、

他のドライバーを使ってテキストやDBにアクセスできることが分かりましたね!

まとめ

ODBCを使うとプログラムが接続先の接続方法などを気にしなくてよくなる。

つまり、DBやテキストごとに別のプログラム作らなくてもよくなります!

社畜
社畜

ODBCはとにかく楽で便利だってことが分かりました!

使いこなしていきたいですね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA