Cocos2dx Sqlite3値をバインドする

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

クエリを書く際に

1
SELECT *  FROM `table` WHERE `id` =  256 AND `name` = "テキスト";

こんな感じになる場合プレースホルダに値をバインドしたくなるのが世の常です。

実際に書いてみる

1
2
3
4
5
6
7
8
9
10
11
12
sqlite3 *db;
sqlite3_stmt *stmt;
const char *pzTest;

//クエリ
const char *sql = "SELECT *  FROM `table` WHERE `id` =  ? AND `name` = ?";
sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, &pzTest);

//バインド
const char *name = "テキスト";
sqlite3_bind_int(stmt, 1, 256);
sqlite3_bind_text(stmt, 2, name, strlen(name), SQLITE_TRANSIENT);

こんな感じプレースホルダは番号を指定する事も出来る

1
2
3
4
5
6
7
8
9
10
11
12
sqlite3 *db;
sqlite3_stmt *stmt;
const char *pzTest;

//クエリ
const char *sql = "SELECT *  FROM `table` WHERE `id` =  ?123 AND `name` = ?456";
sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, &pzTest);

//バインド
const char *name = "テキスト";
sqlite3_bind_int(stmt, 123, 256);
sqlite3_bind_text(stmt, 456, name, strlen(name), SQLITE_TRANSIENT);

プレースホルダに文字列を使いたい場合は特定の記号から始める事で可能になる
使える記号は「: @ $」が使える。
只しその場合は sqlite3_bind_parameter_indexでindexへ変換する必要がある

1
2
3
4
5
6
7
8
9
10
11
12
sqlite3 *db;
sqlite3_stmt *stmt;
const char *pzTest;

//クエリ
const char *sql = "SELECT *  FROM `table` WHERE `id` =  :id AND `name` = :name";
sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, &pzTest);

//バインド
const char *name = "テキスト";
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index( stmt, ":id"), 256);
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index( stmt, ":name" ), name, strlen(name), SQLITE_TRANSIENT);

使い方はこんな感じ。

int sqlite3_bind_blob(sqlite3_stmt, int, const void, int n, void()(void)); int sqlite3_bind_double(sqlite3_stmt, int, double); int sqlite3_bind_int(sqlite3_stmt, int, int); int sqlite3_bind_int64(sqlite3_stmt, int, sqlite3_int64); int sqlite3_bind_null(sqlite3_stmt, int); int sqlite3_bind_text(sqlite3_stmt, int, const char, int n, void()(void)); int sqlite3_bind_text16(sqlite3_stmt, int, const void, int, void()(void)); int sqlite3_bind_value(sqlite3_stmt, int, const sqlite3_value); int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);

以下参考にさせていただきましたm()m

(http://secondflush2.blog.fc2.com/blog-entry-874.html)
(http://idocsq.net/page/521)