sqlite入門基(ji)礎(一):sqlite3_open,sqlite3_exec,slite3_close
時間:2018-09-26 來源(yuan):未知(zhi)
打(da)開(kai)數據庫鏈接sqlite3_open用(yong)法
原型:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
用(yong)這(zhe)個函數開(kai)始數據庫(ku)操作。需(xu)要傳入兩個參數,一是數據庫(ku)文(wen)件(jian)名(ming),比如(ru):E:/test.db。文(wen)件(jian)名(ming)不需(xu)要一定存在(zai)(zai),如(ru)果此文(wen)件(jian)不存在(zai)(zai),sqlite會自動建(jian)立它。如(ru)果它存在(zai)(zai),就嘗試把它當數據庫(ku)文(wen)件(jian)來打開(kai)。二是sqlite3**,即前面提(ti)到(dao)的(de)關鍵數據結構。這(zhe)個結構底層細節如(ru)何(he),你不要管它。
函(han)數(shu)返回值表示(shi)操(cao)作是(shi)(shi)否(fou)正確(que),如果(guo)是(shi)(shi)SQLITE_OK則表示(shi)操(cao)作正常。相關的返回值sqlite定義了一(yi)些(xie)宏(hong)。具體這些(xie)宏(hong)的含(han)義可以參考sqlite3.h 文(wen)件。里面有詳細定義(順便說一(yi)下(xia),sqlite3 的代碼注釋率(lv)自稱(cheng)是(shi)(shi)非常高的,實際上(shang)也的確(que)很高。只要你(ni)會看英(ying)文(wen),sqlite 可以讓你(ni)學到不少東西)。
關(guan)閉數據庫鏈接sqlite3_close用法
原型:
int sqlite3_close(sqlite3 *ppDb);
ppDb為剛才使用sqlite3_open打開的數據庫(ku)鏈(lian)接(jie)
執行sql操(cao)作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 */
);
這就是執行一條sql 語句(ju)的函數。
第1個參數不(bu)再(zai)說了(le),是(shi)前面open函數得(de)到的指(zhi)針。說了(le)是(shi)關鍵數據結構(gou)。
第2個參數(shu)constchar*sql是(shi)一條sql 語句(ju),以\0結尾。
第3個參數sqlite3_callback 是回調,當這條語句(ju)執行之(zhi)后,sqlite3會去調用(yong)你(ni)提供(gong)的這個函(han)數。
第4個參數void*是你所提供的指針,你可以傳遞任何一個指針參數到這里,這個參數終會傳到回調函數里面,如果不需要傳遞指針給回調函數,可以填NULL。等下我們再看回調函數的寫法(fa),以及(ji)這個參數的使(shi)用。
第5個參數char** errmsg 是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執行sqlite3_exec 之后,執行失敗時可以查閱這個指針(直接cout<
說明:通常,sqlite3_callback 和(he)它后面的void*這兩個位置(zhi)都(dou)可(ke)以(yi)填NULL。填NULL表示你不需要回調(diao)。比(bi)如你做insert 操(cao)作,做delete操(cao)作,就沒(mei)有必要使用回調(diao)。而當(dang)你做select 時,就要使用回調(diao),因為sqlite3 把數據查出(chu)來,得通過回調(diao)告訴(su)你查出(chu)了什么數據。
exec 的回(hui)調
typedef int(*sqlite3_callback)(void*,int,char**,char**);
你的(de)回(hui)調函數(shu)必須定義成(cheng)上面這個函數(shu)的(de)類型(xing)。下面給(gei)個簡(jian)單的(de)例子(zi):
//sqlite3的回調函(han)數(shu)
//sqlite 每查到一條記錄,就調用一次(ci)這個(ge)回調
int LoadMyInfo(void* para,intn_column,char** column_value,char** column_name);
//para是(shi)你(ni)在sqlite3_exec 里傳入的void*參(can)數(shu)通(tong)過(guo)para參(can)數(shu),你(ni)可以(yi)傳入一些(xie)特殊的指針(zhen)(zhen)(比如類指針(zhen)(zhen)、結構指針(zhen)(zhen)),
//然(ran)后在這里面(mian)強(qiang)制轉換(huan)成對應的(de)(de)類(lei)型(xing)(這里面(mian)是void*類(lei)型(xing),必須強(qiang)制轉換(huan)成你的(de)(de)類(lei)型(xing)才可用)。然(ran)后操(cao)作這些數據(ju)
//n_column是這(zhe)一條記錄有(you)多少(shao)個字(zi)段(即這(zhe)條記錄有(you)多少(shao)列)
//char** column_value 是個關鍵值,查(cha)出來(lai)的數據(ju)都保存在這里,它實際上是個1維數組(不要以(yi)為是2維數組),
//每一(yi)個元(yuan)素都是一(yi)個char*值(zhi),是一(yi)個字段內容(用字符(fu)串來表(biao)示,以\0結(jie)尾)
//char** column_name 跟column_value是對應(ying)的,表示這(zhe)個字(zi)段的字(zi)段名(ming)稱
實例:
#include
using namespace std;
#include "sqlite/sqlite3.h"
int callback(void*,int,char**,char**);
int main()
{
sqlite3* db;
int nResult = sqlite3_open("test.db",&db);
if (nResult != SQLITE_OK)
{
cout<<"打開數據庫失敗:"<
return 0;
}
else
{
cout<<"數據庫打開成功"<
}
char* errmsg;
nResult = sqlite3_exec(db,"create table fuck(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
sqlite3_close(db);
cout<
sqlite3_free(errmsg);
return 0;
}
string strSql;
strSql+="begin;\n";
for (int i=0;i<100;i++)
{
strSql+="insert into fuck values(null,'heh');\n";
}
strSql+="commit;";
//cout<
nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
sqlite3_close(db);
cout<
sqlite3_free(errmsg);
return 0;
}
strSql = "select * from fuck";
nResult = sqlite3_exec(db,strSql.c_str(),callback,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
sqlite3_close(db);
cout<
sqlite3_free(errmsg);
return 0;
}
sqlite3_close(db);
return 0;
}
int callback(void* ,int nCount,char** pValue,char** pName)
{
string s;
for(int i=0;i
{
s+=pName[i];
s+=":";
s+=pValue[i];
s+="\n";
}
cout< <
return 0;
}

