SQLite源程序分析之回叫機制


1.SQL訪問數據庫非常方便,只需簡單的三個函數:
  sqlite3_open(char* szDbFileName, sqlite3 ** db) 
  sqlite3_exec(sqlite3 *db, char* szSqlCMD, callback, 0, char **zErrMsg)
  sqlite3_close(sqlite3 *db)
  static int callback(void *NotUsed, int argc, char **argv, char **azColName)
2.sqlite3_exec(),執行SQL命令:
 
        
int sqlite3_exec(   
    sqlite3* db,     /* An open database */   
    const char *sql, /* SQL to be executed */ sqlite_callback, /* Callback function 回調函數名*/ void *data /* 1st argument to callback function 傳給回調函數的第一個參數*/ char **errmsg /* Error msg written here */ ); 
 
        

  sqlite3_exec()包含一個回叫(callback)機制,提供了一種從SELECT語句得到結果的方法。

  sqlite3_exec()函數第3個參數是一個指向回叫函數的指針,如果提供了回叫函數,SQLite則會在執行SELECT語句時為遇到的每一條記錄都調用回叫函數,即sqlite3_exec()執行一條SQL語句,每返回一個結果,就執行一次sqlite_callback函數,方便我們對查詢到的數據進行處理。

3.callback()即回叫函數,傳給sqlite3_exec的回調函數,用來顯示查詢結果,對每一條查詢結果調用一次該回調函數:
typedef int (*sqlite3_callback)(   
    void* data,     /* Data provided in the 4th argument of sqlite3_exec() 由sqlite3_exec()的第4個參數傳遞*/   
    int ncols,      /* The number of columns in row 查詢語句返回的字段數目,即表頭列數*/   
    char** values,  /* An array of strings representing fields in the row 查詢到的一條記錄的各字段值,包含查找到的所有數據*/   
    char** headers  /* An array of strings representing column names 對應列的字段名*/ ); 

參數

  data:sqlite3_exec()傳入的第四個參數(this指針),通過data參數,可以傳入一些特殊的指針(如類指針、結構指針),然后在這里強制轉換成對應的類型(這里是void*類型,必須強制轉換成該類型才可用)。sqlite3_exec()和callback()都具有這個形式參數,此參數用處巨大,可以傳遞一個對象的指針給callback函數,再把void* 強制轉換成原來的類型,進行一些操作,比如壓棧。
  values:是查詢記錄的數據數組指針,指向查詢結果的指針數組, 可以由 sqlite3_column_text() 得到。
  headers:是表頭的列名數組指針,指向表頭名的指針數組, 可以由 sqlite3_column_name() 得到。

返回值為0或1:

  返回零:sqlite3_exec()將繼續執行查詢。
  返回非零:sqlite3_exec()將立即中斷查詢,且sqlite3_exec()將返回SQLITE_ABORT。

回調函數傳參示例

Table
ID    NAME    ADDRESS    AGE
1     YSP     ShangHai   22
2     HHB     ShangHai   25

select * from Table 查詢到第一條記錄,回叫函數被調用一次:   ncols = 4 (總共4個字段)   values[0]:“1”;values[1]:“YSP”;values[2]:“ShangHai”;values[3]:“22” 
  headers[0]:“ID”;headers[1]:“NAME”;headers[2]:“ADDRESS”;headers[3]:“AGE”

查詢到第二條記錄,回叫函數被調用第二次:
  ncols = 4 (總共4個字段)
  values[0]:“1”;values[1]:HHB;values[2]:ShangHai;values[3]:25
  headers[0]:ID;headers[1]:NAME;headers[2]:ADDRESS;headers[3]:AGE

注意:sqlite3_exec()查詢到的值都是char*類型,可能需要做類型轉換,以滿足要求。

   如果某列的數據類型不是char*, 則可以對結果執行相關的轉換, 如:用atoi()把結果轉換為整數(integer), 如果是二進制數據, 則可以直接強制類型轉換, 如:(void*)values[i]。

程序示例:

#include <stdio.h>  
#include <stdlib.h> #include "util.h" #pragma comment(lib, "sqlite3.lib") int callback(void* data, int ncols, char** values, char** headers); int main(int argc, char **argv) { sqlite3 *db; int rc; char *sql; char *zErr; char* data; rc = sqlite3_open("test.db", &db); if(rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } data = "Callback function called"; sql = "insert into episodes (name, cid) values ('Mackinaw Peaches', 1);" "select * from episodes;"; rc = sqlite3_exec(db, sql, callback, data, &zErr); if(rc != SQLITE_OK) { if (zErr != NULL) { fprintf(stderr, "SQL error: %s\n", zErr); sqlite3_free(zErr); } } sqlite3_close(db); return 0; } int callback(void* data, int ncols, char** values, char** headers) { int i; fprintf(stdout, "%s: ", (const char*)data); for(i=0; i < ncols; i++) { fprintf(stdout, "%s=%s ", headers[i], values[i]); } fprintf(stdout, "\n"); return 0; } 

說明:對sqlite3_exec()執行結果中查詢到的每條記錄調用callback()函數。

   每條記錄的相應字段值存放於values數組,表頭存放於headers數組,可以完成相應數據處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM