SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C++/CLIによるCライブラリの.NET化

C#でSQLiteを使うには


アフター・ケアとDLLのつくりかた 2

 ここで一旦コマンドプロンプトを立ち上げ、[プロジェクト]-[ディレクトリ]で「legacy16.bat」を実行して「sqlite3.h/c/def」にパッチを当てます。

 次に、コマンドプロンプトを閉じ、IDE上で「sqlite3.h」「sqlite3.c」「sqlite3.def」の3本を、ソリューション エクスプローラでプロジェクトに「既存の項目の追加」します。

 そして、[プロジェクト]-[プロパティ]で「release」「debug」の双方に以下の設定をします。設定箇所は図も参考にしてみてください。

構成の種類 ダイナミックライブラリ(dll)
プリプロセッサ定義 _CRT_SECURE_NO_DEPRECATE、THREADSAFE
モジュール定義ファイル sqlite3.def
構成の種類
構成の種類
プリプロセッサ定義
プリプロセッサ定義
モジュール定義ファイル
モジュール定義ファイル

 これで完了です。buildすれば「sqlite3.dll/lib」が生成されます。[コンソール]-[アプリケーション]-[プロジェクト]に「sample16」を追加し、以下のテストコードが正しく動作することを確認してください。

sample16.cpp
#include <iostream>
#include <sqlite3.h>
#include <locale>

int callback(void* option, int columnCount, 
             wchar_t** columnValues, wchar_t** columnNames) {
  for ( int i = 0; i < columnCount; ++i ) {
    *static_cast<std::wostream*>(option) << columnNames[i] << L" 
     = [" << columnValues[i] << L"] ";
  }
  std::wcout << std::endl;
  return 0;
}

int main() {
  std::wcout.imbue(std::locale("japanese"));
  sqlite3* db;
  if ( sqlite3_open16(L":memory:", &db) ) {
    std::cerr << "Error " << __FILE__ << ' ' << __LINE__
              << ": Can't open database " << sqlite3_errmsg(db)
              << std::endl;
    sqlite3_close(db);
    return 1;
  }

  const wchar_t* statements[] = {
    L"CREATE TABLE item (id INTEGER PRIMARY KEY, 
                         name TEXT NOT NULL, price REAL NOT NULL)",
    L"INSERT INTO item VALUES ( 1 , 'ばなな', 123)",
    L"INSERT INTO item VALUES ( 2 , 'りんご', 234)",
    L"INSERT INTO item VALUES ( 3 , 'みかん', 345)",
    L"INSERT INTO item VALUES ( 4 , 'なし',   456)",
    L"INSERT INTO item VALUES ( 5 , 'もも',   567)",

    L"CREATE TABLE sales (id INTEGER PRIMARY KEY, quantity NOT NULL )",
    L"INSERT INTO sales VALUES ( 1, 6 )",
    L"INSERT INTO sales VALUES ( 3, 4 )",
    L"INSERT INTO sales VALUES ( 5, 2 )",

    L"SELECT name, price, quantity, price*quantity 
        FROM item, sales 
       WHERE item.id = sales.id ORDER BY price*quantity",
    0
  };
  for ( int i = 0; statements[i]; ++i ) {
    wchar_t* errmsg;
    std::wcout << statements[i] << std::endl;
    if ( sqlite3_exec16(db, statements[i], callback, 
                        &std::wcout, &errmsg) != SQLITE_OK ) {
      std::cerr << "Error " << __FILE__ << ' ' << __LINE__
                << ": " << errmsg << std::endl;
      sqlite3_free(errmsg);
      sqlite3_close(db);
      return 1;
    }
  }

  sqlite3_stmt* statement;

  sqlite3_prepare16(db, L"INSERT INTO sales VALUES ( ?, ?)", 
                    -1, &statement, NULL);

  sqlite3_reset(statement);
  sqlite3_bind_int(statement, 1, 2);
  sqlite3_bind_int(statement, 2, 5);
  sqlite3_step(statement);

  sqlite3_reset(statement);
  sqlite3_bind_int(statement, 1, 4);
  sqlite3_bind_int(statement, 2, 3);
  sqlite3_step(statement);

    sqlite3_finalize(statement);
  sqlite3_prepare16(db, L"SELECT name, quantity 
                            FROM sales, item 
                           WHERE sales.id = item.id", 
                    -1, &statement, NULL);
  while ( sqlite3_step(statement) == SQLITE_ROW ) {
    std::wcout 
      << static_cast<const wchar_t*>(sqlite3_column_text16(statement, 
                                                           0)) 
      << L'が'
      << sqlite3_column_int(statement,1) 
      << L"個売れました\n";
  }
  sqlite3_close(db);

  return 0;
}
実行結果
CREATE TABLE item (id INTEGER PRIMARY KEY, name TEXT NOT NULL, price REAL NOT NULL)
INSERT INTO item VALUES ( 1 , 'ばなな', 123)
INSERT INTO item VALUES ( 2 , 'りんご', 234)
INSERT INTO item VALUES ( 3 , 'みかん', 345)
INSERT INTO item VALUES ( 4 , 'なし',   456)
INSERT INTO item VALUES ( 5 , 'もも',   567)
CREATE TABLE sales (id INTEGER PRIMARY KEY, quantity NOT NULL )
INSERT INTO sales VALUES ( 1, 6 )
INSERT INTO sales VALUES ( 3, 4 )
INSERT INTO sales VALUES ( 5, 2 )
SELECT name, price, quantity, price*quantity FROM item, sales WHERE item.id = sales.id ORDER BY price*quantity
name = [ばなな] price = [123.0] quantity = [6] price*quantity = [738.0]
name = [もも] price = [567.0] quantity = [2] price*quantity = [1134.0]
name = [みかん] price = [345.0] quantity = [4] price*quantity = [1380.0]
ばななが6個売れました
りんごが5個売れました
みかんが4個売れました
なしが3個売れました
ももが2個売れました

次のページ
SQLitePetite: 最小限の機能を提供

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1382 2008/08/19 19:22

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー