 c/c++使用(yong)數據庫sqlite3
							時間:2017-11-16      來源(yuan):未知
							c/c++使用(yong)數據庫sqlite3
							時間:2017-11-16      來源(yuan):未知 
							1 打開數據庫連接sqlite3_open用法
原型:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
  sqlite3 **ppDb /* OUT: SQLite db handle */
);
用這個函數開(kai)始(shi)數據(ju)庫操(cao)(cao)作。需要(yao)傳入(ru)兩個參(can)數,一是數據(ju)庫文(wen)件名,比如(ru):E:/test.db。文(wen)件名不(bu)需要(yao)一定(ding)存在(zai),如(ru)果(guo)(guo)此文(wen)件不(bu)存在(zai),sqlite會自動建(jian)立它。如(ru)果(guo)(guo)它存在(zai),就嘗試把它當數據(ju)庫文(wen)件來(lai)打開(kai)。二是sqlite3**,即(ji)前面提到(dao)的關鍵(jian)數據(ju)結構(gou)。這個結構(gou)底層細節如(ru)何,你不(bu)要(yao)管它。 函數返回值(zhi)(zhi)表示操(cao)(cao)作是否正確,如(ru)果(guo)(guo)是SQLITE_OK則(ze)表示操(cao)(cao)作正常(chang)。相關的返回值(zhi)(zhi)sqlite定(ding)義了一些(xie)宏。具(ju)體(ti)這些(xie)宏的含義可以(yi)參(can)考sqlite3.h 文(wen)件。里(li)面有詳(xiang)細定(ding)義(順便說一下(xia),sqlite3 的代碼注釋(shi)率自稱(cheng)是非常(chang)高的,實際上也的確很高。只(zhi)要(yao)你會看英文(wen),sqlite 可以(yi)讓你學到(dao)不(bu)少東西)。
2 關(guan)閉數(shu)據(ju)庫鏈接sqlite3_close用法
原型:
int sqlite3_close(sqlite3 *ppDb);
ppDb為剛才使用(yong)sqlite3_open打(da)開的數據(ju)庫鏈接
3 執(zhi)行(xing)sql操作sqlite3_exec用法
原型:
int sqlite3_exec(
sqlite3* ppDb, /* 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 */
);
這(zhe)就是執行一條(tiao)sql 語(yu)句的函數。
第(di)1個(ge)參數是前面open函數得到的(de)指針。說了是關鍵(jian)數據結構(gou)。
第2個參數(shu)constchar*sql是(shi)一(yi)條sql 語句(ju),以(yi)\0結尾。
第3個(ge)參(can)數sqlite3_callback 是回調,當這條(tiao)語(yu)句執行(xing)之后,sqlite3會去(qu)調用(yong)你(ni)提(ti)供(gong)的這個(ge)函(han)數。
第4個(ge)(ge)參數(shu)(shu)(shu)void*是(shi)你所提供的(de)指(zhi)針(zhen),你可(ke)(ke)以(yi)傳(chuan)遞任何一個(ge)(ge)指(zhi)針(zhen)參數(shu)(shu)(shu)到(dao)這(zhe)里,這(zhe)個(ge)(ge)參數(shu)(shu)(shu)終會傳(chuan)到(dao)回(hui)調函數(shu)(shu)(shu)里面,如果(guo)不需要傳(chuan)遞指(zhi)針(zhen)給回(hui)調函數(shu)(shu)(shu),可(ke)(ke)以(yi)填NULL。等(deng)下我們再看回(hui)調函數(shu)(shu)(shu)的(de)寫 法,以(yi)及這(zhe)個(ge)(ge)參數(shu)(shu)(shu)的(de)使(shi)用。
第5個參(can)數(shu)(shu)char** errmsg 是錯誤(wu)信息(xi)(xi)。注意是指(zhi)針(zhen)(zhen)(zhen)的(de)指(zhi)針(zhen)(zhen)(zhen)。sqlite3里(li)面有(you)很多(duo)固定的(de)錯誤(wu)信息(xi)(xi)。執行sqlite3_exec 之后,執行失敗時可(ke)(ke)以查閱這(zhe)(zhe)個指(zhi)針(zhen)(zhen)(zhen)(直接cout<<errmsg得到(dao)一串字符串信息(xi)(xi),這(zhe)(zhe)串信息(xi)(xi)告(gao)訴你(ni)錯在什(shen)么(me)地方。sqlite3_exec函(han)數(shu)(shu)通(tong)過修改你(ni)傳入(ru)的(de)指(zhi)針(zhen)(zhen)(zhen)的(de)指(zhi)針(zhen)(zhen)(zhen),把(ba)你(ni)提(ti)供(gong)的(de)指(zhi)針(zhen)(zhen)(zhen)指(zhi)向(xiang)錯誤(wu)提(ti)示信息(xi)(xi),這(zhe)(zhe)樣(yang)sqlite3_exec函(han)數(shu)(shu)外面就(jiu)可(ke)(ke)以通(tong)過這(zhe)(zhe)個char*得到(dao)具體錯誤(wu)提(ti)示。 說明:通(tong)常(chang),sqlite3_callback 和它后面的(de)void*這(zhe)(zhe)兩(liang)個位置都可(ke)(ke)以填(tian)NULL。填(tian)NULL表示你(ni)不(bu)需要(yao)回(hui)(hui)調。比如你(ni)做(zuo)insert 操作,做(zuo)delete操作,就(jiu)沒有(you)必(bi)要(yao)使(shi)(shi)用(yong)回(hui)(hui)調。而當你(ni)做(zuo)select 時,就(jiu)要(yao)使(shi)(shi)用(yong)回(hui)(hui)調,因為sqlite3 把(ba)數(shu)(shu)據查出來(lai),得通(tong)過回(hui)(hui)調告(gao)訴你(ni)查出了什(shen)么(me)數(shu)(shu)據。
exec 的回調(diao)
typedef int(*sqlite3_callback)(void*,int,char**,char**);
你的回調(diao)函數必須(xu)定義成上面這個函數的類型(xing)。
下面給個簡(jian)單(dan)的例子:
//sqlite3的(de)回(hui)調函(han)數
//sqlite 每查(cha)到一(yi)條(tiao)記錄(lu),就調用一(yi)次這個回調 int LoadMyInfo(void* para,intn_column,char** column_value,char** column_name);
//para是你(ni)在sqlite3_exec 里傳(chuan)入(ru)的void*參數通過para參數,你(ni)可以傳(chuan)入(ru)一(yi)些特殊的指針(zhen)(zhen)(比如(ru)類指針(zhen)(zhen)、結構指針(zhen)(zhen)),
//然(ran)后在這(zhe)(zhe)里面強制轉換成對(dui)應的(de)類(lei)型(xing)(這(zhe)(zhe)里面是void*類(lei)型(xing),必須強制轉換成你的(de)類(lei)型(xing)才可(ke)用)。然(ran)后操作這(zhe)(zhe)些數據
//n_column是這一(yi)條(tiao)記(ji)錄有(you)多少個字(zi)段(duan)(即這條(tiao)記(ji)錄有(you)多少列)
//char** column_value 是個(ge)關鍵(jian)值,查出(chu)來的數據都保存在這里(li),它實際(ji)上是個(ge)1維(wei)數組(不要以為是2維(wei)數組),
//每一個元素(su)都是一個char*值,是一個字段內(nei)容(用字符串來(lai)表示,以\0結尾)
//char** column_name 跟column_value是對應的,表示這(zhe)個字(zi)段的字(zi)段名稱
實例:
1 #include <iostream>
2 using namespace std;
3 #include "sqlite/sqlite3.h"
4 int callback(void*,int,char**,char**);
5 int main()
6 {
7 sqlite3* db;
8 int nResult = sqlite3_open("test.db",&db);
9 if (nResult != SQLITE_OK)
10 {
11   cout<<"打(da)開數據庫失敗:"<<sqlite3_errmsg(db)<<endl;
12 return 0;
13 }
14 else
15 {
16     cout<<"數據(ju)庫打開成功"<<endl;
17 }
18
19 char* errmsg;
20
21   nResult = sqlite3_exec(db,"create table fuck(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);
22  if (nResult != SQLITE_OK)
23 {
24   sqlite3_close(db);
25   cout<<errmsg;
26   sqlite3_free(errmsg);
27 return 0;
28 }
29 string strSql;
30 strSql+="begin;\n";
31 for (int i=0;i<100;i++)32   {
33 strSql+="insert into fuck values(null,'heh');\n";
34 }
35 strSql+="commit;";
36 //cout<<strSql<<endl;
37
38   nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);
39
40 if (nResult != SQLITE_OK)
41 {
42   sqlite3_close(db);
43   cout<<errmsg<<endl;
44 sqlite3_free(errmsg);
45 return 0;
46 }
47
48 strSql = "select * from fuck";
49 nResult = sqlite3_exec(db,strSql.c_str(),callback,NULL,&errmsg);
50   if (nResult != SQLITE_OK)
51 {
52   sqlite3_close(db);
53   cout<<errmsg<<endl;
54 sqlite3_free(errmsg);
55 return 0;
56 }
57
58 sqlite3_close(db);
59 return 0;
60 }
61
62 int callback(void* ,int nCount,char** pValue,char** pName)
63 {
64 string s;
65 for(int i=0;i<nCount;i++)
66 {
67 s+=pName[i];
68   s+=":";
69 s+=pValue[i];
70 s+="\n";
71 }
72 cout<<s<<endl;
73 return 0;
74 }
注意:創建一個(ge)表(biao)、往表(biao)里(li)插入數據(ju)可以(yi)用sqlite3_exec,而(er)查詢表(biao)里(li)的數據(ju)用sqlite3_get_table。

