アフター・ケアと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」を追加し、以下のテストコードが正しく動作することを確認してください。
#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個売れました



