日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sqlite3用法详解草稿

發(fā)布時(shí)間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlite3用法详解草稿 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用的過程根據(jù)使用的函數(shù)大致分為如下幾個(gè)過程:

  • sqlite3_open()
  • sqlite3_prepare()
  • sqlite3_step()
  • sqlite3_column()
  • sqlite3_finalize()
  • sqlite3_close()

這幾個(gè)過程是概念上的說法,而不完全是程序運(yùn)行的過程,如sqlite3_column()表示的是對(duì)查詢獲得一行里面的數(shù)據(jù)的列的各個(gè)操作統(tǒng)稱,實(shí)際上在sqlite中并不存在這個(gè)函數(shù)。


1.? sqlite3_open():打開數(shù)據(jù)庫

在操作數(shù)據(jù)庫之前,首先要打開數(shù)據(jù)庫。這個(gè)函數(shù)打開一個(gè)sqlite數(shù)據(jù)庫文件的連接并且返回一個(gè)數(shù)據(jù)庫連接對(duì)象。這個(gè)操作同時(shí)程序中的第一個(gè)調(diào)用的sqlite函數(shù),同時(shí)也是其他sqlite api的先決條件。許多的sqlite接口函數(shù)都需要一個(gè)數(shù)據(jù)庫連接對(duì)象的指針作為它們的第一個(gè)參數(shù)。

函數(shù)定義

int sqlite3_open(

? const char *filename,?? /* Database filename (UTF-8) */

? sqlite3 **ppDb????????? /* OUT: SQLite db handle */

);

int sqlite3_open16(

? const void *filename,?? /* Database filename (UTF-16) */

? sqlite3 **ppDb????????? /* OUT: SQLite db handle */

);

int sqlite3_open_v2(

? const char *filename,?? /* Database filename (UTF-8) */

? sqlite3 **ppDb,???????? /* OUT: SQLite db handle */

? int flags,????????????? /* Flags */

? const char *zVfs??????? /* Name of VFS module to use */

);

?

說明:

假如這個(gè)要被打開的數(shù)據(jù)文件不存在,則一個(gè)同名的數(shù)據(jù)庫文件將被創(chuàng)建。如果使用sqlite3_open和sqlite3_open_v2的話,數(shù)據(jù)庫將采用UTF-8的編碼方式,sqlite3_open16采用UTF-16的編碼方式

返回值:

如果sqlite數(shù)據(jù)庫被成功打開(或創(chuàng)建),將會(huì)返回SQLITE_OK,否則將會(huì)返回錯(cuò)誤碼。Sqlite3_errmsg()或者sqlite3_errmsg16可以用于獲得數(shù)據(jù)庫打開錯(cuò)誤碼的英文描述,這兩個(gè)函數(shù)定義為:

const char *sqlite3_errmsg(sqlite3*);

const void *sqlite3_errmsg16(sqlite3*);

無論是否成功打開數(shù)據(jù)庫, 都應(yīng)該使用 sqlite3_close() 關(guān)閉數(shù)據(jù)庫連接.

????????

參數(shù)說明:

filename:需要被打開的數(shù)據(jù)庫文件的文件名,在sqlite3_open和sqlite3_open_v2中這個(gè)參數(shù)采用UTF-8編碼,而在sqlite3_open16中則采用UTF-16編碼

ppDb:一個(gè)數(shù)據(jù)庫連接句柄被返回到這個(gè)參數(shù),即使發(fā)生錯(cuò)誤。唯一的一場(chǎng)是如果sqlite不能分配內(nèi)存來存放sqlite對(duì)象,ppDb將會(huì)被返回一個(gè)NULL值。

flags:作為數(shù)據(jù)庫連接的額外控制的參數(shù),可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一個(gè),用于控制數(shù)據(jù)庫的打開方式,可以和SQLITE_OPEN_NOMUTEXSQLITE_OPEN_FULLMUTEX,?SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE結(jié)合使用,具體的詳細(xì)情況可以查閱文檔


=====================================================================================

2.? Sqlite3_prepare()

這個(gè)函數(shù)將sql文本轉(zhuǎn)換成一個(gè)準(zhǔn)備語句(prepared statement)對(duì)象,同時(shí)返回這個(gè)對(duì)象的指針。這個(gè)接口需要一個(gè)數(shù)據(jù)庫連接指針以及一個(gè)要準(zhǔn)備的包含SQL語句的文本。它實(shí)際上并不執(zhí)行(evaluate)這個(gè)SQL語句,它僅僅為執(zhí)行,準(zhǔn)備這個(gè)sql語句

函數(shù)定義(僅列出UTF-8的)

