1、sqlite3_open系列函数:
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open_v2( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb, /* OUT: SQLite db handle */ int flags, /* Flags */ const char *zVfs /* Name of VFS module to use */ );
【功能简述】:
打开一个数据库连接(若指定数据库名不存在,则创建一个新的数据库),并返回数据库连接句柄。
【参数说明】:
(1)sqlite3_open()和sqlite3_open_v2()以UTF-8编码格式解释filename参数,sqlite3_open16()以UTF-16(本地字节序,即大端还是小断视本地主机而定)解释filename参数。
(2)通过ppDb参数返回sqlite3对象指针(也称为数据库连接句柄),若SQLite为sqlite3对象分配内存失败,则ppDb返回为NULL。
(3)其它参数详情参见http://www.sqlite.org/c3ref/open.html。
【返回值】:
若打开(或创建)数据库成功,则返回SQLITE_OK,否则返回错误代号(error code),通过sqlite3_errmsg()或sqlite3_errmsg16()函数可以获取错误信息。
【附加说明】:
(1)使用sqlite3_open()和sqlite3_open_v2()打开或创建的数据库,默认以UTF-8格式编码,而使用sqlite3_open16()打开或创建的数据库以UTF-16格式的本地字节序形式编码。
(2)无论sqlite3_open()系列函数是否成功打开或创建数据库,都应该在不需要的时候调用sqlite3_close()来释放数据库资源。
2、sqlite3_prepare系列函数:
int sqlite3_prepare( 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 */ ); 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 */ ); int sqlite3_prepare16( sqlite3 *db, /* Database handle */ const void *zSql, /* SQL statement, UTF-16 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const void **pzTail /* OUT: Pointer to unused portion of zSql */ ); int sqlite3_prepare16_v2( sqlite3 *db, /* Database handle */ const void *zSql, /* SQL statement, UTF-16 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const void **pzTail /* OUT: Pointer to unused portion of zSql */ );
【功能简述】:
编译一条SQL语句,并返回
【参数说明】:
(1)参数db为sqlite3_open系列函数打开的数据库连接句柄。
(2)参数zSql用来指定需要编译的SQL语句。
(3)参数nByte用来指定一次编译SQL语句最大长度(若SQL语句长度超过nByte,则会被截断,之编译前nByte个字节),若nByte小于0,则编译长度为zSql语句的实际长度(strlen(zSql))。
(4)参数ppStmt返回编译后的prepared statement对象,供后续sqlite3_step函数使用,若编译失败则返回NULL。
(5)参数pzTail若不为NULL,则返回截断后为编译的部分SQL语句的指针。
【返回值】:
编译成功返回SQLITE_OK,否则返回相应错误代号。
【附加说明】:
使用sqlite3_prepare系列函数编译、执行后,若不再使用编译语句,需要调用sqlite3_finalize函数删除编译语句。
3、sqlite3_bind系列函数:
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);
【功能简述】:
绑定实际值到编译语句。
【参数说明】:
(1)第一个参数为prepared statement对象。
(2)第二个参数为SQL语句参数索引,如果是模板?NNN形式的SQL语句,则为对应的NNN值。其它模板形式请参考http://www.sqlite.org/c3ref/bind_blob.html。
(3)第三个参数为绑定值。
(4)第四个参数为绑定字节数,对sqlite3_bind_text()和sqlite3_bind_text16(),指定为负数则根据字符串长度决定。
(5)第五个参数为析构函数,对sqlite3_bind_text()和sqlite3_bind_text16()来说,若绑定字节内存不是在堆上分配的,可以使用指定为SQLITE_STATIC,即0,也就是说不许要free。
4、sqlite3_step函数:
int sqlite3_step(sqlite3_stmt*);
【功能简述】:
执行编译后的SQL语句。
【参数说明】:
编译后的prepared statement对象。
【返回值】:
(1)SQLITE_DONE:若成功执行create、update、delete等一次性可以完成的SQL语句。
(2)SQLITE_ROW:若执行查询语句,可能有多行结果,每次执行返回一行(查询完最后一行后再次调用返回SQLITE_DONE)。
(3)SQLITE_ERROR:运行出错。
(4)SQLITE_MISUSE:可能是由于prepared statement对象已经被删除,或者先前返回了SQLITE_ERROR或SQLITE_DONE。
(5)SQLITE_BUSY:数据库正忙(不能获得数据库锁),若执行的是COMMIT语句或这发生在explicit transaction之外,则可以重试,否则应该先回滚事物,再继续。(暂时不能完全理解这一点)
5、sqlite3_column系列函数:
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); int sqlite3_column_bytes(sqlite3_stmt*, int iCol); int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); double sqlite3_column_double(sqlite3_stmt*, int iCol); int sqlite3_column_int(sqlite3_stmt*, int iCol); sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); int sqlite3_column_type(sqlite3_stmt*, int iCol); sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
【功能简述】:
获取记录字段值。
【参数说明】:
(1)第一个参数为prepared statement对象。
(2)第二个参数为字段索引(最左边字段为0)。
6、sqlite3_reset函数
int sqlite3_reset(sqlite3_stmt *pStmt);
【功能简述】:
重置prepared statement对象到初始状态。
【参数说明】:略。
【返回值】:略。
7、sqlite3_finalize函数
int sqlite3_finalize(sqlite3_stmt *pStmt);
【功能简述】:
删除编译语句。
8、sqlite3_close函数
int sqlite3_close(sqlite3*); int sqlite3_close_v2(sqlite3*);
【功能简述】:
删除数据库连接句柄,释放所有资源。
9、完整示例
#include <stdio.h> #include <stdlib.h> #include "sqlite3.h" #define SUCCESS 1 #define FAILED -1 #define DATABASE_NAME "data.db" struct sqlite3 *g_pdb; int OpenDatabase(); void CloseDatabase(); int CreateTable(); void CreateNewUser(void* name, int* sex, int* age, void* email); int InsertData(unsigned int count); int QueryUserBetweenAge(int min, int max); int main() { if ( OpenDatabase() == FAILED ) return 1; if ( CreateTable() == FAILED ) { CloseDatabase(); return 1; } // insert 100 records if ( InsertData(100) == FAILED ) { CloseDatabase(); return 1; } // query users whose age in range 18 to 30 QueryUserBetweenAge(18, 30); CloseDatabase(); return 0; } // open database, if not existed then create a new one int OpenDatabase() { printf("Try to open database.\n"); int ret = sqlite3_open(DATABASE_NAME, &g_pdb); if ( ret != SQLITE_OK) { fprintf(stderr, "Error: sqlite3_open() failed, error infomation: %s\n", sqlite3_errmsg(g_pdb)); CloseDatabase(); return FAILED; } printf("Open database success.\n"); return SUCCESS; } void CloseDatabase() { printf("Close database.\n"); sqlite3_close(g_pdb); } int CreateTable() { printf("Try to create a table.\n"); const char* pSql = "create table if not exists USER_LIST (name char(16), sex integer, age integer, email char(32))"; // compile create table statement sqlite3_stmt *pStmt; int ret = sqlite3_prepare(g_pdb, pSql, -1, &pStmt, 0); if ( ret != SQLITE_OK) { fprintf(stderr, "Error: compile create table statement failed: %s\n", sqlite3_errmsg(g_pdb)); return FAILED; } printf("Compile create table statement success.\n"); // execute create table statement ret = sqlite3_step(pStmt); if (ret != SQLITE_DONE) { fprintf(stderr, "Error: execute create table statement faild\n"); sqlite3_finalize(pStmt); return FAILED; } // delete create table statement sqlite3_finalize(pStmt); printf("Create table success\n"); return SUCCESS; } int InsertData(unsigned int count) { printf("Try to inesrt %d data.\n", (int)count); const char* pSql = "insert into USER_LIST (name, sex, age, email) values (?1, ?2, ?3, ?4)"; // compile insert statement sqlite3_stmt *pStmt; int ret = sqlite3_prepare(g_pdb, pSql, -1, &pStmt, 0); if ( ret != SQLITE_OK) { fprintf(stderr, "Error: compile insert statement failed: %s\n", sqlite3_errmsg(g_pdb)); return FAILED; } printf("Compile insert statement success.\n"); int i, sex, age; char name[4] = {0}; char email[12] = {0}; for (i = 0; i < count; i++) { CreateNewUser((void*)name, &sex, &age, (void*)email); //printf("[Name]: %s, [Sex]: %s, [Age]: %d, [Email]: %s\n", name, sex % 2 ? "male" : "female", age, email); sqlite3_bind_text(pStmt, 1, name, -1, SQLITE_STATIC); sqlite3_bind_int(pStmt, 2, sex); sqlite3_bind_int(pStmt, 3, age); sqlite3_bind_text(pStmt, 4, email, -1, SQLITE_STATIC); ret = sqlite3_step(pStmt); if (ret != SQLITE_DONE) { fprintf(stderr, "Error: execute insert statement %d faild\n", i); continue; } sqlite3_reset(pStmt); } // delete insert statement sqlite3_finalize(pStmt); printf("Insert data over\n"); return SUCCESS; } void CreateNewUser(void*name, int* sex, int* age, void *email) { ((char*)name)[0] = rand() % 25 + 'A'; ((char*)name)[1] = rand() % 25 + 'A'; ((char*)name)[2] = rand() % 25 + 'A'; *sex = rand() % 2; // 1: male, 0: female *age = rand() % 100 + 1; // age range 1-100 ((char*)email)[0] = ((char*)name)[0] | 0x20; // convert case to lowercase ((char*)email)[1] = ((char*)name)[1] | 0x20; // convert case to lowercase ((char*)email)[2] = ((char*)name)[2] | 0x20; // convert case to lowercase ((char*)email)[3] = '@'; ((char*)email)[4] = rand() % 10 + '0'; ((char*)email)[5] = rand() % 10 + '0'; ((char*)email)[6] = rand() % 10 + '0'; ((char*)email)[7] = '.'; ((char*)email)[8] = 'c'; ((char*)email)[9] = 'o'; ((char*)email)[10] = 'm'; ((char*)email)[11] = '\0'; } int QueryUserBetweenAge(int min, int max) { printf("Try to query users whose age is between %d and %d.\n", min, max); char pSql[128] = {0};
sprintf(pSql, "select * from USER_LIST where age > %d and age < %d order by age, name asc", min - 1, max + 1); // compile select statement sqlite3_stmt *pStmt; int ret = sqlite3_prepare(g_pdb, pSql, -1, &pStmt, 0); if ( ret != SQLITE_OK) { fprintf(stderr, "Error: compile select statement failed: %s\n", sqlite3_errmsg(g_pdb)); return FAILED; } printf("Compile select statement success.\n"); // execute select statement int count = 0; printf(" ID\t Name\t Sex\t Age\t Email\n"); printf("------------------------------------------------------\n"); while (sqlite3_step(pStmt) == SQLITE_ROW) // return SQLITE_DONE after last row { // display query result printf("%3d\t ", ++count); printf("%s\t ", sqlite3_column_text(pStmt, 0)); printf("%s\t ", sqlite3_column_int(pStmt, 1) > 0 ? "male" : "female"); printf("%d\t ", sqlite3_column_int(pStmt, 2)); printf("%s\n", sqlite3_column_text(pStmt, 3)); } printf("------------------------------------------------------\n"); printf("Total: %d\n", count); // delete select statement sqlite3_finalize(pStmt); printf("Query data success\n"); return SUCCESS; }