SQLite编程

一、SQLite编程接口

1、sqlite3_open
int sqlite3_open(char *path, sqlite **db)

功能:打开sqlite数据库.

参数: 

                path 数据库文件路径.

                db 数据库操作句柄.  

返回值:成功返回0,失败返回错误码(非零值).

2、sqlite_close
int sqlite_close(sqlite3 *db);

功能:关闭sqlite数据库.

参数: 

                db 数据库操作句柄.

返回值:成功返回0,失败返回错误码(非零值)

3、sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3 *db);

功能:通过db句柄得到数据库操作的错误信息.

参数: 

                db 数据库操作句柄.

返回值:错误信息的首地址.

4、sqlite3_exec
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *arg, char **errmsg);

功能:执行一条sql语句.

参数: 

                db 数据库操作句柄.

                sql 一条sql语句.

                callback 回调函数,只有sql为查询语句时才执行此语句.

                arg 传递给回调函数的参数.

                errmsg 错误信息.

返回值:错误信息的首地址.

5、callback
typedef int (*callback)(void *para, int f_num, char **f_value, char **f_name);

功能:每找到一条记录自动执行一次回调函数.

参数: 

               para 传递给回调函数的参数.

                f_num 记录中包含的字段数目.

                f_value 包含每个字段值的指针数组.

                f_name 包含每个字段名称的指针数组.

返回值:成功返回0,失败返回-1.

6、sqlite3_get_table
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);

功能:每找到一条记录自动执行一次回调函数.

参数: 

               db 数据库句柄.

                sql SQL语句.

                resultp 用来指向sql执行结果的指针.

                nrow 满足条件的记录的数目.

                ncolumn 每条记录包含的字段数目.

                errmsg 错误信息指针的地址.      

返回值:成功返回0,失败返回错误码.

二、例程

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

#define DATABASE "stu.db"

/**
 * @brief  插入一条记录.
 * @param db 数据库操作句柄.
 * @return 成功返回0,失败返回-1.
 */
int do_insert(sqlite3 *db)
{
        int id;
        char name[32] = {};
        int score;
        char sql[128] = {};
        char *errmsg;

        printf ("input id:");
        scanf ("%d",&id);
        getchar ();

        printf ("input name:");
        scanf ("%s",name);
        getchar ();

        printf ("input score:");
        scanf ("%d",&score);
        getchar ();

        sprintf (sql, "insert into stu values(%d, '%s', %d)", id, name, score);

        if (sqlite3_exec (db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
                printf ("%s\n", errmsg);
                return -1;
        } else {
                printf ("insert done.\n");
        }

        return 0;
}

/**
 * @brief  删除一条记录.
 * @param db 数据库操作句柄.
 * @return 成功返回0,失败返回-1.
 */
int do_delete(sqlite3 *db)
{
        int id;
        char sql[128] = {};
        char *errmsg;

        printf ("input id:");
        scanf ("%d",&id);
        getchar ();

        sprintf (sql, "delete from stu where id=%d",id);

        if (sqlite3_exec (db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
                printf ("%s\n", errmsg);
                return -1;
        } else {
                printf ("delete done.\n");
        }

        return 0;
}

/**
 * @brief  更新分数.
 * @param db 数据库操作句柄.
 * @return 成功返回0,失败返回-1.
 */
int do_update(sqlite3 *db)
{
        int id;
        int score;
        char sql[128] = {};
        char *errmsg;

        printf ("input id:");
        scanf ("%d",&id);
        getchar ();

        printf ("input score:");
        scanf ("%d",&score);
        getchar ();

        sprintf (sql, "update stu set score=%d where id=%d",score,id);

        if (sqlite3_exec (db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
                printf ("%s\n", errmsg);
                return -1;
        } else {
                printf ("update done.\n");
        }

        return 0;
}

/**
 * @brief  每找到一条记录自动执行一次回调函数.
 * @param para 传递给回调函数的参数.
 * @param f_num 记录中包含的字段数目.
 * @param f_value 包含每个字段值的指针数组.
 * @param f_name 包含每个字段名称的指针数组.
 * @return 成功返回0,失败返回-1.
 */
int callback(void *para, int f_num, char **f_value, char **f_name)
{
        int i;
        int *arg = (int*)para;
        if (*arg == 0) {
                for (i=0; i<f_num; i++) {
                        printf ("%-11s ", f_name[i]);
                }
                (*arg)++;
        }
        putchar(10);

        for (i=0; i<f_num; i++) {
                printf ("%-11s ", f_value[i]);
        }
        putchar (10);

        return 0;
}

/**
 * @brief  查询整个表.
 * @param db 数据库操作句柄.
 * @return 成功返回0,失败返回-1.
 */
int do_query(sqlite3 *db)
{
        char sql[128] = {};
        char *errmsg;
        int arg = 0;
        sprintf (sql, "select * from stu");

        if (sqlite3_exec (db, sql, callback, &arg, &errmsg) != SQLITE_OK) {
                printf ("%s\n", errmsg);
                return -1;
        } else {
                printf ("query done.\n");
        }

        return 0;
}

/**
 * @brief  查询整个表.
 * @param db 数据库操作句柄.
 * @return 成功返回0,失败返回-1.
 */
int do_query1(sqlite3 *db)
{
        char sql[128] = {};
        char *errmsg;
        char **resultp;
        int nrow;
        int ncolumn;
        int i;
        int j;
        int index = 0;
        sprintf (sql, "select * from stu");

        if (sqlite3_get_table (db, sql, &resultp, &nrow,  &ncolumn, &errmsg) != SQLITE_OK) {
                printf("%s\n",errmsg);
                return -1;
        } else {
                for (i=0; i<=nrow; i++) {
                        for (j=0; j<ncolumn; j++) {
                                printf ("%-11s ", resultp[index++]);
                        }
                        putchar (10);
                }

                printf ("query done.\n");
        }

        return 0;
}

/**
 * @brief  主函数.
 * @return 成功返回0,失败返回-1.
 */
int main()
{
        sqlite3 * db;
        char *errmsg;
        if (sqlite3_open (DATABASE, &db)) {
                printf ("%s\n",sqlite3_errmsg(db));
                exit (-1);
        } else {
                printf ("open %s success.\n", DATABASE);
        }

        if (sqlite3_exec (db, "create table stu(id Integer, name char, score Integet)", NULL, NULL, &errmsg) != SQLITE_OK) {
                printf ("%s\n", errmsg);
        } else {
                printf ("create table success.\n");
        }

        int cmd;
        while (1) {
                printf ("******************************************************\n");
                printf ("1:insert 2:delete 3:query 4:update 5:quit.\n");
                printf ("******************************************************\n");

                scanf ("%d",&cmd);

                switch (cmd) {
                        case 1:
                                do_insert(db);
                                break;
                        case 2:
                                do_delete(db);
                                break;
                        case 3:
                                //do_query(db);
                                do_query1(db);
                                break;
                        case 4:
                                do_update(db);
                                break;
                        case 5:
                                sqlite3_close(db);
                                exit(0);
                                break;
                        default:
                                printf("error cmd.\n");
                }
        }

        return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值