2016/03/28

Recent entries from same category

  1. RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」
  2. コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  3. C++ で flask ライクなウェブサーバ「clask」書いた。
  4. C++ 用 SQLite3 ORM 「sqlite_orm」が便利。
  5. zsh で PATH に相対パスを含んだ場合にコマンドが補完できないのは意図的かどうか。

Windows で C++ を使い、データベースの接続先を選ばないアプリケーションを書くのであれば ODBC 接続が一つの選択肢になります。しかし ODBC 接続のアプリケーションを書くのは非常に骨の折れる仕事です。

データの取得 - eternalwindows.jp
http://eternalwindows.jp/windevelop/odbc/odbc05.html

SQLAllocHandle によるハンドルの作成を事ある毎に行わなければなりません。そんな ODBC を使ったアプリケーションの開発を楽にしてくれそうなのが nanodbc です。

nanodbc

A small C++ wrapper for the native C ODBC API.

https://lexicalunit.github.io/nanodbc/

Windows で ODBC のシステムDSNに「mattn」という名前の接続情報を作り、今回は SQLite3 の ODBC ドライバを割り当てました。

odbc

コードも SQLAllocHandle が頻出しないのでとても綺麗に掛けます。

#include <nanodbc.h>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

int
main(int argc, char* argv[]) {
  try {
    nanodbc::connection conn("DSN=mattn");
    cout << "Connected with driver " << conn.driver_name() << endl;
    execute(conn, "drop table if exists example;");
    execute(conn, "create table example(id integer primary key, content text);");

    nanodbc::statement stmt(conn);
    prepare(stmt, "insert into example(content) values(?);");
    stmt.bind(0"ふー");
    nanodbc::result result = execute(stmt);
    cout << "\nAffected " << result.affected_rows() << " rows";

    nanodbc::result rows = execute(conn, "select * from example;");
    cout << "\nDisplaying " << rows.affected_rows() << " rows ";
    cout << "(" << rows.rowset_size() << " fetched at a time):" << endl;
    const short cols = rows.columns();
    for(short i = 0; i < cols; i++)
      cout << rows.column_name(i) << "\t";
    cout << endl;

    while(rows.next()) {
      for(short i = 0; i < cols; i++)
        cout << "(" << rows.get<string>(i, "null") << ")\t";
      cout << endl;
    }
  } catch(const exception& e) {
    cerr << e.what() << endl;
    return 1;
  }
}

/* vim:set et sw=2 cino=j2: */

ただしあまり C++ ぽさが無いので物足りない人もいるかもしれません。ライセンスは MIT です。

Posted at by | Edit