sqlite操作实例

后面的链接是对各个函数的理论介绍,建议互相结合来看点击打开链接

实例1

          有回调函数的操作实例

#include <stdio.h>
#include <sqlite3.h>

int load_my_info(void *para, int n_column, char **column_value, char **column_name)
{
    /* para是在sqlite3_exec里传入的 void* 参数
     * 通过para参数,可以传入一些特殊的指针(比如类指针、结构指针),
     * 然后在这里面强制转换成对应的类型,然后操作这些数据
     */
    /* n_column 是这一条记录有多少个字段(多少列)*/
    /* char **column_value
     * 是个关键值,查出来的数据都保存在这里,它实际上是1维数组(非二维),
     * 每一个元素都是一个 char * 值,是一个字段内容
     */
    /* char ** column_name 跟 column_value 是对应的,表示这个字段的名称 */

    /* 此处,不使用para参数 */

    int i;

    printf ("记录包含%d个字段\n", n_column);

    for (i = 0; i < n_column; i++)
    {
        printf ("字段名:%s\n\t字段值:%s\n", column_name[i], column_value[i]);
    }

    printf ("------------------------\n");

    return 0;
}

int main(int argc, const char *argv[])
{
    sqlite3 *db;
    int result;
    char *errmsg = NULL;

    result = sqlite3_open ("/home/linux/sqlite_test.db", &db);
    if (SQLITE_OK != result)
    {
        printf ("open db error: %d\n", result);
        return -1;
    }

    /* create table */
    result = sqlite3_exec (db, "create table my_table_1(ID integer primary key autoincrement, name nvarchar(32))", NULL, NULL, &errmsg);
    if (SQLITE_OK != result)
    {
        printf ("create table fail, errno: %d\n\terrmsg: %s\n", result, errmsg);
        return -1;
    }

    /* insert some data */
    result = sqlite3_exec (db, "insert into my_table_1(name) values('走路')", 0, 0, &errmsg);
    if (SQLITE_OK != result)
    {
        printf ("insert data fail, errno: %d\n\terrmsg: %s\n", result, errmsg);
    }

    result = sqlite3_exec (db, "insert into my_table_1(name) values('坐汽车')", 0, 0, &errmsg);
    if (SQLITE_OK != result)
    {
        printf ("insert data fail, errno: %d\n\terrmsg: %s\n", result, errmsg);
    }

    /* query database */
    result = sqlite3_exec (db, "select * from my_table_1", load_my_info, NULL, &errmsg);
    if (SQLITE_OK != result)
    {
        printf ("query data fail, errno: %d\n\terrmsg: %s\n", result, errmsg);
    }

    sqlite3_close (db);

    return 0;
}

实例2

          没有回调函数的操作实例

#include <stdio.h>
#include <sqlite3.h>

int main(int argc, const char *argv[])
{
    sqlite3 *db;
    int result;
    char *errmsg = NULL;
    char **db_result;
    int n_row, n_column;
    int i, j;
    int index;

    result = sqlite3_open ("/home/linux/sqlite_test.db", &db);
    if (SQLITE_OK != result)
    {
        printf ("open db error, errno: %d\n", result);
        return -1;
    }

    /* 假设数据库已经创建好了 */
    /* 开始查询,传入的db_result已经是 char **,
     * 这里再加一个&取地址符,就成了所要求的了 */
    result = sqlite3_get_table (db, "select * from my_table_1", 
                    &db_result, &n_row, &n_column, &errmsg);
    if (SQLITE_OK != result)
    {
        printf ("quert database error, errno: %d\n\terrmsg: %s\n", result, errmsg);
        return -1;
    }

    index = n_column; /* db_result前面第一行数据是字段名称,
                       * 从 n_column 索引开始才是真正的数据,
                       * 结合对 index++ 的讲解来理解 */

    printf ("查到 %d 条记录\n", n_row);
    printf ("------------\n");

    for (i = 0; i < n_row; i++)
    {
        printf ("第 %d 条记录\n", i + 1);

        for (j = 0; j < n_column; j++)
        {
            printf ("字段名:%s\n\t字段值: %s\n", db_result[j], db_result[index]);

            ++index; 
            /* db_result 的字段值是连续的,从第0索引到第 n_column - 1 索引 
             * 都是字段名称,从第 n_column 索引开始,后面都是字段值,
             * 它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示 */
        }

        printf ("------------\n");
    }

    /* 到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite
     * 提供的功能来释放 */
    sqlite3_free_table (db_result);

    /* 关闭数据库 */
    sqlite3_close (db);

    return 0;
}



猜你喜欢

转载自blog.csdn.net/deggfg/article/details/22896007