zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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, "
    ");  
        return 0;  
    }  

    说明:对sqlite3_exec()执行结果中查询到的每条记录调用callback()函数。

       每条记录的相应字段值存放于values数组,表头存放于headers数组,可以完成相应数据处理。

  • 相关阅读:
    extjs2.0
    抽象类和接口的选择
    获得汉字字符串的首字母
    快速找回桌面快捷方式
    vs2008破解90天限制
    SQL Server索引的使用和优化
    SQL Server 索引结构及其使用
    桥接模式(Bridge)体验
    vs2008 Working with jQuery
    利用索引来提高速度
  • 原文地址:https://www.cnblogs.com/YSPXIZHEN/p/5814251.html
Copyright © 2011-2022 走看看