SQLite - C/C++
インストール
C/C++ プログラムで SQLite を使用する前に、マシン上に SQLite ライブラリが既に存在することを確認する必要があります。インストール プロセスについては、SQLite インストールの章を参照してください。
C/C++ インターフェイス API
以下は、C/C++ プログラムで SQLite データベースを使用するニーズを満たすことができる重要な C&C++ / SQLite インターフェイス プログラムです。さらに詳細が必要な場合は、SQLite の公式ドキュメントを参照してください。
シリアル番号 | APIと説明 |
---|---|
1 | sqlite3_open(const char *filename, sqlite3 **ppDb) このルーチンは、SQLiteデータベースファイルへの接続を開き、SQLiteデータベースファイルへの接続を返します他の SQLite プログラムのデータベース接続オブジェクト。 filenameパラメータがNULLまたは':memory:'の場合、sqlite3_open()はRAM内にメモリ内データベースを作成します。これはセッションの有効期間中のみ持続します。 ファイル名 filename が NULL でない場合、sqlite3_open() はこのパラメーター値を使用してデータベース ファイルを開こうとします。その名前のファイルが存在しない場合、sqlite3_open() はその名前で新しいデータベース ファイルを作成し、それを開きます。 |
2 | sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) このルーチンは、SQL コマンドを実行するためのショートカットを提供します SQL コマンドは sql パラメーターによって実行されます。が提供されており、複数の SQL コマンドで構成できます。 ここで、最初のパラメータ sqlite3 は開いているデータベース オブジェクト、sqlite_callback はコールバック、data が最初のパラメータとして、プログラムによって生成されたエラーを取得するために errmsg が返されます。 sqlite3_exec() プログラムは、文字列の終わりまたはエラーが発生するまで、sql パラメーターで指定された各コマンドを解析して実行します。 |
3 | sqlite3_close(sqlite3*) このルーチンは、以前の sqlite3_open() の呼び出しによって開かれたデータベース接続を閉じます。接続に関連するすべてのステートメントは、接続が閉じられる前に完了する必要があります。 まだ完了していないクエリがある場合、sqlite3_close() は閉じることを禁止する SQLITE_BUSY エラー メッセージを返します。 |
データベースに接続する
以下の C コード スニペットは、既存のデータベースに接続する方法を示しています。データベースが存在しない場合は、データベースが作成され、データベース オブジェクトが返されます。
#include <stdio.h> #include <sqlite3.h> int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfully\n"); } sqlite3_close(db); }
さて、上記のプログラムをコンパイルして実行して、現在のディレクトリにデータベース test.db を作成しましょう。必要に応じてパスを変更できます。
$gcc test.c -l sqlite3 $./a.out Opened database successfully
C++ ソース コードを使用したい場合は、次のようにコードをコンパイルできます:
$g++ test.c -l sqlite3
ここで、プログラムを sqlite3 ライブラリにリンクして、C プログラムに必要な関数を提供します。これにより、ディレクトリにデータベース ファイル test.db が作成され、次の結果が得られます:
-rwxr-xr-x. 1 root root 7383 May 8 02:06 a.out -rw-r--r--. 1 root root 323 May 8 02:05 test.c -rw-r--r--. 1 root root 0 May 8 02:06 test.db
テーブルの作成
次の C コード スニペットは、以前に作成したデータベースにテーブルを作成するために使用されます:
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stdout, "Opened database successfully\n"); } /* Create SQL statement */ sql = "CREATE TABLE COMPANY(" \ "ID INT PRIMARY KEY NOT NULL," \ "NAME TEXT NOT NULL," \ "AGE INT NOT NULL," \ "ADDRESS CHAR(50)," \ "SALARY REAL );"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Table created successfully\n"); } sqlite3_close(db); return 0; }
上記の場合プログラムがコンパイルされて実行され、test.db ファイルに COMPANY テーブルが作成され、最終的なファイル リストは次のようになります:
-rwxr-xr-x. 1 root root 9567 May 8 02:31 a.out -rw-r--r--. 1 root root 1207 May 8 02:31 test.c -rw-r--r--. 1 root root 3072 May 8 02:31 test.db
INSERT 操作
次の C コード スニペットは、上で作成した COMPANY テーブルにレコードを作成する方法を示しています。
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfully\n"); } /* Create SQL statement */ sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Records created successfully\n"); } sqlite3_close(db); return 0; }
上記のプログラムがコンパイルされて実行されると、COMPANY テーブルに指定されたレコードが作成され、次の 2 行が表示されます:
Opened database successfully Records created successfully
SELECT 操作
レコードの取得例を説明する前に、まず、この例で使用されるコールバック関数の詳細を理解します。このコールバックは、SELECT ステートメントから結果を取得する方法を提供します。これは次のように宣言されます:
typedef int (*sqlite3_callback)( void*, /* Data provided in the 4th argument of sqlite3_exec() */ int, /* The number of columns in row */ char**, /* An array of strings representing fields in the row */ char** /* An array of strings representing column names */ );
上記のコールバックが sqlite_exec() プロシージャの 3 番目のパラメータとして渡された場合、SQLite は SQL パラメータ内で実行されるすべての SELECT ステートメントで処理されるすべてのレコードに対してこのコールバック関数を呼び出します。
以下の C コード スニペットは、前に作成した COMPANY テーブルからレコードを取得して表示する方法を示しています:
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfully\n"); } /* Create SQL statement */ sql = "SELECT * from COMPANY"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
上記のプログラムをコンパイルして実行すると、次の結果が生成されます:
Opened database successfully Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Callback function called: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operation done successfully
UPDATE 操作
以下の C コード スニペットUPDATE ステートメントを使用してレコードを更新し、COMPANY テーブルから更新されたレコードを取得して表示する方法を示します。
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfully\n"); } /* Create merged SQL statement */ sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \ "SELECT * from COMPANY"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
上記のプログラムをコンパイルして実行すると、次の結果が生成されます:
Opened database successfully Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 25000.0 Callback function called: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operation done successfully
DELETE 操作
C コード以下のセグメントは、DELETE ステートメントを使用してレコードを削除し、COMPANY テーブルから残りのレコードを取得して表示する方法を示しています:
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfully\n"); } /* Create merged SQL statement */ sql = "DELETE from COMPANY where ID=2; " \ "SELECT * from COMPANY"; /* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
上記のプログラムをコンパイルして実行すると、次の結果が生成されます:
Opened database successfully Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operation done successfully