int sqlite3_prepare(

? sqlite3 *db,??????????? /* Database handle */? /* 成功打開的數(shù)據(jù)庫句柄 */

? const char *zSql,?????? /* SQL statement, UTF-8 encoded */ /* UTF8編碼的 SQL 語句 */

? int nByte,????????????? /* Maximum length of zSql in bytes. */ ? /* 參數(shù) sql 的字節(jié)數(shù), 包含 '\0' */

? sqlite3_stmt **ppStmt,? /* OUT: Statement handle */ /* 輸出:預(yù)編譯語句句柄 */

? const char **pzTail???? /* OUT: Pointer to unused portion of zSql */ /* 輸出:指向 sql 語句中未使用的部分 */

);

int sqlite3_prepare_v2(

? sqlite3 *db,??????????? /* Database handle */

? const char *zSql,?????? /* SQL statement, UTF-8 encoded */

? int nByte,????????????? /* Maximum length of zSql in bytes. */

? sqlite3_stmt **ppStmt,? /* OUT: Statement handle */

? const char **pzTail???? /* OUT: Pointer to unused portion of zSql */

);

?

參數(shù):

db:數(shù)據(jù)指針

zSql:sql語句,使用UTF-8編碼

nByte:如果nByte小于0,則函數(shù)取出zSql中從開始到第一個(gè)0終止符的內(nèi)容;如果nByte不是負(fù)的,那么它就是這個(gè)函數(shù)能從zSql中讀取的字節(jié)數(shù)的最大值。如果nBytes非負(fù),zSql在第一次遇見’/000/或’u000’的時(shí)候終止.如果用戶知道被傳入的 sql 語句是以 '\0' 結(jié)尾的, 那么有一個(gè)更好的做法是:把nbytes的值設(shè)為該字符串的長(zhǎng)度(包含'\0'), 這樣可以避免 SQLite 復(fù)制該字符串的一份拷貝, 以提高程序的效率.

pzTail:上面提到zSql在遇見終止符或者是達(dá)到設(shè)定的nByte之后結(jié)束,假如zSql還有剩余的內(nèi)容,那么這些剩余的內(nèi)容被存放到pZTail中,不包括終止符。如果 pszTail 不為 NULL, 則 *pszTail 指向 sql 中第一個(gè)被傳入的 SQL 語句的結(jié)尾. 該函數(shù)只編譯 sql 的第一個(gè)語句, 所以 *pszTail 指向的內(nèi)容則是未被編譯的.

ppStmt:能夠使用sqlite3_step()執(zhí)行的編譯好的準(zhǔn)備語句的指針,如果錯(cuò)誤發(fā)生,它被置為NULL,如假如輸入的文本不包括sql語句。調(diào)用過程必須負(fù)責(zé)在編譯好的sql語句完成使用后使用sqlite3_finalize()刪除它。

?

說明

如果執(zhí)行成功,則返回SQLITE_OK,否則返回一個(gè)錯(cuò)誤碼。推薦在現(xiàn)在任何的程序中都使用sqlite3_prepare_v2這個(gè)函數(shù),sqlite3_prepare只是用于前向兼容

?

備注

<1> 準(zhǔn)備語句(prepared statement)對(duì)象

typedef struct sqlite3_stmt sqlite3_stmt;

????????

準(zhǔn)備語句(prepared statement)對(duì)象一個(gè)代表一個(gè)簡(jiǎn)單SQL語句對(duì)象的實(shí)例,這個(gè)對(duì)象通常被稱為“準(zhǔn)備語句”或者“編譯好的SQL語句”或者就直接稱為“語句”。

???????? 語句對(duì)象的生命周期經(jīng)歷這樣的過程:

l? 使用sqlite3_prepare_v2或相關(guān)的函數(shù)創(chuàng)建這個(gè)對(duì)象

l? 使用sqlite3_bind_*()給宿主參數(shù)(host parameters)綁定值

l? 通過調(diào)用sqlite3_step一次或多次來執(zhí)行這個(gè)sql

l? 使用sqlite3_reset()重置這個(gè)語句,然后回到第2步,這個(gè)過程做0次或多次

l? 使用sqlite3_finalize()銷毀這個(gè)對(duì)象

?

在sqlite中并沒有定義sqlite3_stmt這個(gè)結(jié)構(gòu)的具體內(nèi)容,它只是一個(gè)抽象類型,在使用過程中一般以它的指針進(jìn)行操作,而sqlite3_stmt類型的指針在實(shí)際上是一個(gè)指向Vdbe的結(jié)構(gòu)體得指針

<2> 宿主參數(shù)(host parameters)

在傳給sqlite3_prepare_v2()的sql的語句文本或者它的變量中,滿足如下模板的文字將被替換成一個(gè)參數(shù):

l? ?

l? ?NNN,NNN代表數(shù)字

l? :VVV,VVV代表字符

l? @VVV

l? $VVV

在上面這些模板中,NNN代表一個(gè)數(shù)字,VVV代表一個(gè)字母數(shù)字標(biāo)記符(例如:222表示名稱為222的標(biāo)記符),sql語句中的參數(shù)(變量)通過上面的幾個(gè)模板來指定,如

