sqlite3例項程式碼及遇到的問題
#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 main(int argc, char * argv[])
{
sqlite3 *db;
char *dbPath="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的第第四個引數傳入的
第二個引數是結果行的列數
第三個引數是行中列資料的指標
第四個引數是行中列名稱的指標
Sqlite3的安裝
安裝使用資料庫系統Sqlite3
安裝資料庫系統Sqlite3:
apt-get install sqlite sqlite3
檢查資料庫安裝結果:
sqlite3 test.db
.database
.exit
提供下面的命令我們應該可以看到檔案test.db。
ls
安裝Sqlite3編譯需要的工具包:
apt-get install libsqlite3-dev
安裝視覺化工具
sudo apt-get install sqlitebrowser
找不到庫檔案的解決方法:
/tmp/ccH7jM5Y.o: In function `main':
/tmp/ccH7jM5Y.o(.text+0xd5): undefined reference to `sqlite3_open'
/tmp/ccH7jM5Y.o(.text+0xf2): undefined reference to `sqlite3_errmsg'
/tmp/ccH7jM5Y.o(.text+0x117): undefined reference to `sqlite3_close'
/tmp/ccH7jM5Y.o(.text+0x14c): undefined reference to `sqlite3_exec'
/tmp/ccH7jM5Y.o(.text+0x180): undefined reference to `sqlite3_close'
find . -name *****
gcc testsql3_1.c -L/usr/lib/ -lsqlite3
注意L和l,L制定絕對路徑,l自動查詢