sqlite3用法詳解 demo
使用的過程根據使用的函式大致分為如下幾個過程:
- sqlite3_open()
- sqlite3_prepare()
- sqlite3_step()
- sqlite3_column()
- sqlite3_finalize()
- sqlite3_close()
這幾個過程是概念上的說法,而不完全是程式執行的過程,如sqlite3_column()表示的是對查詢獲得一行裡面的資料的列的各個操作統稱,實際上在sqlite中並不存在這個函式。
1. sqlite3_open():開啟資料庫
在操作資料庫之前,首先要開啟資料庫。這個函式開啟一個sqlite資料庫檔案的連線並且返回一個數據庫連線物件。這個操作同時程式中的第一個呼叫的sqlite函式,同時也是其他sqliteapi的先決條件。許多的sqlite介面函式都需要一個數據庫連線物件的指標作為它們的第一個引數。
函式定義
int sqlite3_open(const char*filename, sqlite3**ppDb );
int sqlite3_open16(const void*filename, sqlite3**ppD);
int sqlite3_open_v2(const char*filename, sqlite3**ppDb, intflags,const char*zVfs );
說明:
假如這個要被開啟的資料檔案不存在,則一個同名的資料庫檔案將被建立。如果使用sqlite3_open和sqlite3_open_v2的話,資料庫將採用UTF-8的編碼方式,sqlite3_open16採用UTF-16的編碼方式
返回值:
如果sqlite資料庫被成功開啟(或建立),將會返回SQLITE_OK,否則將會返回錯誤碼。Sqlite3_errmsg()或者sqlite3_errmsg16可以用於獲得資料庫開啟錯誤碼的英文描述,這兩個函式定義為:
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
無論是否成功開啟資料庫, 都應該使用 sqlite3_close() 關閉資料庫連線.
引數說明:
filename:需要被開啟的資料庫檔案的檔名,在sqlite3_open和sqlite3_open_v2中這個引數採用UTF-8編碼,而在sqlite3_open16中則採用UTF-16編碼
ppDb:一個數據庫連線控制代碼被返回到這個引數,即使發生錯誤。唯一的一場是如果sqlite不能分配記憶體來存放sqlite物件,ppDb將會被返回一個NULL值。
flags:作為資料庫連線的額外控制的引數,可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一個,用於控制資料庫的開啟方式,可以和SQLITE_OPEN_NOMUTEX,SQLITE_OPEN_FULLMUTEX, SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE結合使用,具體的詳細情況可以查閱文件
=====================================================================================
2. Sqlite3_prepare()
這個函式將sql文字轉換成一個準備語句(prepared statement)物件,同時返回這個物件的指標。這個介面需要一個數據庫連線指標以及一個要準備的包含SQL語句的文字。它實際上並不執行(evaluate)這個SQL語句,它僅僅為執行準備這個sql語句
函式定義(僅列出UTF-8的)
int sqlite3_prepare(sqlite3*db, const char*zSql, intnByte, sqlite3_stmt**ppStmt, const char**pzTail );int sqlite3_prepare_v2(sqlite3*db, const char*zSql, intnByte, sqlite3_stmt **ppStmt, const char**pzTail);
引數:
db:資料指標
zSql:sql語句,使用UTF-8編碼
nByte:如果nByte小於0,則函式取出zSql中從開始到第一個0終止符的內容;如果nByte不是負的,那麼它就是這個函式能從zSql中讀取的位元組數的最大值。如果nBytes非負,zSql在第一次遇見’/000/或’u000’的時候終止.如果使用者知道被傳入的 sql語句是以 '\0' 結尾的, 那麼有一個更好的做法是:把nbytes的值設為該字串的長度(包含'\0'), 這樣可以避免SQLite 複製該字串的一份拷貝, 以提高程式的效率.
pzTail:上面提到zSql在遇見終止符或者是達到設定的nByte之後結束,假如zSql還有剩餘的內容,那麼這些剩餘的內容被存放到pZTail中,不包括終止符。如果 pszTail 不為 NULL, 則 *pszTail 指向 sql 中第一個被傳入的 SQL語句的結尾. 該函式只編譯 sql 的第一個語句, 所以 *pszTail 指向的內容則是未被編譯的.
ppStmt:能夠使用sqlite3_step()執行的編譯好的準備語句的指標,如果錯誤發生,它被置為NULL,如假如輸入的文字不包括sql語句。呼叫過程必須負責在編譯好的sql語句完成使用後使用sqlite3_finalize()刪除它。
說明
如果執行成功,則返回SQLITE_OK,否則返回一個錯誤碼。推薦在現在任何的程式中都使用sqlite3_prepare_v2這個函式,sqlite3_prepare只是用於前向相容
備註
<1>準備語句(preparedstatement)物件
typedef struct sqlite3_stmtsqlite3_stmt;
準備語句(preparedstatement)物件一個代表一個簡單SQL語句物件的例項,這個物件通常被稱為“準備語句”或者“編譯好的SQL語句”或者就直接稱為“語句”。
語句物件的生命週期經歷這樣的過程:
l 使用sqlite3_prepare_v2或相關的函式建立這個物件
l 使用sqlite3_bind_*()給宿主引數(hostparameters)繫結值
l 通過呼叫sqlite3_step一次或多次來執行這個sql
l 使用sqlite3——reset()重置這個語句,然後回到第2步,這個過程做0次或多次
l 使用sqlite3_finalize()銷燬這個物件
在sqlite中並沒有定義sqlite3_stmt這個結構的具體內容,它只是一個抽象型別,在使用過程中一般以它的指標進行操作,而sqlite3_stmt型別的指標在實際上是一個指向Vdbe的結構體得指標
<2>宿主引數(host parameters)
在傳給sqlite3_prepare_v2()的sql的語句文字或者它的變數中,滿足如下模板的文字將被替換成一個引數:
l ?
l ?NNN,NNN代表數字
l :VVV,VVV代表字元
l @VVV
l $VVV
在上面這些模板中,NNN代表一個數字,VVV代表一個字母數字標記符(例如:222表示名稱為222的標記符),sql語句中的引數(變數)通過上面的幾個模板來指定,如
“select ? from ?“這個語句中指定了兩個引數,sqlite語句中的第一個引數的索引值是1,這就知道這個語句中的兩個引數的索引分別為1和2,使用”?”的話會被自動給予索引值,而使用”?NNN”則可以自己指定引數的索引值,它表示這個引數的索引值為NNN。”:VVV”表示一個名為”VVV”的引數,它也有一個索引值,被自動指定。
例子:
INSERT INTO people (id, name) VALUES ( ?, ? );
INSERT INTO people (id,id2,name) VALUES ( ?1, ?1.?2);作用:可以用同一個值繫結幾個變數
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變數的擴充套件語法,除非使用Tcl程式設計,否則推薦使用“:”版本。
可以使用sqlite3_bind_*()來給這些引數繫結值
=====================================================================================
3.
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, intn,void(*)(void*));
sqlite3_bind_*系列函式有好多,這裡只對sqlite3_bind_text進行一下說明,sqlite3_bind_text的第二個引數為序號(從1開始),第三個引數為字串值,第四個引數為字串長度。sqlite3_bind_text的第五個引數為一個函式指標,SQLITE3執行完操作後回撥此函式,通常用於釋放字串佔用的記憶體。此引數有兩個常數,SQLITE_STATIC告訴sqlite3_bind_text函式字串為常量,可以放心使用;而SQLITE_TRANSIENT會使得sqlite3_bind_text函式對字串做一份拷貝。一般使用這兩個常量引數來調sqlite3_bind_text。statement準備好了以後,就是操作的執行了。
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n,void(*)(void*));功能:為查詢結構體繫結資料
PARAM1(IN):查詢結構體
PARAM2(IN):繫結第幾個資料(sql語句中的第幾個問號(?))
PARAM3(IN):二進位制資料指標
PARAM4(IN):二進位制資料長度
PARAM5(IN):析構回撥函式,通常設定NULL,結束後自己釋放
返回值:SQLITE_OK成功.
說明:繫結函式必須要在sqlite3_step前,sqlite3_prepare或者sqlite3_reset之後呼叫.
未繫結的引數預設為NULL,類似的繫結函式還有以下
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()
這個過程用於執行有前面sqlite3_prepare建立的準備語句。這個語句執行到結果的第一行可用的位置。繼續前進到結果的第二行的話,只需再次呼叫sqlite3_setp()。繼續呼叫sqlite3_setp()知道這個語句完成,那些不返回結果的語句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只執行一次就返回
函式定義
int sqlite3_step(sqlite3_stmt*);
返回值
函式的返回值基於建立sqlite3_stmt引數所使用的函式,假如是使用老版本的介面sqlite3_prepare()和sqlite3_prepare16(),返回值會是 SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR或 SQLITE_MISUSE,而v2版本的介面sqlite3_prepare_v2()和sqlite3_prepare16_v2()則會同時返回這些結果碼和擴充套件結果碼。
對所有V3.6.23.1以及其前面的所有版本,需要在sqlite3_step()之後呼叫sqlite3_reset(),在後續的sqlite3_ step之前。如果呼叫sqlite3_reset重置準備語句失敗,將會導致sqlite3_step返回SQLITE_MISUSE,但是在V3.6.23.1以後,sqlite3_step()將會自動呼叫sqlite3_reset。
說明:
當一條語句被sqlite3_prepare() 或其相關的函式預編譯後, sqlite3_step()必須被呼叫一次或多次來評估該預編譯語句.
該函式的詳細行為依賴於由sqlite3_prepare()(或其相關的函式) 產生的是一條怎樣的預編譯語句.
函式將返回一個以下的結果來標識其執行結果:
SQLITE_BUSY:忙碌. 資料庫引擎無法鎖定資料去完成其工作. 但可以多次嘗試.
SQLITE_DONE:完成. sql 語句已經被成功地執行. 在呼叫 sqlite_reset() 之前, 當前預編譯的語句不應該被sqlite3_step() 再次呼叫.
SQLITE_ROW:查詢時產生了結果. 此時可以通過相關的"資料訪問函式(column accessfunctions)"來取得資料. sqlite3_step() 的再一次呼叫將取得下一條查詢結果.
SQLITE_ERROR:發生了錯誤. 此時可以通過 sqlite3_errmmsg() 取得相關的錯誤資訊.sqlite3_step() 不能被再次呼叫.
SQLITE_MISUSE:不正確的庫的使用. 該函式使用不當.
其它:
有關預編譯的使用,將在以後的函式介紹中詳細說明.
=====================================================================================
5.int sqlite3_reset(sqlite3_stmt *pStmt);
sqlite3_reset用於重置一個準備語句物件到它的初始狀態,然後準備被重新執行。所有sql語句變數使用sqlite3_bind*繫結值,使用sqlite3_clear_bindings重設這些繫結。Sqlite3_reset介面重置準備語句到它程式碼開始的時候。sqlite3_reset並不改變在準備語句上的任何繫結值,那麼這裡猜測,可能是語句在被執行的過程中發生了其他的改變,然後這個語句將它重置到繫結值的時候的那個狀態。
它的返回值相對有些特殊。返回SQLITE_BUSY表示暫時無法執行操作,SQLITE_DONE表示操作執行完畢,SQLITE_ROW表示執行完畢並且有返回(執行select語句時)。當返回值為SQLITE_ROW時,我們需要對查詢結果進行處理,SQLITE3提供sqlite3_column_*系列函式。const unsigned char *sqlite3_column_text(sqlite3_stmt*, intiCol);
其中引數iCol為列的序號,從0開始。如果返回值有多行,則可以再次呼叫sqlite3_step函式,然後由sqlite3_column_*函式取得返回值。使用上述這些函式基本上可以完成對SQLITE3資料庫的操作了(不過我這裡只針對text資料型別做了說明)。=====================================================================================
6. sqlite3_column()
這個過程從執行sqlite3_step()執行一個準備語句得到的結果集的當前行中返回一個列。每次sqlite3_step得到一個結果集的列停下後,這個過程就可以被多次呼叫去查詢這個行的各列的值。對列操作是有多個函式,均以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*, intiCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);
int sqlite3_column_numeric_type(sqlite3_stmt*, intiCol);
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, intiCol);
說明
第一個引數為從sqlite3_prepare返回來的preparedstatement物件的指標,第二引數指定這一行中的想要被返回的列的索引。最左邊的一列的索引號是0,行的列數可以使用sqlite3_colum_count()獲得。
這些過程會根據情況去轉換數值的型別,sqlite內部使用sqlite3_snprintf()去自動進行這個轉換,下面是關於轉換的細節表:
內部型別 |
請求的型別 |
轉換 |
NULL |
INTEGER |
結果是0 |
NULL |
FLOAT |
結果是0.0 |
NULL |
TEXT |
結果是NULL |
NULL |
BLOB |
結果是NULL |
INTEGER |
FLOAT |
從整形轉換到浮點型 |
INTEGER |
TEXT |
整形的ASCII碼顯示 |
INTEGER |
BLOB |
同上 |
FLOAT |
INTEGER |
浮點型轉換到整形 |
FLOAT |
TEXT |
浮點型的ASCII顯示 |
FLOAT |
BLOB |
同上 |
TEXT |
INTEGER |
使用atoi() |
TEXT |
FLOAT |
使用atof() |
TEXT |
BLOB |
沒有轉換 |
BLOB |
INTEGER |
先到TEXT,然後使用atoi |
BLOB |
FLOAT |
先到TEXT,然後使用atof |
BLOB |
TEXT |
如果需要的話新增0終止符 |
注:BLOB資料型別是指二進位制的資料塊,比如要在資料庫中存放一張圖片,這張圖片就會以二進位制形式存放,在sqlite中對應的資料型別就是BLOB
int sqlite3_column_bytes(sqlite3_stmt*, int iCol)intsqlite3_column_bytes16(sqlite3_stmt*, intiCol)兩個函式返回對應列的內容的位元組數,這個位元組數不包括後面型別轉換過程中加上的0終止符。
下面是幾個最安全和最簡單的使用策略
- 先sqlite3_column_text() ,然後 sqlite3_column_bytes()
- 先sqlite3_column_blob(),然後sqlite3_column_bytes()
- 先sqlite3_column_text16(),然後sqlite3_column_bytes16()
得到資料行中某個列的資料 sqlite3_column_xxx(sqlite3_stmt*, int iCol); 在sqlite3_step返回SQLITE_ROW後,使用它得到第iCol列的資料。 其中的xxx代表: blob:指向儲存資料記憶體的指標 bytes, bytes16: 得到該blob型別資料的大小,或者text轉換為UTF8/UTF16的字串長度。 double, int, int64: 數值 text,text16:字串指標 type:該列的資料型別(SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL) 注意:如果對該列使用了不同與該列本身型別適合的資料讀取方法,得到的數值將是轉換過的結果。
(2)
得到資料行中某個列的資料的型別 int sqlite3_column_type(sqlite3_stmt*, int iCol); 返回值:SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL 使用的方法和sqlite3_column_xxx()函式類似。
(3)
int sqlite3_column_count(sqlite3_stmt *pStmt);
功能:獲取列數
如果過程沒有返回值,如update,將返回0
const char *sqlite3_column_name(sqlite3_stmt*,int);
功能:獲取列名
const char *sqlite3_column_decltype(sqlite3_stmt *, inti);
功能:返回列資料型別
類似:
得到當前行中包含的資料個數 int sqlite3_data_count(sqlite3_stmt *pStmt); 如果sqlite3_step返回SQLITE_ROW,可以得到列數,否則為零。
=====================================================================================
7.int sqlite3_reset(sqlite3_stmt *pStmt);
功能:重置所有繫結的值,回到剛剛呼叫sqlite3_prepare後的狀態
=====================================================================================
8.sqlite3_finalize
int sqlite3_finalize(sqlite3_stmt *pStmt);
這個過程銷燬前面被sqlite3_prepare建立的準備語句,每個準備語句都必須使用這個函式去銷燬以防止記憶體洩露。
在空指標上呼叫這個函式沒有什麼影響,同時可以準備語句的生命週期的任一時刻呼叫這個函式:在語句被執行前,一次或多次呼叫sqlite_reset之後,或者在sqlite3_step任何呼叫之後不管語句是否完成執行
示例:sqlite3_finalize(pStmt);
pStmt =NULL;
=====================================================================================
9.sqlite3_close
這個過程關閉前面使用sqlite3_open開啟的資料庫連線,任何與這個連線相關的準備語句必須在呼叫這個關閉函式之前被釋放
int sqlite3_close(
sqlite3*pDB
);
說明:
該函式用來析構sqlite3 物件. 返回 SQLITE_OK 表示物件被成功析構, 以及所有相關的資源被成功回收
應用程式必須在關閉之前 "完成(finalize)" 所有的 "預編譯語句(prepared statements)",並且關閉所有的 "二進位制控制代碼繫結(BLOB handle)", 如果在關閉時還有未完成的預編譯語句或二進位制控制代碼, 那麼函式返回SQLITE_BUSY(5).
示例:
if(pDB !=NULL)
{
sqlite3_close(pDB);
pDB = NULL;
}
=====================================================================================
10.int sqlite3_exec(
sqlite3*pDB,
const char*sql,
int(*callback)(void*,int,char**,char**),
void*pvoid,
char**errmsg
);
說明:
該函式用來執行若干條SQL 語句.
該函式包裹了先前版本的sqlite3_prepare(), sqlte3_step() 和 sqlite3_finalize() 函式, 這樣,使用者就可以執行簡單的程式碼執行多條 SQL 語句.
sqlite3_exec()介面執行多條以";"分隔的SQL語句. 如果回撥函式不為 NULL,則它對每一個行查詢結果都會呼叫該回調函式. 如果沒有回撥函式被指定, sqlite3_exec()只是簡單地忽略查詢結果.
當在執行該SQL語句發生錯誤時, 執行將發生中斷, 並且後面的語句也全部被忽略. 如果 errmsg引數不為空任何錯誤資訊將會被寫進由 sqlite3_malloc() 得到的的記憶體空間中, 即 errmsg 指向的記憶體.為了避免記憶體洩漏, 應用程式應該在不需要該錯誤資訊後立即呼叫 sqlite3_free() 釋放該記憶體空間. 如果 errmsg引數不為 NULL, 並且沒有錯誤發生, errmsg 被設定為 NULL.
如果回撥函式返回非零,sqlite3_exec() 立即中斷查詢, 並且不再執行後續的 SQL 語句, 也不再呼叫回撥函式, sqlite3_exec()將返回 SQLITE_ABORT 結束執行.
示例:
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 (idinteger 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中使用回撥函式(http://www.cnblogs.com/nbsofer/archive/2012/05/29/2523807.html)
=====================================================================================
11.int sqlite3_errcode(
sqlite3*pDB
);
說明:
該函式返回最近一次呼叫sqlite3_ API時產生的錯誤碼.
示例:
int errcode= sqlite3_errcode(pDB);
=====================================================================================
12.const char *sqlite3_errmsg(
sqlite3*pDB
);
說明:
該函式返回與pDB資料庫指標相關的錯誤資訊, 由英語書寫.
使用者不必考慮記憶體的釋放,其由SQLite內部管理, 它也將會在下產次呼叫函式時被覆蓋.
示例:
printf("%s\n", sqlite3_errmsg(pDB));
13.
=====================================================================================
int sqlite3_key(
sqlite3*db,
const void *pKey, intnKey
);
功能:為加密的資料庫指定密碼,改函式在sqlite3_open之後呼叫
14.
=====================================================================================
int sqlite3_rekey(
sqlite3*db,
const void *pKey, intnKey
);
功能:重設資料庫密碼,如果pKey = 0 或者 nKey = 0,這資料庫不加密
=====================================================================================
15.
=====================================================================================
int sqlite3_get_table(
sqlite3*,
const char*sql,
char***resultp,
int*nrow,
int*ncolumn,
char**errmsg
);
功能:查詢表
PARAM1(IN):資料庫控制代碼
PARAM2(IN):sql語句,以\0結尾.
PARAM3(OUT):查詢結果
PARAM4(OUT):返回行數(多少條資料)
PARAM5(OUT):返回列數(多少欄位)
PARAM6(OUT):返回錯誤資訊
返回值:SQLITE_OK成功,房子失敗見錯誤資訊
16.
=====================================================================================
void sqlite3_free_table(char **result);
功能:釋放通過sqlite3_get_table查詢儲存的結果資料
PARAM1(IN):要釋放的資料指標
=====================================================================================
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_*函式
其他:
const char *sqlite3_libversion(void);
int sqlite3_libversion_number(void);
功能:獲取版本號
sqlite_int64 sqlite3_last_insert_rowid(sqlite3*);
功能:獲取最後插入的行標示.
int sqlite3_changes(sqlite3*);
功能:獲取最近執行的sqlite3_exec影響的行數.
int sqlite3_total_changes(sqlite3*);
功能:獲取自從資料庫開啟後有改動的函式
void sqlite3_interrupt(sqlite3*);
功能:打斷或停止資料庫當前操作.
int sqlite3_complete(const char *sql);
功能:判斷語句是否以分號(;)結尾
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int),void*);
功能:設定查詢忙碌時的回撥處理
說明:預設的回撥函式為空,如果回撥函式為空,表鎖定後sqlite3_exec()執行會直接返回SQLITE_BUSY
int sqlite3_busy_timeout(sqlite3*, int ms);
功能:設定查詢超時時間(毫秒)
char *sqlite3_mprintf(const char*,...);
char *sqlite3_vmprintf(const char*, va_list);
char *sqlite3_snprintf(int,char*,const char*, ...);
功能:格式化字元,需要用%q來代替%s.(主要是不用對分號'進行轉義)
void *sqlite3_malloc(int);
void *sqlite3_realloc(void*, int);
void sqlite3_free(void*);
功能:記憶體函式
int sqlite3_set_authorizer(
sqlite3*,
int (*xAuth)(void*,int,const char*,constchar*,const char*,const char*),
void *pUserData
);
功能:設定資料庫授權
void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*),void*);
void *sqlite3_profile(sqlite3*,
void(*xProfile)(void*,constchar*,sqlite_uint64), void*);
void sqlite3_progress_handler(sqlite3*, int, int(*)(void*),void*);
功能:設定執行回撥函式,sqlite3_exec(),sqlite3_step(),sqlite3_get_table()時會呼叫
void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
功能:設定事務回撥函式
int sqlite3_errcode(sqlite3 *db);
const char *sqlite3_errmsg(sqlite3*);
功能:獲取錯誤碼和錯誤訊息
int sqlite3_bind_parameter_count(sqlite3_stmt*);
功能:返回需要繫結的引數數目(sql語句中問號?數量)
const char *sqlite3_bind_parameter_name(sqlite3_stmt*,int);
功能:獲取繫結引數名字,?引數返回NULL
int sqlite3_bind_parameter_index(sqlite3_stmt*, const char*zName);
功能:獲取繫結引數索引
int sqlite3_clear_bindings(sqlite3_stmt*);
功能:清除繫結的引數
參考程式碼:
#include
#include "sqlite3.h"
int main(){
sqlite3*db;
char*zErrMsg = NULL;
intrv;
charszSql[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");
//這裡查詢時,假定資料庫中存在表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,
int
argc,
char
**argv,
char
**azColName)
{
int
i;
for
(i=0; 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
(
"%serror!/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 tableUserInfo(ID int primary key , UserName char, PassWordchar);"
;
rc=sqlite3_exec(db,szSql,0,0,&szErrMsg);
CHECK_RC(rc,
"create table"
,szErrMsg,db);
rc=sqlite3_exec(db,
"insert intoUserInfo(ID,UserName,PassWord)values(1,'kfqcome','123456')"
,0,0,&szErrMsg);
CHECK_RC(rc,
"insert info"
,szErrMsg,db);
rc=sqlite3_exec(db,
"insert intoUserInfo(ID,UserName,PassWord) values(2,'misswang','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;
}
輸出的結果:
ID = 1
UserName = kfqcome
PassWord = 123456
ID = 2
UserName = miss wang
PassWord = 654321