標籤:
原文地址:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html
#include "stdafx.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;}#define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK) \ {printf("%s error!/n",szInfo); printf("%s/n",szErrMsg); sqlite3_free(szErrMsg); sqlite3_close(db); return 0;}int _tmain(int argc, _TCHAR* argv[]){ sqlite3 *db; char *dbPath="f:/test.db"; char *szErrMsg = 0; int rc= sqlite3_open(dbPath, &db); CHECK_RC(rc,"open database",db); char *szSql="create table UserInfo(ID int primary key , UserName char, PassWord char);"; rc=sqlite3_exec(db,szSql,0,0,&szErrMsg); CHECK_RC(rc,"create table",szErrMsg,db); rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(1,‘kfqcome‘,‘123456‘)",0,0,&szErrMsg); CHECK_RC(rc,"insert info",szErrMsg,db); rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(2,‘miss wang‘,‘654321‘)",0,0,&szErrMsg); CHECK_RC(rc,"insert info",szErrMsg,db); szSql="select * from UserInfo"; rc = sqlite3_exec(db,szSql, callback, 0, &szErrMsg); CHECK_RC(rc,"query values",szErrMsg,db); sqlite3_close(db); getchar(); return 0;}
輸出的結果:
ID = 1
UserName = kfqcome
PassWord = 123456
ID = 2
UserName = miss wang
PassWord = 654321
這裡執行sql語句用的是sqlite3_exec,它是前面幾個函數的封裝
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
sqlite3_exec是sqlite3_prepare_v2,sqlite3_step()和sqlite3_finalize()的封裝,能讓程式多次執行sql語句而不要寫許多重複的代碼。
Sqlite3_exec介面執行0或多個UTF-8編碼的,分號分割的sql語句,傳到第二個參數中。如果sqlite3_exec的第三個參數回呼函數指標不為空白,那麼它會為每個來自執行的SQL語句的結果行調用(也就是說回呼函數會調用多次,上面例子中會返回2個結果行,因而會被執行2次),第4個參數是傳給回呼函數的第一個參數,如果回呼函數指標為空白,那麼回調不會發生同時結果行被忽略。
如果在執行sql語句中有錯誤發生,那麼當前的語句的執行被停止,後續的語句也被跳過。第五個參數不為空白的時候,它被分配記憶體並寫入了錯誤資訊,所以在sqlite3_exec後面需要調用sqlite3_free去釋放這個對象以防止記憶體泄露
回呼函數:
int (*callback)(void*,int,char**,char**), /* Callback function */
第一個參數通過sqlite3_exec的第第四個參數傳入的
第二個參數是結果行的列數
第三個參數是行中列資料的指標
第四個參數是行中列名稱的指標
輕量級資料sqlite的C++調用樣本