“select ? from ? “這個(gè)語句中指定了兩個(gè)參數(shù),sqlite語句中的第一個(gè)參數(shù)的索引值是1,這就知道這個(gè)語句中的兩個(gè)參數(shù)的索引分別為1和2,使用”?”的話會(huì)被自動(dòng)給予索引值,而使用”?NNN”則可以自己指定參數(shù)的索引值,它表示這個(gè)參數(shù)的索引值為NNN。”:VVV”表示一個(gè)名為”VVV”的參數(shù),它也有一個(gè)索引值,被自動(dòng)指定。

例子:

INSERT?INTO?people?(id,?name)?VALUES?(??,???);

INSERT?INTO?people?(id, id2,name)?VALUES?(??1,??1.?2 );作用:可以用同一個(gè)值綁定幾個(gè)變量

INSERT?INTO?people?(id,?name)?VALUES?(?:id,?:name?);

INSERT?INTO?people?(id,?name)?VALUES?( @id, @name?);

INSERT?INTO?people?(id,?name)?VALUES?( $id,$name?);用來支持Tcl變量的擴(kuò)展語法,除非使用Tcl編程,否則推薦使用“:<name>”版本。


可以使用sqlite3_bind_*()來給這些參數(shù)綁定值

=====================================================================================

3.

int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n,void(*)(void*));

sqlite3_bind_*系列函數(shù)有好多,這里只對(duì)sqlite3_bind_text進(jìn)行一下說明,sqlite3_bind_text的第二個(gè)參數(shù)為序號(hào)(從1開始),第三個(gè)參數(shù)為字符串值,第四個(gè)參數(shù)為字符串長(zhǎng)度。sqlite3_bind_text的第五個(gè)參數(shù)為一個(gè)函數(shù)指針,SQLITE3執(zhí)行完操作后回調(diào)此函數(shù),通常用于釋放字符串占用的內(nèi)存。此參數(shù)有兩個(gè)常數(shù),SQLITE_STATIC告訴sqlite3_bind_text函數(shù)字符串為常量,可以放心使用;而SQLITE_TRANSIENT會(huì)使得sqlite3_bind_text函數(shù)對(duì)字符串做一份拷貝。一般使用這兩個(gè)常量參數(shù)來調(diào)sqlite3_bind_text。statement準(zhǔn)備好了以后,就是操作的執(zhí)行了。


int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
功能:為查詢結(jié)構(gòu)體綁定數(shù)據(jù)
PARAM1(IN):查詢結(jié)構(gòu)體
PARAM2(IN):綁定第幾個(gè)數(shù)據(jù)(sql語句中的第幾個(gè)問號(hào)(?))
PARAM3(IN):二進(jìn)制數(shù)據(jù)指針
PARAM4(IN):二進(jìn)制數(shù)據(jù)長(zhǎng)度
PARAM5(IN):析構(gòu)回調(diào)函數(shù),通常設(shè)置NULL,結(jié)束后自己釋放
返回值:SQLITE_OK成功.
說明:綁定函數(shù)必須要在sqlite3_step前,sqlite3_prepare或者sqlite3_reset之后調(diào)用.
未綁定的參數(shù)缺省為NULL,類似的綁定函數(shù)還有以下
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite_int64);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);


=====================================================================================

4.? sqlite3_step()

這個(gè)過程用于執(zhí)行有前面sqlite3_prepare創(chuàng)建的準(zhǔn)備語句。這個(gè)語句執(zhí)行到結(jié)果的第一行可用的位置。繼續(xù)前進(jìn)到結(jié)果的第二行的話,只需再次調(diào)用sqlite3_setp()。繼續(xù)調(diào)用sqlite3_setp()知道這個(gè)語句完成,那些不返回結(jié)果的語句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只執(zhí)行一次就返回

函數(shù)定義

int sqlite3_step(sqlite3_stmt*);

返回值

函數(shù)的返回值基于創(chuàng)建sqlite3_stmt參數(shù)所使用的函數(shù),假如是使用老版本的接口sqlite3_prepare()和sqlite3_prepare16(),返回值會(huì)是?SQLITE_BUSY,?SQLITE_DONE,?SQLITE_ROW,?SQLITE_ERROR 或?SQLITE_MISUSE,而v2版本的接口sqlite3_prepare_v2()和sqlite3_prepare16_v2()則會(huì)同時(shí)返回這些結(jié)果碼和擴(kuò)展結(jié)果碼。

對(duì)所有V3.6.23.1以及其前面的所有版本,需要在sqlite3_step()之后調(diào)用sqlite3_reset(),在后續(xù)的sqlite3_ step之前。如果調(diào)用sqlite3_reset重置準(zhǔn)備語句失敗,將會(huì)導(dǎo)致sqlite3_ step返回SQLITE_MISUSE,但是在V3. 6.23.1以后,sqlite3_step()將會(huì)自動(dòng)調(diào)用sqlite3_reset。


