sqlite3用法详解草稿
使用的過程根據(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_NOMUTEX,SQLITE_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í)行了。
功能:為查詢結(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)。
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()
(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ù)
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;
}
=====================================================================================
輸出的結(jié)果:
ID = 1
UserName = kfqcome
PassWord = 123456
?
ID = 2
UserName = miss wang
PassWord = 654321
?
轉(zhuǎn)載: 點(diǎn)擊打開鏈接總結(jié)
以上是生活随笔為你收集整理的sqlite3用法详解草稿的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stm32CubeMX新建工程-芯片ST
- 下一篇: 5349. 安排电影院座位