用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法_第1頁
用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法_第2頁
用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法_第3頁
用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法_第4頁
用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法執(zhí)行sql語句intsqlite3_exec(sqlite3*,constchar*sql,sqlite3_callback,void*,char**errmsg);這就是執(zhí)行一條sql語句的函數(shù)。第1個參數(shù)不再說了,是前面open函數(shù)得到的指針。說了是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。第2個參數(shù)constchar*sql是一條sql語句,以/0結(jié)尾。第3個參數(shù)sqlite3_callback是回調(diào),當(dāng)這條語句執(zhí)行之后,sqlite3會去調(diào)用你提供的這個函數(shù)。第4個參數(shù)void*是你所提供的指針,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里面,這個指針比較重要,可以用來作參數(shù)的傳遞。如果不需要傳遞指針給回調(diào)函數(shù),可以填NULL。等下我們再看回調(diào)函數(shù)的寫法,以及這個參數(shù)的使用。第5個參數(shù)char**errmsg是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執(zhí)行sqlite3_exec之后,執(zhí)行失敗時可以查閱這個指針(直接printf(“%s/n”,errmsg))得到一串字符串信息,這串信息告訴你錯在什么地方。sqlite3_exec函數(shù)通過修改你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數(shù)外面就可以通過這個char*得到具體錯誤提示。說明:通常,sqlite3_callback和它后面的void*這兩個位置都可以填NULL。填NULL表示你不需要回調(diào)。比如你做insert操作,做delete操作,就沒有必要使用回調(diào)。而當(dāng)你做select時,就要使用回調(diào),因?yàn)閟qlite3把數(shù)據(jù)查出來,得通過回調(diào)告訴你查出了什么數(shù)據(jù)。exec的回調(diào)typedefint(*sqlite3_callback)(void*,int,char**,char**);你的回調(diào)函數(shù)必須定義成上面這個函數(shù)的類型。下面給個簡單的例子://sqlite每查到一條記錄,就調(diào)用一次這個回調(diào)intLoadMyInfo(void*para,intn_column,char**column_value,char**column_name){//para是你在sqlite3_exec里傳入的void*參數(shù)//通過para參數(shù),你可以傳入一些特殊的指針(比如類指針、結(jié)構(gòu)指針),然后在這里面強(qiáng)制轉(zhuǎn)換成對應(yīng)的類型(這里面是void*類型,必須強(qiáng)制轉(zhuǎn)換成你的類型才可用)。然后操作這些數(shù)據(jù)//n_column是這一條記錄有多少個字段(即這條記錄有多少列)//char**column_value是個關(guān)鍵值,查出來的數(shù)據(jù)都保存在這里,它實(shí)際上是個1維數(shù)組(不要以為是2維數(shù)組),每一個元素都是一個char*值,是一個字段內(nèi)容(用字符串來表示,以/0結(jié)尾)//char**column_name跟column_value是對應(yīng)的,表示這個字段的字段名稱//這里,我不使用para參數(shù)。忽略它的存在.inti;printf(“記錄包含%d個字段/n”,n_column);for(i=0;i<n_column;i){printf(“字段名:%s?>字段值:%s/n”,column_name[i],column_value[i]);}printf(“------------------/n“);return0;}intmain(int,char**){sqlite3*db;intresult;char*errmsg=NULL;result=sqlite3_open(“c://Dcg_database.db”,&db);if(result!=SQLITE_OK){//數(shù)據(jù)庫打開失敗return-1;}//數(shù)據(jù)庫操作代碼//創(chuàng)建一個測試表,表名叫MyTable_1,有2個字段:ID和name。其中ID是一個自動增加的類型,以后insert時可以不去指定這個字段,它會自己從0開始增加result=sqlite3_exec(db,“createtableMyTable_1(IDintegerprimarykeyautoincrement,namenvarchar(32))”,NULL,NULL,&errmsg);if(result!=SQLITE_OK){printf(“創(chuàng)建表失敗,錯誤碼:%d,錯誤原因:%s/n”,result,errmsg);}//插入一些記錄result=sqlite3_exec(db,“insertintoMyTable_1(name)values(‘走路’)”,0,0,&errmsg);if(result!=SQLITE_OK){printf(“插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n”,result,errmsg);}result=sqlite3_exec(db,“insertintoMyTable_1(name)values(‘騎單車’)”,0,0,&errmsg);if(result!=SQLITE_OK){printf(“插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n”,result,errmsg);}result=sqlite3_exec(db,“insertintoMyTable_1(name)values(‘坐汽車’)”,0,0,&errmsg);if(result!=SQLITE_OK){printf(“插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n”,result,errmsg);}//開始查詢數(shù)據(jù)庫result=sqlite3_exec(db,“select*fromMyTable_1”,LoadMyInfo,NULL,&errmsg);//關(guān)閉數(shù)據(jù)庫sqlite3_close(db);return0;}通過上面的例子,應(yīng)該可以知道如何打開一個數(shù)據(jù)庫,如何做數(shù)據(jù)庫基本操作。有這些知識,基本上可以應(yīng)付很多數(shù)據(jù)庫操作了。不使用回調(diào)查詢數(shù)據(jù)庫上面介紹的sqlite3_exec是使用回調(diào)來執(zhí)行select操作。還有一個方法可以直接查詢而不需要回調(diào)。但是,我個人感覺還是回調(diào)好,因?yàn)榇a可以更加整齊,只不過用回調(diào)很麻煩,你得聲明一個函數(shù),如果這個函數(shù)是類成員函數(shù),你還不得不把它聲明成static的(要問為什么?這又是C基礎(chǔ)了。C成員函數(shù)實(shí)際上隱藏了一個參數(shù):this,C調(diào)用類的成員函數(shù)的時候,隱含把類指針當(dāng)成函數(shù)的第一個參數(shù)傳遞進(jìn)去。結(jié)果,這造成跟前面說的sqlite回調(diào)函數(shù)的參數(shù)不相符。只有當(dāng)把成員函數(shù)聲明成static時,它才沒有多余的隱含的this參數(shù))。雖然回調(diào)顯得代碼整齊,但有時候你還是想要非回調(diào)的select查詢。這可以通過sqlite3_get_table函數(shù)做到。intsqlite3_get_table(sqlite3*,constchar*sql,char***resultp,int*nrow,int*ncolumn,char**errmsg);第1個參數(shù)不再多說,看前面的例子。第2個參數(shù)是sql語句,跟sqlite3_exec里的sql是一樣的。是一個很普通的以/0結(jié)尾的char*字符串。第3個參數(shù)是查詢結(jié)果,它依然一維數(shù)組(不要以為是二維數(shù)組,更不要以為是三維數(shù)組)。它內(nèi)存布局是:第一行是字段名稱,后面是緊接著是每個字段的值。下面用例子來說事。第4個參數(shù)是查詢出多少條記錄(即查出多少行)。第5個參數(shù)是多少個字段(多少列)。第6個參數(shù)是錯誤信息,跟前面一樣,這里不多說了。下面給個簡單例子:intmain(int,char**){sqlite3*db;intresult;char*errmsg=NULL;char**dbResult;//是char**類型,兩個*號intnRow,nColumn;inti,j;intindex;result=sqlite3_open(“c://Dcg_database.db”,&db);if(result!=SQLITE_OK){//數(shù)據(jù)庫打開失敗return-1;}//數(shù)據(jù)庫操作代碼//假設(shè)前面已經(jīng)創(chuàng)建了MyTable_1表//開始查詢,傳入的dbResult已經(jīng)是char**,這里又加了一個&取地址符,傳遞進(jìn)去的就成了char***result=sqlite3_get_table(db,“select*fromMyTable_1”,&dbResult,&nRow,&nColumn,&errmsg);if(SQLITE_OK==result){//查詢成功index=nColumn;//前面說過dbResult前面第一行數(shù)據(jù)是字段名稱,從nColumn索引開始才是真正的數(shù)據(jù)printf(“查到%d條記錄/n”,nRow);for(i=0;i<nRow;i){printf(“第%d條記錄/n”,i1);for(j=0;j<nColumn;j){printf(“字段名:%s?>字段值:%s/n”,dbResult[j],dbResult[index]);index;//dbResult的字段值是連續(xù)的,從第0索引到第nColumn-1索引都是字段名稱,從第nColumn索引開始,后面都是字段值,它把一個二維的表(傳統(tǒng)的行列表示法)用一個扁平的形式來表示}printf(“-------/n”);}}//到這里,不論數(shù)據(jù)庫查詢是否成功,都釋放char**查詢結(jié)果,使用sqlite提供的功能來釋放sqlite3_free_table(dbResult);//關(guān)閉數(shù)據(jù)庫sqlite3_close(db);return0;}到這個例子為止,sqlite3的常用用法都介紹完了。用以上的方法,再配上sql語句,完全可以應(yīng)付絕大多數(shù)數(shù)據(jù)庫需求。但有一種情況,用上面方法是無法實(shí)現(xiàn)的:需要insert、select二進(jìn)制。當(dāng)需要處理二進(jìn)制數(shù)據(jù)時,上面的方法就沒辦法做到。下面這一節(jié)說明如何插入二進(jìn)制數(shù)據(jù)(2)操作二進(jìn)制sqlite操作二進(jìn)制數(shù)據(jù)需要用一個輔助的數(shù)據(jù)類型:sqlite3_stmt*。這個數(shù)據(jù)類型記錄了一個“sql語句

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論