說明:
??? 當(dāng)一條語句被 sqlite3_prepare() 或其相關(guān)的函數(shù)預(yù)編譯后, sqlite3_step() 必須被調(diào)用一次或多次來評(píng)估該預(yù)編譯語句.
??? 該函數(shù)的詳細(xì)行為依賴于由 sqlite3_prepare()(或其相關(guān)的函數(shù)) 產(chǎn)生的是一條怎樣的預(yù)編譯語句.
??? 函數(shù)將返回一個(gè)以下的結(jié)果來標(biāo)識(shí)其執(zhí)行結(jié)果:
??????? SQLITE_BUSY:忙碌. 數(shù)據(jù)庫引擎無法鎖定數(shù)據(jù)去完成其工作. 但可以多次嘗試.
??????? SQLITE_DONE:完成. sql 語句已經(jīng)被成功地執(zhí)行. 在調(diào)用 sqlite_reset() 之前, 當(dāng)前預(yù)編譯的語句不應(yīng)該被 sqlite3_step() 再次調(diào)用.
??????? SQLITE_ROW:查詢時(shí)產(chǎn)生了結(jié)果. 此時(shí)可以通過相關(guān)的"數(shù)據(jù)訪問函數(shù)(column access functions)"來取得數(shù)據(jù). sqlite3_step() 的再一次調(diào)用將取得下一條查詢結(jié)果.
??????? SQLITE_ERROR:發(fā)生了錯(cuò)誤. 此時(shí)可以通過 sqlite3_errmmsg() 取得相關(guān)的錯(cuò)誤信息. sqlite3_step() 不能被再次調(diào)用.
??????? SQLITE_MISUSE:不正確的庫的使用. 該函數(shù)使用不當(dāng).
其它:
??? 有關(guān)預(yù)編譯的使用, 將在以后的函數(shù)介紹中詳細(xì)說明.

=====================================================================================

5.int sqlite3_reset(sqlite3_stmt *pStmt);

sqlite3_reset用于重置一個(gè)準(zhǔn)備語句對(duì)象到它的初始狀態(tài),然后準(zhǔn)備被重新執(zhí)行。所有sql語句變量使用sqlite3_bind*綁定值,使用sqlite3_clear_bindings重設(shè)這些綁定。Sqlite3_reset接口重置準(zhǔn)備語句到它代碼開始的時(shí)候。sqlite3_reset并不改變?cè)跍?zhǔn)備語句上的任何綁定值,那么這里猜測(cè),可能是語句在被執(zhí)行的過程中發(fā)生了其他的改變,然后這個(gè)語句將它重置到綁定值的時(shí)候的那個(gè)狀態(tài)。


它的返回值相對(duì)有些特殊。返回SQLITE_BUSY表示暫時(shí)無法執(zhí)行操作,SQLITE_DONE表示操作執(zhí)行完畢,SQLITE_ROW表示執(zhí)行完畢并且有返回(執(zhí)行select語句時(shí))。當(dāng)返回值為SQLITE_ROW時(shí),我們需要對(duì)查詢結(jié)果進(jìn)行處理,SQLITE3提供 sqlite3_column_*系列函數(shù)

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

其中參數(shù)iCol為列的序號(hào),從0開始。如果返回值有多行,則可以再次調(diào)用sqlite3_step函數(shù),然后由sqlite3_column_*函數(shù)取得返回值。使用上述這些函數(shù)基本上可以完成對(duì)SQLITE3數(shù)據(jù)庫的操作了(不過我這里只針對(duì)text數(shù)據(jù)類型做了說明)。


=====================================================================================

6.? sqlite3_column()

這個(gè)過程從執(zhí)行sqlite3_step()執(zhí)行一個(gè)準(zhǔn)備語句得到的結(jié)果集的當(dāng)前行中返回一個(gè)列。每次sqlite3_step得到一個(gè)結(jié)果集的列停下后,這個(gè)過程就可以被多次調(diào)用去查詢這個(gè)行的各列的值。對(duì)列操作是有多個(gè)函數(shù),均以sqlite3_column為前綴

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);

double sqlite3_column_double(sqlite3_stmt*, int iCol);

int sqlite3_column_int(sqlite3_stmt*, int iCol);

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);

int sqlite3_column_type(sqlite3_stmt*, int iCol);

int sqlite3_column_numeric_type(sqlite3_stmt*, int iCol);

sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

說明

第一個(gè)參數(shù)為從sqlite3_prepare返回來的prepared statement對(duì)象的指針,第二參數(shù)指定這一行中的想要被返回的列的索引。最左邊的一列的索引號(hào)是0,行的列數(shù)可以使用sqlite3_colum_count()獲得。

