sqlite 編程接口sql
數據庫的打開和關閉 數據庫
int sqlite3_open(constchar*, sqlite3**);
int sqlite3_close(sqlite3*);編程
sqlite3爲一個結構,它代指一個數據庫鏈接,以後調用的大部分API函數都須要使用它做爲其中一個參數。sqlite3_open的第一個參數爲文件名字符串。兩個函數都是成功返回SQLITE_OK,失敗返回錯誤碼。可使用sqlite3_errmsg函數得到錯誤描述:
函數
constchar*sqlite3_errmsg(sqlite3*);
spa
數據庫操做-執行SQL語句指針
int sqlite3_prepare(sqlite3*,constchar*,int, sqlite3_stmt**,
orm
constchar**);
int sqlite3_finalize(sqlite3_stmt*);
int sqlite3_reset(sqlite3_stmt*);sqlite
sqlite3_stmt結構代指一條SQL語句,上述三個函數的功能就是建立、銷燬和重置sqlite3_stmt結構。sqlite3_prepare函數的第二個參數爲SQL語句字符串,第三個參數爲字符串長度。若是傳入的SQL語句字符串超出了一條SQL語句,則第五個參數返回SQL語句字符串中指向下一條SQL語句的char指針。SQL語句字符串能夠帶?號,它是SQL語句中的不肯定部分,須要對它另外賦值。
接口
int sqlite3_bind_text(sqlite3_stmt*,int,constchar*,int n, void(*)(void*));
內存
sqlite3_bind_*系列函數有好多,這裏只對sqlite3_bind_text進行一下說明,sqlite3_bind_text的第二個參數爲序號(從1開始),第三個參數爲字符串值,第四個參數爲字符串長度。sqlite3_bind_text的第五個參數爲一個函數指針,SQLITE3執行完操做後回調此函數,一般用於釋放字符串佔用的內存。(這個函數指針參數具體怎麼使用,我如今還不清楚)。此參數有兩個常數,SQLITE_STATIC告訴sqlite3_bind_text函數字符串爲常量,能夠放心使用;而SQLITE_TRANSIENT會使得sqlite3_bind_text函數對字符串作一份拷貝。通常使用這兩個常量參數來調用sqlite3_bind_text。
statement準備好了之後,就是操做的執行了。
int sqlite3_step(sqlite3_stmt*);
它的返回值相對有些特殊。返回SQLITE_BUSY表示暫時沒法執行操做,SQLITE_DONE表示操做執行完畢,SQLITE_ROW表示執行完畢而且有返回(執行select語句時)。當返回值爲SQLITE_ROW時,咱們須要對查詢結果進行處理,SQLITE3提供sqlite3_column_*系列函數。
constunsignedchar*sqlite3_column_text(sqlite3_stmt*,int iCol);
其中參數iCol爲列的序號,從0開始。若是返回值有多行,則能夠再次調用sqlite3_step函數,而後由sqlite3_column_*函數取得返回值。
使用上述這些函數基本上能夠完成對SQLITE3數據庫的操做了(不過我這裏只針對text數據類型作了說明)。固然,sqlite3還有不少其它的接口函數,之後再慢慢摸索吧,如今只是剛開始。
下面是一段示例代碼:
#include<stdio.h>
#include"sqlite3.h"
int main(){
sqlite3 *db;
char*zErrMsg =NULL;
int rv;
char szSql[128]={ 0 };
sqlite3_stmt *stmt;
rv = sqlite3_open("test.db",&db);
if( rv ){
fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
fprintf(stderr,"sqlite3_open OK\n");
//這裏查詢時,假定數據庫中存在表test,而且有一列爲COL1(text類型)
strcpy(szSql,"SELECT COL1 FROM test where COL1=?");
rv = sqlite3_prepare(db, szSql, 128,&stmt,NULL);
if( rv != SQLITE_OK ){
fprintf(stderr,"sqlite3_prepare(%d): %s\n", rv, sqlite3_errmsg(db));
return-1;
}
rv = sqlite3_bind_text(stmt, 1, "VALUE1",strlen("VALUE1"), SQLITE_STATIC);
if( rv != SQLITE_OK ){
fprintf(stderr,"sqlite3_bind_text(%d): %s\n", rv, sqlite3_errmsg(db));
return-1;
}
rv = sqlite3_step(stmt);
if((rv != SQLITE_OK)&&(rv != SQLITE_DONE)&&(rv != SQLITE_ROW)){
fprintf(stderr,"sqlite3_step(%d): %s\n", rv, sqlite3_errmsg(db));
return-1;
}
while( rv == SQLITE_ROW ){
fprintf(stderr,"result: %s\n", sqlite3_column_text(stmt,0));
rv = sqlite3_step(stmt);
}
rv = sqlite3_finalize(stmt);
if( rv != SQLITE_OK ){
fprintf(stderr,"sqlite3_finalize(%d): %s\n", rv, sqlite3_errmsg(db));
return-1;
}
sqlite3_close(db); return 0;}