ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

SQLite

ちょいとSQLやりたくなったので、これ見ながらC++でやってみる☆


SQLiteで組み込みDB体験
SQLiteで組み込みDB体験(2007年版)
SQLiteで組み込みDB体験(2008年版)@よしなごと


ソースファイルのダウンロード

SQLiteで組み込みDB体験(2007年版)では、「sqlite-source-X_X_X.zip」をダウンロードすると「sqlite3.c」と「sqlite3.h」があるよ。と書いてあるけど、こっちをDLしてもたくさんファイルがある。


ちょっと調べてみるとsqlite-amalgamation-X_X_X.zip」をダウンロードしたらいいらしいことがわかる。
こっちをDLしたら確かに「sqlite3.c」と「sqlite3.h」があった。
ついでに「sqlite3ext.h」ってのもあった。


ソースのライブラリ化

.c 一本なのでこのままプロジェクトに突っ込んでもいいんだろうけど、プリプロセッサの設定がいるらしいのでライブラリ化。
Visual Studio 2008 で作ってみました。


プロジェクトを作ったら、プロジェクトのプロパティで「Debug」、「Release」両方に "_CRT_SECURE_NO_DEPRECATE;THREADSAFE" を定義する。


"_CRT_SECURE_NO_DEPRECATE"は VS2005 以降の C ランタイムに対する警告の抑制のようで、"THREADSAFE"は SQLite が内部的に使用する定数のよう。


プログラムの実行

step-2:サンプルを実行してみよう@SQLiteで組み込みDB体験(2007年版)にあるサンプルを実行して上手く出来ることを確認。
#リンクが長い(笑)



この状態でも一応日本語が通るので、自分で使う分にはこれでも問題ないかな??



と、思ったら C++/CLIによるCライブラリの.NET化UTF-16版があったので、これをありがたく使うことにして日本語サポート版にしてしまいませう。


と、思ったら、どうもコードが変わってるらしくこのままでは使えない。
関数名だけでなく処理も少し変わってるようなので変更はいずれ機会があれば。。。


クラス化

Database と Statement をクラス化。
とりあえず main 関数を載せる。
スッキリ(・∀・)

void main()
{
    try {
        // databaseをオープン。
        sqlite::Database    db( ":memory:" );

        // TABLE を生成する。
        db.exec( "CREATE TABLE IF NOT EXISTS wankuma ( id INTEGER PRIMARY KEY,  name TEXT,  place TEXT)" );

        // レコードを追加する。
        {
            sqlite::Statement statement( db, "INSERT INTO wankuma (name, place) VALUES ( ?, ? )" );
            const char* data[] = {
                "episteme", "yokohama",
                "mnow",     "tokyo",
                "naka",     "oosaka",
                "janne",    "nagoya",
                "naoko",    "tokyo",
                0,          0
            };

            // 値のバインドと実行。
            for ( const char** p = data; *p != 0;) {
                statement.reset();
                statement.bindText( 1, *p ); ++p;
                statement.bindText( 2, *p ); ++p;
                statement.step();
            }
        }

        // QUERY を行う。
        db.exec( "SELECT * FROM wankuma", callback, &std::cout );
    }
    catch ( std::exception& ex ) {
        std::cout << ex.what() << std::endl;
    }

    return 0;
}