zoukankan      html  css  js  c++  java
  • C/C++之SQLite常用函数

    C/C++之SQLite常用函数 - 简单的日志 - 网易博客

    C/C++之SQLite常用函数   

     

    2010-06-03 15:43:06|  分类:
    C/C++之SQLite
    |  标签: 

    |字号  订阅

    1 、打开数据库:
    说明:打开一个数据库,文件名不一定要存在,如果此文件不存在, sqlite 会自动创建。第一个参数指文件名,第二个参数则是定义的 sqlite3 ** 结构体指针(关键数据结构),这个结构底层细节如何,您不用管它。
    int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb           /* OUT: SQLite db handle */
    );  
    返回值:表示操所是否正确( SQLITE_OK 操作正常)

    2、关闭数据库:
    说明:如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
    int sqlite3_close(sqlite3*);   // 参数就是刚才的结构体,也就是数据库句柄
    //注意在此出错后,可以用sqlite3_errmsg(db)来获得错误代码

    3 、执行 SQL 语句:
    说 明:这个函数的功能是执行一条或者多条 SQL语句,SQL 语句之间用 “;” 号隔开。建议在执行一条或者多条 SQL 语句得时候,指定第三个参数回调函数,在 回调函数中可以获得执行 Sql 得详细过程,如果所有 Sql 执行完毕则应该返回 0 ,否则,则说明这次执行并没有完全成功。第五个参数:如果执行失败(没有返回 0 )则可以查看第五个阐述得值。来查看详细错误信息。
    int sqlite3_exec(
        sqlite3*,             /* 已经打开的数据库句柄 */
        const char *sql,   /* 要执行的 Sql 语句 */
        sqlite_callback,    /* 回调函数 */
        void *,               /* 传递给回调函数的参数 */
        char **errmsg    /* 保存错误信息,注意用sqlite3_free(errmsg)来释放资源 */
    );
    通常sqlite3_callback和后面的void*这两个位置都可以填 NULL,表示不需要回调。比如您做 insert,update,delete操作,就没有必要使用回调。而当作select时,就要使用回调,因为 sqlite3把数据查出来,得通过回调告诉你查出了什么数据。

    4 、 exec 的回调
    typedef int (*sqlite3_callback)(void* data, int col_count, char** col_value, char** col_name);
    说明:你的回调函数必须定义为上面这个函数的类型。
    // select_callback是select的回调函数
    // @data : 是sqlite3_exec()中的第四个参数
    // @col_count : 选择出来的列的个数
    // @col_values: 每条记录每一列的数值
    // @col_Name : 每一列的列名
    static int select_callback(void * data, int col_count, char ** col_values, char ** col_Name)

    #include "../sqlite3_lib/sqlite3.h"  // 头文件
    #pragma comment(lib, "../sqlite3_lib/sqlite3.lib") // lib静态库
    
    // select_callback是select的回调函数
    // @data : 是sqlite3_exec()中的第四个参数
    // @col_count : 选择出来的列的个数
    // @col_values: 每条记录每一列的数值
    // @col_Name : 每一列的列名
    static int select_callback(void * notused, int argc, char ** values, char ** colName)
    {
        // 每条记录回调一次该函数,有多少条就回调多少次
        int i;
        for ( i=0; i < argc; i++ )
        {
            printf( "%s = %s\n", colName[i], values[i] == 0 ? "NUL" : values[i] );
        }
        
        return 0;
    }
    
    int main(int argc, char * argv[])
    {
        const char * sSQL1 = "create table users(userid varchar(20) PRIMARY KEY, age int, birthday datetime);";
        char * pErrMsg = 0;
    
    
        // 连接数据库
        sqlite3 * db = 0;
        int ret = sqlite3_open("./test.db", &db);
        if ( ret != SQLITE_OK )
        {
            fprintf(stderr, "无法打开数据库: %s", sqlite3_errmsg(db));
            return(1);
        }
        printf("数据库连接成功!\n");
        
    
        // 执行建表SQL
        sqlite3_exec( db, sSQL1, 0, 0, &pErrMsg );
        if ( ret != SQLITE_OK )
        {
            fprintf(stderr, "SQL error: %s\n", pErrMsg);
            sqlite3_free(pErrMsg);
        }
        
    
        // 执行插入记录SQL
        sqlite3_exec( db, "insert into users values('张三',20,'2001-5-4');", 0, 0, &pErrMsg);
        sqlite3_exec( db, "insert into users values('李四',20,'1970-5-4');", 0, 0, &pErrMsg);
    
    
        // 查询数据表
        sqlite3_exec( db, "select * from users;", select_callback, 0, &pErrMsg);
    
    
        // 关闭数据库
        sqlite3_close(db);
        db = 0;
        
        return 0;
    }

    5 、取当前插入位置:

    long long int sqlite3_last_insert_rowid(sqlite3*);


    功能:返回你前一次插入得位置,从1开始,sqlite3*为你打开数据库所得到得句柄。

    6、非回调select查询:

    功能:执行一次查询 Sql 并且返回得到一个记录集。


    int sqlite3_get_table(


        sqlite3*,        /* 已经打开的数据库句柄 */


        const char *sql, /* 要执行的 Sql 语句 */


        char ***resultp, /* 保存返回记录集的指针 */


        int *nrow,       /* 返回记录数(多少行) */


        int *ncolumn,    /* 返回字段数(多少列) */


        char **errmsg    /* 返回错误信息 */


    )


    说明:第三个参数是查询结果,它是一维数组,内存布局为(n行m列结果),那么数组的0到m-1行是列名,m到2*m-1是记录集的第一行数据,以后的以此类推;

    #include "../sqlite3_lib/sqlite3.h"  // 头文件
    #pragma comment(lib, "../sqlite3_lib/sqlite3.lib") // lib静态库
    int main( int , char ** )
    {
        sqlite3 * db;
        int result;
        char * errmsg = NULL;
        char **dbResult;
        int nRow, nColumn;
        int i , j;
        int index;
    
        // 打开数据库
        result = sqlite3_open( "./test.db", &db );
        if( result != SQLITE_OK )
        {
            return -1;
        }
    
        // 数据库操作代码
        // 假设前面已经创建了 MyTable_1 表
        // 开始查询,传入的dbResult已经是char**,这里又加了一个&取地址符,传递进去的就成了char***
        result = sqlite3_get_table( db, "select * from users;", &dbResult, &nRow, &nColumn, &errmsg );
        if( SQLITE_OK == result )
        {
            // 查询成功 
            printf( "查到 %d 条记录,ncolumn=%d \n", nRow, nColumn);
            for( i = 1; i <= nRow ; i++ )
            {
                printf( "第 %d 条记录 \n", i );
                for( j = 0 ; j < nColumn; j++ )
                {
                    printf( " 字段名 :%s > 字段值 :%s\n", dbResult[j], dbResult[i*nColumn + j] );
                    // dbResult的字段值是连续的,从第0索引到第nColumn-1索引都是字段名称,从第nColumn索引开始,
                    //   后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示 
                }
                printf( "-------\n" );
            }
        }
    
        // 到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放 
        sqlite3_free_table( dbResult );
    
        // 关闭数据库 
        sqlite3_close( db );
        return 0;
    }

    7 、释放查询结果:

    功能:释放当前查询的记录集所占用的内存


    void sqlite3_free_table(char **result);

  • 相关阅读:
    CLR线程池基础
    何时使用线程
    【转】PowerShell入门(十一):编写脚本模块
    【转】PowerShell入门(十):使用配置文件
    【转】PowerShell入门(九):访问.Net程序集、COM和WMI
    【转】PowerShell入门(八):函数、脚本、作用域
    【转】PowerShell入门(七):管道——在命令行上编程
    【转】PowerShell入门(六):远程操作
    【转】PowerShell入门(五):Cmd命令与PowerShell命令的交互
    【转】PowerShell入门(四):如何高效地使用交互式运行环境?
  • 原文地址:https://www.cnblogs.com/lexus/p/2437440.html
Copyright © 2011-2022 走看看