Hatena::ブログ(Diary)

CREST’S WEBLOG (跡地)


プロフィール
Bitbucket
Pixiv
Twitter
Qiita

わんくま同盟

2012-05-07

C/C++プログラムに組み込む(1) -修正

準備

元々組み込み向けに設計されているため,C/C++プログラムSQLiteを組み込むのは非常に簡単です.

まず,SQliteのサイトから,

ダウンロードしてきます.sqlite3_dllには,インポートライブラリが含まれていないので,DEFファイルとDLLからインポートライブラリを作成します.

lib /VERBOSE /MACHINE:I386 /DEF:sqlite3.def /OUT:sqlite3.lib /NAME:sqlite3.dll

あとは,ヘッダとlibおよびdllをパスの通っている場所に置くだけです.

sqlite データベースを開く・閉じる

C/C++から,sqliteデータベースを開くには,sqlite3_open関数を使います.

int sqlite3_open(const char* name, sqlite3** db);

この関数は,第1引数で指定した名前のデータベースを開き,第2引数のsqlite3オブジェクトデータベースのハンドルを返します.

データベースの名まえに":memory:"を指定した場合には,メモリ上にデータベースが作成されます.データベースのオープンに成功した場合には,SQLITE_OKが返されます.失敗した時は,SQLITEのエラーコードが返されます.

エラーコードのチェックには

int sqlite3_errcode(sqlite3 *db);

を使います.

データベースを閉じるには,sqlite3_closeを使います.

sqlite3_close(sqlite3*);

sqliteクエリを発行する

データベースを操作するには,データベースSQLクエリを発行して処理を行います.

最も単純な操作関数は,sqlite3_execなのですが,

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

最近は,sqlite3_prepare_v2とsqlite3_stepの組み合わせによるクエリ実行が好まれているようです.

sqlite3_prepareは,SQLバイトコードへ変換します

int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);

バイトコードへ変換されたSQLクエリは,第4引数(sqlite3_stmtのダブルポインタ)に返されます.

sqlite3_stepでは,変換されたバイトコードを使って,クエリを処理します.

int sqlite3_step(sqlite3_stmt*);

なお,処理が済んだsqlite3_stmtのオブジェクトはsqlite3_finalizeで解放します.

int sqlite3_finalize(sqlite3_stmt*);

サンプル

では,上記を踏まえて簡単なデータベース操作のプログラムを書いてみます.

#include <sqlite3.h>
#include <iostream>
#pragma comment(lib, "sqlite3.lib")

using namespace std;
int main() {
	sqlite3* db;
	int result = sqlite3_open(":memory:", &db);
	if (result != SQLITE_OK) {
		cerr << ::sqlite3_errmsg(db) << endl;
		return -1;
	}

	//データベースを作成
	const char* command = "create table item(id INTEGER, name TEXT);";
	sqlite3_stmt *statement;
	sqlite3_prepare_v2(db, command, -1, &statement, &command);
	sqlite3_step(statement);

	// データベースに値を挿入
	command = "insert into item values (100, 'IDOLM@STER 2');";
	sqlite3_prepare_v2(db, command, -1, &statement, &command);
	sqlite3_step(statement);

	//データベースから値を取ってくる
	command = "select * from item;";
	sqlite3_prepare_v2(db, command, -1, &statement, &command);
	while (sqlite3_step(statement) == SQLITE_ROW) {
		int id = sqlite3_column_int(statement,0);
		const unsigned char * name = sqlite3_column_text(statement,1);
		cout << id << ", " << name <<endl;
	}

	//データベースを閉じる
	getchar();//ストッパー
	sqlite3_finalize(statement);
	sqlite3_close(db);

	return 0;

}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証