嵌入式数据库开发编程(六)——C API

简介: 嵌入式数据库开发编程(六)——C API

一、打开、关闭和错误处理


0a2653c851af460fa595bd959398a8f1.png

错误处理


2d65d23f6d4748949b924e4057485923.png2e9b90b2ca334476abebe75bafe6eeaa.png4cebaac233b3433da32a72337a77fc60.png


#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("Please input db name\n");
        exit(1);
    }
    sqlite3 *db;
    int ret = sqlite3_open(argv[1], &db);
    if(ret != SQLITE_OK)
    {
        printf("sqlite3 open:%s",sqlite3_errmsg(db));
        exit(1);
    }
    printf("sqlite open db successful!\n");
    sqlite3_close(db);
    return 0;
}

0a2653c851af460fa595bd959398a8f1.png


二、执行sql


2d65d23f6d4748949b924e4057485923.png

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
void print_error(int ret, char *err, sqlite3 *db)
{
    if (ret != SQLITE_OK)
    {
        printf("%s:%s\n",err, sqlite3_errmsg(db));
        exit(1);
    }
}
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("Please input db name\n");
        exit(1);
    }
    sqlite3 *db;
    char *errmsg;
    char sql[1024] = {0};
    int ret = sqlite3_open(argv[1], &db);
    print_error(ret, "sqlite_open",db);
    printf("sqlite open db successful!\n");
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "create table IF NOT EXISTS student (integer primary key, name text, age integer)");
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "sqlite exec create table", db);
    sqlite3_close(db);
    return 0;
}


输入sqlitebrower test.db

0a2653c851af460fa595bd959398a8f1.png

这样就创建成功了,如果没有sqlitebrower


输入:sudo apt-get install sqlitebrower


三、封装sql


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
void print_error(int ret, char *err, sqlite3 *db)
{
    if (ret != SQLITE_OK)
    {
        printf("%s:%s\n",err, sqlite3_errmsg(db));
        exit(1);
    }
}
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("Please input db name\n");
        exit(1);
    }
    sqlite3 *db;
    char *errmsg;
    char sql[1024] = {0};
    int id;
    char name[32];
    int age;
    int ret = sqlite3_open(argv[1], &db);
    print_error(ret, "sqlite_open",db);
    printf("sqlite open db successful!\n");
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "create table IF NOT EXISTS student (id integer primary key, name text, age integer)");
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "sqlite exec create table", db);
    //插入2行数据:id,name,age 键盘输入
    for (size_t i = 0; i < 2; i++)
    {
        printf("Please input id:\n");
        scanf("%d", &id);
        printf("Please input name:\n");
        scanf("%s", name);
        printf("Please input age:\n");
        scanf("%d", &age);
        //sql:insert into student(id, name, age) values()
        //sprintf(); fprintf
        memset(sql, 0, sizeof(sql));
        sprintf(sql, "insert into student(id, name, age) values(%d, '%s', %d)",id, name, age);
        printf("%s\n",sql);
        ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
        print_error(ret, "insert into", db);
    }
    //删除
    memset(sql, 0, sizeof(sql));
    printf("Please input delete name:\n");
    scanf("%s", name);
    sprintf(sql, "delete from student where name = '%s'", name);
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "delete", db);
    sqlite3_close(db);
    return 0;
}


四、回调函数


行缓冲

0a2653c851af460fa595bd959398a8f1.png


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
void print_error(int ret, char *err, sqlite3 *db)
{
    if (ret != SQLITE_OK)
    {
        printf("%s:%s\n",err, sqlite3_errmsg(db));
        exit(1);
    }
}
//放在指针数组里面了
int my_sqlite_callback(void *para, int columnCount, char **columnValue, char **columnName)
{
    int flag = *((int *)para);
    printf("flag = %d\n",flag);
    printf("columbCount = %d\n", columnCount);
    for (size_t i = 0; i < columnCount; i++)
    {
        printf("%s:%s|",columnName[i] ,columnValue[i]);
    }
    printf("\n");
    return 0;
}
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("Please input db name\n");
        exit(1);
    }
    sqlite3 *db;
    char *errmsg;
    char sql[1024] = {0};
    int id;
    char name[32];
    int age;
    int ret = sqlite3_open(argv[1], &db);
    print_error(ret, "sqlite_open",db);
    printf("sqlite open db successful!\n");
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "create table IF NOT EXISTS student (id integer primary key, name text, age integer)");
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "sqlite exec create table", db);
    //插入2行数据:id,name,age 键盘输入
#if 0
    for (size_t i = 0; i < 1; i++)
    {
        printf("Please input id:\n");
        scanf("%d", &id);
        printf("Please input name:\n");
        scanf("%s", name);
        printf("Please input age:\n");
        scanf("%d", &age);
        //sql:insert into student(id, name, age) values()
        //sprintf(); fprintf
        memset(sql, 0, sizeof(sql));
        sprintf(sql, "insert into student(id, name, age) values(%d, '%s', %d)",id, name, age);
        printf("%s\n",sql);
        ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
        print_error(ret, "insert into", db);
    }
    //删除
    memset(sql, 0, sizeof(sql));
    printf("Please input delete name:\n");
    scanf("%s", name);
    sprintf(sql, "delete from student where name = '%s'", name);
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "delete", db);
#endif
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "select * from student");
    int flag = 0;
    ret = sqlite3_exec(db, sql, my_sqlite_callback, (void *)&flag, &errmsg);
    //有多少行,就会执行所少次
    print_error(ret, "select", db);
    sqlite3_close(db);
    //flag无法在函数my_sqlite_callback中使用
    printf("flag = %d\n",flag);
    //不是select的时候,callback不作用
    return 0;
}


