LoginSignup
59

More than 5 years have passed since last update.

SQLite C言語向けAPI チートシート

Posted at

SQLite C言語向けAPI チートシートです。
自分以外の需要があるかどうか不明ですが、頻繁に使うもの、便利そうなものについて逐次メモしていきます。

環境

SQLite:3.8.6
ビルド環境:gcc 4.8.1

必要なもの

本家ダウンロードから、ソースコードもしくはWindows用DLLを落としきて利用できるようにしておいてください。ヘッダファイルはソースコードが入っているzipの中にあります。

参考サイト

本家イントロダクション
本家リファレンス
c/c++でsqliteを使う方法 - ぴょぴょぴょ?-Linuxとかプログラミングの覚え書き-
「SQLite3」に関するページ - idocsq.net

データベースの基本的な使用方法

とりあえず、これさえおさえておけば使うことはできる!とうわけで、
DBファイルを開いて、データの挿入と抽出をする方法について記します。

DBファイルの開閉

ファイルの開閉は、DBファイル名とDBのアクセス用オブジェクトがあれば行えます。

sqlite3_sample.c
// DBファイル名
char *fileName = "mySQLiteDB";

// DBオブジェクト
sqlite3 *pDB = NULL;
sqlite3_sample.c
// DBのオープン
err = sqlite3_open(fileName, &pDB);
if(err != SQLITE_OK){
    printf("OPEN ERR! %d\n", err);

    /* TODO:エラー処理 */
}
printf("OPEN SUCCESS!\n");
sqlite3_sample.c
// DBのクローズ
err = sqlite3_close(pDB);
if(err != SQLITE_OK){
    printf("CLOSE ERR! %d\n", err);

    /* TODO:エラー処理 */
}
printf("CLOSE SUCCESS!\n");

オプションを使用してDBの開閉を行いたい場合は、sqlite3_open_v2を使って行えます。

テーブルの作成と削除

「テーブルの作成にはこれを使ってください!」といえるような関数が用意されていればよいのですが、そんなことはないのでSQL文をベタ打ちで実行していきます。
SQL文を実行する方法は主に2通りありますが、
テーブルの作成や削除のような使いまわさないSQL文は、sqlite3_exec()で実行します。

sqlite3_sample.c
// テーブルの作成
char *errMsg = NULL;
int err = 0;

err = sqlite3_exec(pDB,
    "CREATE TABLE IF NOT EXISTS myTable "
    "(id INTEGER PRIMARY KEY AUTOINCREMENT, "
    "name CHAR(32) NOT NULL)",
    NULL, NULL, &errMsg);

if(err != SQLITE_OK){
    printf("%s\n", errMsg);
    sqlite3_free(errMsg);
    errMsg = NULL;
    /* TODO: エラー処理 */
}
printf("CREATE TABLE!\n");
sqlite3_sample.c
// テーブルの削除
char *errMsg = NULL;
int err = 0;

err = sqlite3_exec(pDB,
    "DROP TABLE IF EXISTS myTable",
    NULL, NULL, &errMsg);

if(err != SQLITE_OK){
    printf("%s\n", errMsg);
    sqlite3_free(errMsg);
    errMsg = NULL;
    /* TODO: エラー処理 */
}
printf("DROP TABLE!\n");

sqlite3_exec()の第3引数はコールバック関数、第4引数はコールバック関数の第1引数となりますが、基本的にNULLで問題ありません。

データの追加と抽出

データの追加と抽出のような使いまわすクエリ実行には、sqlite3_prepare()sqlite3_step()を使います。これらを実行するにはステートメントオブジェクトが必要になります。
sqlite3_prepareでステートメントオブジェクトを用意して、sqlite3_step()でそれを実行するという順番になります。オブジェクトを使い終わったら、sqlite3_finalize()でステートメントオブジェクトを解放します。

sqlite3_sample.c
// ステートメントオブジェクト
sqlite3_stmt *pStmt = NULL;
sqlite3_sample.c
// データの追加
// ステートメントの用意
err = sqlite3_prepare_v2(pDB,
    "INSERT INTO myTable (name) VALUES (?)",
    128, &pStmt, NULL);

if(err != SQLITE_OK){
    /* TODO:エラー処理 */
}else{
    int i = 0;
    for(i = 0;i < 5;i++){
        const char name[32];
        snprintf(name, 32, "test%02d", i);

        // ?の部分に値を代入
        sqlite3_bind_text(pStmt, 1, name, strlen(name), SQLITE_STATIC);
        while(SQLITE_DONE != sqlite3_step(pStmt)){}
    }
}

// ステートメントの解放
sqlite3_finalize(pStmt);
printf("ADD DATA!\n");
sqlite3_sample.c
// データの抽出
// ステートメントの用意
err = sqlite3_prepare_v2(pDB,
    "SELECT * FROM myTable", 64,
    &pStmt, NULL);

if(err != SQLITE_OK){
    /* TODO:エラー処理 */
}else{
    // データの抽出
    while(SQLITE_ROW == (err = sqlite3_step(pStmt)) ){
        int id = sqlite3_column_int(pStmt, 0);
        const char *name = sqlite3_column_text(pStmt, 1);
        printf("id: %d, name: %s\n", id, name);
    }

    if(err != SQLITE_DONE){
        /* TODO: エラー処理 */
    }
}

// ステートメントの解放
sqlite3_finalize(pStmt);

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59