這些過程會(huì)根據(jù)情況去轉(zhuǎn)換數(shù)值的類型,sqlite內(nèi)部使用sqlite3_snprintf()去自動(dòng)進(jìn)行這個(gè)轉(zhuǎn)換,下面是關(guān)于轉(zhuǎn)換的細(xì)節(jié)表:

內(nèi)部類型

請(qǐng)求的類型

轉(zhuǎn)換

NULL

INTEGER

結(jié)果是0

NULL

FLOAT

結(jié)果是0.0

NULL

TEXT

結(jié)果是NULL

NULL

BLOB

結(jié)果是NULL

INTEGER

FLOAT

從整形轉(zhuǎn)換到浮點(diǎn)型

INTEGER

TEXT

整形的ASCII碼顯示

INTEGER

BLOB

同上

FLOAT

INTEGER

浮點(diǎn)型轉(zhuǎn)換到整形

FLOAT

TEXT

浮點(diǎn)型的ASCII顯示

FLOAT

BLOB

同上

TEXT

INTEGER

使用atoi()

TEXT

FLOAT

使用atof()

TEXT

BLOB

沒有轉(zhuǎn)換

BLOB

INTEGER

先到TEXT,然后使用atoi

BLOB

FLOAT

先到TEXT,然后使用atof

BLOB

TEXT

如果需要的話添加0終止符

?

注:BLOB數(shù)據(jù)類型是指二進(jìn)制的數(shù)據(jù)塊,比如要在數(shù)據(jù)庫中存放一張圖片,這張圖片就會(huì)以二進(jìn)制形式存放,在sqlite中對(duì)應(yīng)的數(shù)據(jù)類型就是BLOB

?

int sqlite3_column_bytes(sqlite3_stmt*, int iCol)int sqlite3_column_bytes16(sqlite3_stmt*, int iCol)兩個(gè)函數(shù)返回對(duì)應(yīng)列的內(nèi)容的字節(jié)數(shù),這個(gè)字節(jié)數(shù)不包括后面類型轉(zhuǎn)換過程中加上的0終止符。

下面是幾個(gè)最安全和最簡(jiǎn)單的使用策略

  • 先sqlite3_column_text() ,然后 sqlite3_column_bytes()
  • 先sqlite3_column_blob(),然后sqlite3_column_bytes()
  • 先sqlite3_column_text16(),然后sqlite3_column_bytes16()
(1) 得到數(shù)據(jù)行中某個(gè)列的數(shù)據(jù)sqlite3_column_xxx(sqlite3_stmt*, int iCol); 在sqlite3_step返回SQLITE_ROW后,使用它得到第iCol列的數(shù)據(jù)。 其中的xxx代表: blob:指向保存數(shù)據(jù)內(nèi)存的指針 bytes, bytes16: 得到該blob類型數(shù)據(jù)的大小,或者text轉(zhuǎn)換為UTF8/UTF16的字符串長(zhǎng)度。 double, int, int64: 數(shù)值 text,text16:字符串指針 type:該列的數(shù)據(jù)類型(SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL) 注意:如果對(duì)該列使用了不同與該列本身類型適合的數(shù)據(jù)讀取方法,得到的數(shù)值將是轉(zhuǎn)換過的結(jié)果。

(2)

得到數(shù)據(jù)行中某個(gè)列的數(shù)據(jù)的類型int sqlite3_column_type(sqlite3_stmt*, int iCol); 返回值:SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL 使用的方法和sqlite3_column_xxx()函數(shù)類似。

(3)

int sqlite3_column_count(sqlite3_stmt *pStmt);
功能:獲取列數(shù)

如果過程沒有返回值,如update,將返回0
const char *sqlite3_column_name(sqlite3_stmt*,int);
功能:獲取列名

const char *sqlite3_column_decltype(sqlite3_stmt *, int i);
功能:返回列數(shù)據(jù)類型

類似:

得到當(dāng)前行中包含的數(shù)據(jù)個(gè)數(shù)int sqlite3_data_count(sqlite3_stmt *pStmt); 如果sqlite3_step返回SQLITE_ROW,可以得到列數(shù),否則為零。

=====================================================================================

7.int sqlite3_reset(sqlite3_stmt *pStmt);
功能:重置所有綁定的值,回到剛剛調(diào)用sqlite3_prepare后的狀態(tài)

=====================================================================================

8.sqlite3_finalize

??? int sqlite3_finalize(sqlite3_stmt *pStmt);

這個(gè)過程銷毀前面被sqlite3_prepare創(chuàng)建的準(zhǔn)備語句,每個(gè)準(zhǔn)備語句都必須使用這個(gè)函數(shù)去銷毀以防止內(nèi)存泄露。

