前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >20分钟掌握sqlite库的使用

20分钟掌握sqlite库的使用

作者头像
gaigai
发布2019-09-16 15:07:14
9520
发布2019-09-16 15:07:14
举报
文章被收录于专栏:Windows开发Windows开发

sqlite库是一个轻量级的数据库引擎,功能齐全,广泛应用于客户端产品(如Chrome浏览器)。

首先,从官网下载sqlite源码(sqlite3.c和sqlite3.h两个文件),添加到工程项目中。

然后,阅读sqlite库的API文档,下面3个API(sqlite3_open()、sqlite3_exec()、sqlite3_close())基本上就可以满足开发的需要。

代码语言:javascript
复制
/**
@name 打开数据库,获取数据库连接对象
@param filename 数据库文件完整路径,UTF8编码
@param ppDb 数据库连接对象,调用其它接口时需要传入
@return SQLITE_OK 成功,其它值是错误码
*/
int sqlite3_open(
    const char *filename,   /* Database filename (UTF-8) */
    sqlite3 **ppDb          /* OUT: SQLite db handle */
    );

/**
@name 执行SQL语句
@param pDb 数据库连接对象,sqlite3_open返回的值
@param sql 要执行的SQL语句,多个SQL语句之间使用分号(;)隔开
@param callback SQL执行过程中每个结果行都会进行回调,
                            SQL查询时必需设置回调获取查询结果
@param callback_context 作为callback的第一个参数,透传
@param errmsg 如果调用失败,返回错误内容,不需要时调sqlite3_free()释放
@return SQLITE_OK 成功,其它值是错误码
*/
int sqlite3_exec(
    sqlite3* pDb,                                  /* An open database */
    const char *sql,                           /* SQL to be evaluated */
    int(*callback)(void*, int, char**, char**),  /* Callback function */
    void * callback_context,                                    /* 1st argument to callback */
    char **errmsg                              /* Error msg written here */
    );

/**
int(*callback)(void* callback_context, int column_num, char** column_value, char** column_name);
回调有4个参数:
第一,callback_context 回调上下文,sqlite3_exec的callback_context,业务自己定义
第二,column_num 列数,column_value和column_name数组的大小
第三,column_value 各列的值
第四, column_name 各列的名字
如果返回值不是SQLITE_OK,sqlite3_exec将立即终止SQL执行,并返回失败
*/

/**
@name 关闭数据库连接对象
@param pDB 数据库连接对象, sqlite3_open返回的值
@return SQLITE_OK 成功,其它值是错误码
*/
int sqlite3_close(sqlite3* pDB);

sqlite库支持的主要数据类型有:NULL(空值)、INT(4位有符号整数)、INT8(8位有符号整数)、FLOAT、DOUBLE、TEXT(可变长度字符串,不限长度)、CHAR(n)(固定长度为n的字符串)、VARCHAR(n)(最大长度不超过n的字符串)。

下面示例参考tutorialspoint站点上的例子,说明如何使用sqlite库建表、增删改查。

COMPANY表包含5列:

第一, 员工ID,INT型,主键,不能为空

第二, 员工名字,TEXT型,不能为空

第三, 员工年龄,INT型,不能为空

第四, 员工地址,字符串50个字符

第五, 员工薪水,浮点数,可以有小数

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include "sqlite/sqlite3.h" 

static int callback(void *NotUsed, int argc, char **azColValue, char **azColName) {
    int i;
    for (i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], azColValue[i] ? azColValue[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char* argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    /* Open database */
    rc = sqlite3_open("test.db", &db);

    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return(0);
    }
    else {
        fprintf(stdout, "Opened database successfully\n");
    }

    /* Create Table */
    sql = "CREATE TABLE COMPANY("  \
        "ID INT PRIMARY KEY     NOT NULL," \
        "NAME           TEXT    NOT NULL," \
        "AGE            INT     NOT NULL," \
        "ADDRESS        CHAR(50)," \
        "SALARY         REAL );";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        fprintf(stdout, "Table created successfully\n");
    }

    /* Insert Table */
    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
        "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
        "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
        "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
        "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
        "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
        "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
        "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        fprintf(stdout, "Records created successfully\n");
    }

    /* Select Table */
    sql = "SELECT * from COMPANY";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        fprintf(stdout, "Operation done successfully\n");
    }

    /* Update Table */
    sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \
        "SELECT * from COMPANY";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        fprintf(stdout, "Operation done successfully\n");
    }

    /* Delete Table */
    sql = "DELETE from COMPANY where ID=2; " \
        "SELECT * from COMPANY";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        fprintf(stdout, "Operation done successfully\n");
    }

    sqlite3_close(db);
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档