五、全缓冲查询


全局缓冲

0a2653c851af460fa595bd959398a8f1.png



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
void print_error(int ret, char *err, sqlite3 *db)
{
    if (ret != SQLITE_OK)
    {
        printf("%s:%s\n",err, sqlite3_errmsg(db));
        exit(1);
    }
}
//放在指针数组里面了
int my_sqlite_callback(void *para, int columnCount, char **columnValue, char **columnName)
{
    int flag = *((int *)para);
    printf("flag = %d\n",flag);
    printf("columbCount = %d\n", columnCount);
    for (size_t i = 0; i < columnCount; i++)
    {
        printf("%s:%s|",columnName[i] ,columnValue[i]);
    }
    printf("\n");
    return 0;
}
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("Please input db name\n");
        exit(1);
    }
    sqlite3 *db;
    char *errmsg;
    char sql[1024] = {0};
    int id;
    char name[32];
    int age;
    int ret = sqlite3_open(argv[1], &db);
    print_error(ret, "sqlite_open",db);
    printf("sqlite open db successful!\n");
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "create table IF NOT EXISTS student (id integer primary key, name text, age integer)");
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "sqlite exec create table", db);
    //插入2行数据:id,name,age 键盘输入
#if 0
    for (size_t i = 0; i < 1; i++)
    {
        printf("Please input id:\n");
        scanf("%d", &id);
        printf("Please input name:\n");
        scanf("%s", name);
        printf("Please input age:\n");
        scanf("%d", &age);
        //sql:insert into student(id, name, age) values()
        //sprintf(); fprintf
        memset(sql, 0, sizeof(sql));
        sprintf(sql, "insert into student(id, name, age) values(%d, '%s', %d)",id, name, age);
        printf("%s\n",sql);
        ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
        print_error(ret, "insert into", db);
    }
    //删除
    memset(sql, 0, sizeof(sql));
    printf("Please input delete name:\n");
    scanf("%s", name);
    sprintf(sql, "delete from student where name = '%s'", name);
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    print_error(ret, "delete", db);
#endif
#if 0
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "select * from student");
    int flag = 0;
    ret = sqlite3_exec(db, sql, my_sqlite_callback, (void *)&flag, &errmsg);
    //有多少行,就会执行所少次
    print_error(ret, "select", db);
    //flag无法在函数my_sqlite_callback中使用
    printf("flag = %d\n",flag);
    //不是select的时候,callback不作用
#endif
    char **result;
    int nrow;
    int ncolumn;
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "select * from student");
    ret = sqlite3_get_table(db, sql, &result, &nrow, &ncolumn, &errmsg);
    //从1开始遍历,要是从0的话,列名也会打印出来
    for (size_t i = 1; i <= nrow; i++)
    {
        for (size_t j = 0; j < ncolumn; j++)
        {
            printf("%s|", result[i * ncolumn + j]);
        }
        printf("\n");
    }
    sqlite3_close(db);
    return 0;
}


六、字节缓冲


效率最高


0a2653c851af460fa595bd959398a8f1.png2d65d23f6d4748949b924e4057485923.png2e9b90b2ca334476abebe75bafe6eeaa.png4cebaac233b3433da32a72337a77fc60.png6de278e6d6694ce5bb08e7e842b7e74b.png


七、总结


细心就行,要封装好


相关文章
|
24天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
164 0
|
1月前
|
缓存 安全 测试技术
构建高效的RESTful API:后端开发的实践指南
【2月更文挑战第17天】在数字化转型的浪潮中,RESTful API已成为连接不同软件组件、实现数据交互的核心桥梁。本文将深入探讨如何构建一个高效、可扩展且安全的RESTful API,涉及设计原则、开发流程以及性能优化等关键方面。我们将透过实际案例,展示如何在保证简洁性和灵活性的同时,满足日益增长的业务需求和技术挑战。
|
1月前
|
数据库
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
20 0
|
17天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
7天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。
|
7天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
37 1
|
16天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
21天前
|
机器学习/深度学习 前端开发 API
实现以图搜货功能,淘宝API开发实战分享
实现以图搜货功能,淘宝API开发实战分享
24 0
|
24天前
|
算法 Linux API
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
28 0
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
|
29天前
|
缓存 前端开发 API
构建高效可扩展的RESTful API:后端开发的最佳实践
【2月更文挑战第30天】 在现代Web应用和服务端架构中,RESTful API已成为连接前端与后端、实现服务间通信的重要接口。本文将探讨构建一个高效且可扩展的RESTful API的关键步骤和最佳实践,包括设计原则、性能优化、安全性考虑以及错误处理机制。通过这些实践,开发者可以确保API的健壮性、易用性和未来的可维护性。