在空指針上調(diào)用這個(gè)函數(shù)沒有什么影響,同時(shí)可以準(zhǔn)備語句的生命周期的任一時(shí)刻調(diào)用這個(gè)函數(shù):在語句被執(zhí)行前,一次或多次調(diào)用sqlite_reset之后,或者在sqlite3_step任何調(diào)用之后不管語句是否完成執(zhí)行

示例:
??? sqlite3_finalize(pStmt);
??? pStmt = NULL;

=====================================================================================

9.sqlite3_close

這個(gè)過程關(guān)閉前面使用sqlite3_open打開的數(shù)據(jù)庫連接,任何與這個(gè)連接相關(guān)的準(zhǔn)備語句必須在調(diào)用這個(gè)關(guān)閉函數(shù)之前被釋放

int sqlite3_close(
??? sqlite3* pDB??? /* 由 sqlite3_open 或基相關(guān)的函數(shù)打開的 SQLite 對(duì)象句柄 */
??? );
說明:
??? 該函數(shù)用來析構(gòu) sqlite3 對(duì)象. 返回 SQLITE_OK 表示對(duì)象被成功析構(gòu), 以及所有相關(guān)的資源被成功回收
應(yīng)用程序必須在關(guān)閉之前 "完成(finalize)" 所有的 "預(yù)編譯語句(prepared statements)", 并且關(guān)閉所有的 "二進(jìn)制句柄綁定(BLOB handle)", 如果在關(guān)閉時(shí)還有未完成的預(yù)編譯語句或二進(jìn)制句柄, 那么函數(shù)返回 SQLITE_BUSY(5).
示例:
??? if(pDB != NULL)
??? {
??????? sqlite3_close(pDB);
??????? pDB = NULL;

??? }


=====================================================================================

10.int sqlite3_exec(
??? sqlite3* pDB,??????? /* sqlite3句柄 */
??? const char* sql,??? /* 被執(zhí)行的 SQL 語句 */
??? int (*callback)(void*,int,char**,char**),? /* 執(zhí)行/查詢回調(diào)函數(shù) */
??? void* pvoid,??? /* 傳遞給回調(diào)函數(shù)的第一個(gè)參數(shù) */
??? char**errmsg??? /* 錯(cuò)誤輸出信息 */
);

