C++/STLでODBC

C++でDBへアクセスするにはMFCだの、ADOだのややこしいライブラリをリンクするか、黙ってCで記述(各DBのライブラリを直接呼び出すコードを記述)するか、マネージドコードの仲間入りになるかになる。
最近流行りの言語(PHPとか)はあっさりDBをサポートしているのにC++/STLでさくっとSQLを書きたい場合、結構骨が折れる。
と言う訳で、なんちゃってodbcクラスを作りました。
以下のようにSQLが発行できちゃいます。


  db, "INSERT INTO test( c1, c2) VALUES(?,?)", "test", 100, endsql;

ぱっと見、何がなんだか分からないかもしれませんが、キモはSQL文に続けてパラメータが記述できる点で、結構楽にSQLが発行できます。
(見る人が見れば凶悪な演算子のオーバーロードに見えるかもしれないが・・・)
ちなみに、様々なDBに対応する為と、Linuxへの移植性を考えてODBCにしました。

ダウンロード(2011/04/15 SourceForgeにプロジェクトを作成しました)

5件のレスポンス “C++/STLでODBC”へ

  1. eiichi より:

    はじめまして。
    ダウンロードして使わせてもらいました。ヘッダにまとまってて使いやすそうです。
    当方の環境はUbuntu8.10(2009/4/20の時点で最新の安定版です)
    コンパイル時に3ヵ所エラーが出ましたので報告です。
    (1) #include に関連した部分はにするようにとコンパイラに言われるので、そうしてみました。
    (2)SQLGetData()の6番目の引数が、SQLINTEGER*ではなくSQLLEN*にしないとコンパイル通らず。rbufsizeという変数名で2ヶ所あります。
    (3)SQLDescribeCol()の7番目の引数も同じく、SQLULEN*にしないとだめといわれたので、そのように変更しました。こちらは1ヶ所だけです。

    以上ですが、ありがたく使わせてもらっています。
    ありがとうございました。

  2. eiichi より:

    あと、MySQL5に接続する際、ドライバ名を直に指定しようとすると、
    Driver={MySQL ODBC 5.1 Driver}
    Driver=MySQL ODBC 5.1 Driver
    とする必要がありました。
    直接Kz_odbcとは関係ありませんが、サンプルコードでAccessのDBを指定する文字列が
    Driver={Microsoft Access Driver (*.mdb)};
    となっていましたので、参考までです。

  3. Katsuhisa Ohfuji より:

    eiichiさんはじめまして、おおふじです。

    Ubuntu8.10の動作確認連絡ありがとうございます。
    幾つか修正があったということで、
    Vine Linuxでは、そのままコンパイルできたので、
    ODBC関係のライブラリがVine Linuxとは異なるようですね。
    機会があれば私の方でも試してみたいと思います。

    Driverの{}の記述ですが、私の手元で確認しましたところ、
    Windows/Vine Linux共無くても動きました。
    利用者に無用な混乱を与えてもよくないと思うので、次回のバージョンからは
    サンプルの{}は無しでリリースします。

    ご連絡ありがとうございました。

  4. eiichi より:

    おおふじさんこちらこそはじめまして。返事くださってありがとうございます。
    SQLUINTEGER が unsigned int に、SQLULEN が long に定義されていて、64ビット環境だとコンパイルが通らなくなるようです。私が試したのは、64ビットのUbuntu8.10でした。

  5. katsuhisa より:

    eiichiさん、返信ありがとうございます。

    なるほど、64bit環境でしたか。
    SQLGetDataのプロトタイプを確認しましたところ、
    SQLINTEGERではなく、SQLLENが正解でした。

    32Bit環境ではどちらも同じintで定義してあったので、
    コンパイルが通ったみたいですね。
    その他、SQLDescribeColの引数がSQLULENで定義されていました。

    コンパイルだけですが、連休中にUbuntu8.10で試してみました。

    更新版をUPしました。

コメントを残す

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