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語句
得到結果集,可通過回調函數輸出
有回調函數
這就是執行一條sql 語句的函數。
第1個參數不再說了,是前面open函數得到的指針。說了是關鍵數據結構。
第2個參數constchar*sql是一條sql 語句,以\0結尾。
第3個參數sqlite3_callback 是回調,當這條語句執行之后,sqlite3會去調用你提供的這個函數。
第4個參數void*是你所提供的指針,你可以傳遞任何一個指針參數到這里,這個參數最終會傳到回調函數里面,如果不需要傳遞指針給回調函數,可以填NULL。等下我們再看回調函數的寫
法,以及這個參數的使用。
第5個參數char** errmsg 是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執行sqlite3_exec 之后,執行失敗時可以查閱這個指針(直接cout<<errmsg得到一串字符串信息,這串信息告訴你錯在什么地方。sqlite3_exec函數通過修改你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就可以通過這個char*得到具體錯誤提示。
說明:通常,sqlite3_callback 和它后面的void*這兩個位置都可以填NULL。填NULL表示你不需要回調。比如你做insert 操作,做delete操作,就沒有必要使用回調。而當你做select 時,就要使用回調,因為sqlite3 把數據查出來,得通過回調告訴你查出了什么數據。
回調函數格式
int sqlite_callback(
void* pv, /* 由 sqlite3_exec() 的第四個參數傳遞而來 */
int argc, /* 表的列數 */
char** argv, /* 指向查詢結果的指針數組, 可以由 sqlite3_column_text() 得到 */ //列內容
char** col /* 指向表頭名的指針數組, 可以由 sqlite3_column_name() 得到 */ //列名
);
參數格式:
傳給sqlite3_exec的回調函數,用來顯示查詢結果
對每一條查詢結果調用一次該回調函數
參數:
pv:由sqlite3_exec傳遞的初始化參數
argc:表頭的列數
col:表頭的名字數組指針
argv:表頭的數據數組指針
返回值:
1:中斷查找
0:繼續列舉查詢到的數據
示例表:
+-----------------------------------+
| id | pic | data(16進制數據) |
|-----------------------------------|
| 1 | a.jpg | 00 00 00 ... |
|-----------------------------------|
| 2 | b.jpg | XX XX XX |
+-----------------------------------+
對第一行數據:
argc=3 即 [0]...[2]
argv[0]="1",argv[1]="a.jpg",argv[2]="00 00 00..."(實際16進制數據,非這里顯示的字符串形式)
col[0]="id",col[1]="pic",col[2]="data"
說明:
sqlite3_exec() 的回調函數必須按照此格式, 當然形參的名字任意.
如果某列的數據類型不是char*, 則可以對結果執行相關的轉換, 如:用atoi()把結果轉換為整數(integer), 如果是二進制數據, 則可以直接強制類型轉換, 如:(void*)argv[i].
該回調函數有兩種返回值類型.
1.返回零:sqlite3_exec() 將繼續執行查詢.
2.返回非零:sqlite3_exec()將立即中斷查詢, 且 sqlite3_exec() 將返回 SQLITE_ABORT.
示例:
int i;
for(i=0; i<argc; i++)
{
printf("%s\t%s\n\n", col[i], argv[i]);
}
return 0;