久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > sqlite入門基礎(一):sqlite3_open,sqlite3_exec,slite3_close

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;

}

上一篇:靜態庫和動態庫的制作

下一篇:Android 異步任務AsyncTask

熱點文章推薦
華清學員(yuan)就業榜(bang)單
高(gao)薪學(xue)員(yuan)經驗分享
熱點新聞推薦
前臺專線(xian):010-82525158 企業培(pei)訓洽談專(zhuan)線(xian):010-82525379 院(yuan)校合作(zuo)洽談專(zhuan)線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部