說明:
??? 該函數(shù)用來執(zhí)行若干條 SQL 語句.
??? 該函數(shù)包裹了先前版本的 sqlite3_prepare(), sqlte3_step() 和 sqlite3_finalize() 函數(shù), 這樣, 用戶就可以執(zhí)行簡(jiǎn)單的代碼執(zhí)行多條 SQL 語句.
??? sqlite3_exec()接口執(zhí)行多條以";"分隔的SQL語句。
如果回調(diào)函數(shù)不為 NULL, 則它對(duì)每一個(gè)行查詢結(jié)果都會(huì)調(diào)用該回調(diào)函數(shù). 如果沒有回調(diào)函數(shù)被指定, sqlite3_exec() 只是簡(jiǎn)單地忽略查詢結(jié)果.
??? 當(dāng)在執(zhí)行該SQL語句發(fā)生錯(cuò)誤時(shí), 執(zhí)行將發(fā)生中斷, 并且后面的語句也全部被忽略. 如果 errmsg 參數(shù)不為空任何錯(cuò)誤信息將會(huì)被寫進(jìn)由 sqlite3_malloc() 得到的的內(nèi)存空間中, 即 errmsg 指向的內(nèi)存. 為了避免內(nèi)存泄漏, 應(yīng)用程序應(yīng)該在不需要該錯(cuò)誤信息后立即調(diào)用 sqlite3_free() 釋放該內(nèi)存空間. 如果 errmsg 參數(shù)不為 NULL, 并且沒有錯(cuò)誤發(fā)生, errmsg 被設(shè)置為 NULL.
??? 如果回調(diào)函數(shù)返回非零, sqlite3_exec() 立即中斷查詢, 并且不再執(zhí)行后續(xù)的 SQL 語句, 也不再調(diào)用回調(diào)函數(shù), sqlite3_exec() 將返回 SQLITE_ABORT 結(jié)束執(zhí)行.
示例:
??? sqlite3_exec(pDB, to_utf8("delete from tablename where id=123;"), NULL, NULL, NULL);
??? sqlite3_exec(pDB, to_utf8("create table if not exists tablename (id integer primary key,name text);"), NULL, NULL, NULL);
??? sqlite3_exec(pDB, to_utf8("insert into tablename (name) values ('女孩不哭');"), NULL, NULL, NULL);
??? if(sqlite3_exec(pDB, to_utf8("select * from tablename;"), sqlite_callback, NULL, &pszErrMsg) != SQLITE_OK)
??? {
??????? ...
??????? sqlite3_free(pszErrMsg);
??????? pszErrMsg = NULL;
??? }
參閱:在 sqlite3 中使用回調(diào)函數(shù)(http://www.cnblogs.com/nbsofer/archive/2012/05/29/2523807.html)

=====================================================================================

11.int sqlite3_errcode(
??? sqlite3* pDB??? /* SQLite3 數(shù)據(jù)庫句柄 */
);

說明:
??? 該函數(shù)返回最近一次調(diào)用 sqlite3_ API時(shí)產(chǎn)生的錯(cuò)誤碼.
示例:
??? int errcode = sqlite3_errcode(pDB);
=====================================================================================
12.const char *sqlite3_errmsg(
??? sqlite3* pDB??? /* SQLite3 數(shù)據(jù)庫句柄 */
);
說明:
??? 該函數(shù)返回與pDB數(shù)據(jù)庫指針相關(guān)的錯(cuò)誤信息, 由英語書寫.
??? 用戶不必考慮內(nèi)存的釋放, 其由SQLite內(nèi)部管理, 它也將會(huì)在下產(chǎn)次調(diào)用函數(shù)時(shí)被覆蓋.
示例:
??? printf("%s\n", sqlite3_errmsg(pDB));

?

=====================================================================================

13.

int sqlite3_key(
? sqlite3 *db,?????????????????? /* Database to be rekeyed */
? const void *pKey, int nKey???? /* The key */
);
功能:為加密的數(shù)據(jù)庫指定密碼,改函數(shù)在sqlite3_open之后調(diào)用

?

=====================================================================================
14.

int sqlite3_rekey(
? sqlite3 *db,?????????????????? /* Database to be rekeyed */
? const void *pKey, int nKey???? /* The new key */
);
功能:重設(shè)數(shù)據(jù)庫密碼,如果pKey = 0 或者 nKey = 0,這數(shù)據(jù)庫不加密


=====================================================================================

15.

int sqlite3_get_table(
? sqlite3*,?????????????? /* An open database */
? const char *sql,?????? /* SQL to be executed */
? char ***resultp,?????? /* Result written to a char *[]? that this points to */
? int *nrow,???????????? /* Number of result rows written here */
? int *ncolumn,????????? /* Number of result columns written here */
? char **errmsg????????? /* Error msg written here */
);
功能:查詢表
PARAM1(IN):數(shù)據(jù)庫句柄
PARAM2(IN):sql語句,以\0結(jié)尾.
PARAM3(OUT):查詢結(jié)果
PARAM4(OUT):返回行數(shù)(多少條數(shù)據(jù))
PARAM5(OUT):返回列數(shù)(多少字段)
PARAM6(OUT):返回錯(cuò)誤信息
返回值:SQLITE_OK成功,房子失敗見錯(cuò)誤信息

?

=====================================================================================
16.
void sqlite3_free_table(char **result);


功能:釋放通過sqlite3_get_table查詢保存的結(jié)果數(shù)據(jù)
PARAM1(IN):要釋放的數(shù)據(jù)指針


=====================================================================================

17.int sqlite3_create_function(
? sqlite3 *,
? const char *zFunctionName,
? int nArg,
? int eTextRep,
? void*,
? void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
? void (*xStep)(sqlite3_context*,int,sqlite3_value**),
? void (*xFinal)(sqlite3_context*)
);
功能:

const void *sqlite3_value_blob(sqlite3_value*);
int sqlite3_value_bytes(sqlite3_value*);
int sqlite3_value_bytes16(sqlite3_value*);
double sqlite3_value_double(sqlite3_value*);
int sqlite3_value_int(sqlite3_value*);
sqlite_int64 sqlite3_value_int64(sqlite3_value*);
const unsigned char *sqlite3_value_text(sqlite3_value*);
const void *sqlite3_value_text16(sqlite3_value*);
const void *sqlite3_value_text16le(sqlite3_value*);
const void *sqlite3_value_text16be(sqlite3_value*);
int sqlite3_value_type(sqlite3_value*);
int sqlite3_value_numeric_type(sqlite3_value*);
功能:類似sqlite3_column_*函數(shù)






其他:

const char *sqlite3_libversion(void);
int sqlite3_libversion_number(void);
功能:獲取版本號(hào)

sqlite_int64 sqlite3_last_insert_rowid(sqlite3*);
功能:獲取最后插入的行標(biāo)示.

int sqlite3_changes(sqlite3*);
功能:獲取最近執(zhí)行的sqlite3_exec影響的行數(shù).

int sqlite3_total_changes(sqlite3*);
功能:獲取自從數(shù)據(jù)庫打開后有改動(dòng)的函數(shù)

void sqlite3_interrupt(sqlite3*);
功能:打斷或停止數(shù)據(jù)庫當(dāng)前操作.

int sqlite3_complete(const char *sql);
功能:判斷語句是否以分號(hào)(;)結(jié)尾

int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
功能:設(shè)置查詢忙碌時(shí)的回調(diào)處理
說明:缺省的回調(diào)函數(shù)為空,如果回調(diào)函數(shù)為空,表鎖定后sqlite3_exec()執(zhí)行會(huì)直接返回SQLITE_BUSY

int sqlite3_busy_timeout(sqlite3*, int ms);
功能:設(shè)置查詢超時(shí)時(shí)間(毫秒)

?

char *sqlite3_mprintf(const char*,...);
char *sqlite3_vmprintf(const char*, va_list);
char *sqlite3_snprintf(int,char*,const char*, ...);
功能:格式化字符,需要用%q來代替%s.(主要是不用對(duì)分號(hào)'進(jìn)行轉(zhuǎn)義)


void *sqlite3_malloc(int);
void *sqlite3_realloc(void*, int);
void sqlite3_free(void*);
功能:內(nèi)存函數(shù)

int sqlite3_set_authorizer(
? sqlite3*,
? int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
? void *pUserData
);
功能:設(shè)置數(shù)據(jù)庫授權(quán)

void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
void *sqlite3_profile(sqlite3*,
?? void(*xProfile)(void*,const char*,sqlite_uint64), void*);

void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
功能:設(shè)置執(zhí)行回調(diào)函數(shù),sqlite3_exec(),sqlite3_step() ,sqlite3_get_table()時(shí)會(huì)調(diào)用

void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
功能:設(shè)置事務(wù)回調(diào)函數(shù)

int sqlite3_errcode(sqlite3 *db);
const char *sqlite3_errmsg(sqlite3*);
功能:獲取錯(cuò)誤碼和錯(cuò)誤消息

int sqlite3_bind_parameter_count(sqlite3_stmt*);
功能:返回需要綁定的參數(shù)數(shù)目(sql語句中問號(hào)?數(shù)量)

const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
功能:獲取綁定參數(shù)名字,?參數(shù)返回NULL

int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
功能:獲取綁定參數(shù)索引

int sqlite3_clear_bindings(sqlite3_stmt*);
功能:清除綁定的參數(shù)




參考代碼:

#include <stdio.h>
#include "sqlite3.h"

int main(){
??? sqlite3 *db;
??? char *zErrMsg = NULL;
??? int rv;
??? char szSql[128] = { 0 };
??? sqlite3_stmt *stmt;
??? rv = sqlite3_open("test.db", &db);
??? if(rv){

??????? fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
??????? sqlite3_close(db);
??????? return 1;
??? }
??? else
?????? fprintf(stderr,"sqlite3_open OK\n");
?????? //這里查詢時(shí),假定數(shù)據(jù)庫中存在表test,并且有一列為COL1(text類型)
?????? strcpy(szSql,"SELECT COL1 FROM test where COL1=?");
?????? rv = sqlite3_prepare(db, szSql, 128, &stmt, NULL);
?????? if( rv != SQLITE_OK ) {
???????? fprintf(stderr, "sqlite3_prepare(%d): %s\n", rv, sqlite3_errmsg(db));
???????? return -1;
?????? }???
?????? rv = sqlite3_bind_text(stmt, 1, "VALUE1", strlen("VALUE1"), SQLITE_STATIC);
?????? if( rv != SQLITE_OK ) {
???????? fprintf(stderr, "sqlite3_bind_text(%d): %s\n", rv, sqlite3_errmsg(db));
???????? return -1;
?????? }
?????? rv = sqlite3_step(stmt);
?????? if( (rv != SQLITE_OK) && (rv != SQLITE_DONE) && (rv != SQLITE_ROW) ) {
???????? fprintf(stderr, "sqlite3_step(%d): %s\n", rv, sqlite3_errmsg(db));
???????? return -1;
?????? }
?????? while( rv == SQLITE_ROW ){
????????? fprintf(stderr, "result: %s\n", sqlite3_column_text(stmt,0));
????????? rv = sqlite3_step(stmt);
?????? }
?????? rv = sqlite3_finalize(stmt);
?????? if( rv != SQLITE_OK ) {
???????? fprintf(stderr, "sqlite3_finalize(%d): %s\n", rv, sqlite3_errmsg(db));
???????? return -1;
?????? }
?????? sqlite3_close(db);
?????? return 0;
}

=====================================================================================

#include "stdafx.h" #include "sqlite3.h" static int callback( void*NotUsed,intargc, 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 _tmain( int argc, _TCHAR* argv[]) { ?? ???? sqlite3 *db; ???? char *dbPath= "f:/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; }

  輸出的結(jié)果:

ID = 1

UserName = kfqcome

PassWord = 123456

?

ID = 2

UserName = miss wang

PassWord = 654321

?

轉(zhuǎn)載: 點(diǎn)擊打開鏈接

總結(jié)

以上是生活随笔為你收集整理的sqlite3用法详解草稿的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。