全志H616_sqlite

  • 数据库sqlite3安装

https://www.sqlite.org/download.html

安装成功过,运行sqlite3 进入SQL命令操作流程 4.3 SQLite的命令用法 创建一个数据库 方式一: 方式二: 1. 把下载的文件sqlite-autoconf-3390000.tar.gz上传到开发板 2. tar xvf sqlite-autoconf-3390000.tar.gz 解压 3. cd sqlite-autoconf-3390000 进入文件夹 4. ./configure --prefix=/usr/local 配置安装路径在/usr/local 5. make 编译//比较久10分钟 6. sudo make install 安装

增删改查

  • 创建/打开数据库

第一种方法:

sqlite3        //进入数据库

.open test.db        //有就打开没有就创建

.quit        //退出数据库



第二种方法:

sqlite3 test1.db         //创建打开/打开数据库test.db

.databases   //查看当前打开的数据库

.quit           //退出
  • 在当前打开的数据库中创建一个表
create table 表名(列名1 数据类型, 列名2 数据类型, ......);


例如:

create table stu(id Integer, name char, score Integer);
  • 查看表中的内容
select * from stu; //查询所有字段的结果
select name,score from stu; //查询数据库中部分字段的内容
  •  在表中插入元组
insert into 表名 values(数据1, 数据2,.......);        //一一对应插入

insert into 表名(列名1, 列名2,.....)  values(数据一,数据2,......);

//指定列插入一行
  •  删除一个元组
delete from 表名 where 列名=数据;

//例如:

delete from stu where id = 18130101;
  • 更改表中的一条记录
update 表名 set 列名=数据 where 列名=数据;

//例如:

update stu set name = 'huangg' where id = 18130106;
  • 删除一张表
drop table 表名;
  • 增加一列
alter table 表名 add column 新增列名 数据类型;

alter table stu add column sex char;

C语言操作sqlite

1.打开/创建数据库

api

  • int sqlite3_open(const char *filename,  **ppDb);
int sqlite3_open(
  const char *filename,   /* 数据库文件名 */
  sqlite3 **ppDb          /* 返回一个指向sqlite3结构体的指针 */
);

其中,参数filename表示要打开的SQLite数据库文件的名称,如果该文件不存在,则会创建一个新的数据库文件。参数ppDb是一个指向sqlite3结构体指针的指针,用于返回一个指向新打开的数据库连接的指针。返回值为整数类型,如果打开成功,则返回SQLITE_OK(0),否则返回一个错误代码。

错误代码:

  •  const char *sqlite3_errmsg(sqlite3*);

这个函数可以返回最近一次SQLite API调用失败的详细错误信息,包括错误码和错误描述。在使用SQLite C语言接口进行编程时,通常需要检查SQLite API函数返回的错误码,以便在出现错误时及时发现和处理。如果某个SQLite API函数返回错误码,可以使用sqlite3_errmsg()函数获取详细的错误信息。

  • int sqlite3_close(sqlite3* db);

sqlite3_close用于关闭打开的SQLite数据库连接。其中,参数db是一个指向sqlite3结构体的指针,表示要关闭的SQLite数据库连接。返回值为整数类型,如果关闭成功,则返回SQLITE_OK(0),否则返回一个错误代码。

代码示例:

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

int main(int argc, char** argv)
{
    if(argc != 2)
    {
        printf("Usage: %s xxx.db\n",argv[0]);
        return -1;
    }

    sqlite3 *db;
    int ret;

    ret = sqlite3_open(argv[1], &db);

    if(ret == SQLITE_OK)
    {
        printf("open success.\n");
    }
    else
    {
        printf("error:%s\n", sqlite3_errmsg(db));

        return -1;
    }

    sqlite3_close(db);


    return 0;
}

2.执行sql语句

api

  • sqlite3_exec() 

sqlite3_exec() 是 SQLite 库中用于执行 SQL 语句的函数。它的函数原型为:

int sqlite3_exec(sqlite3* db, const char* sql, 
                 int (*callback)(void*, int, char**, char**), void* data, char** errmsg);

 其中,db 是要执行 SQL 语句的数据库连接,sql 是要执行的 SQL 语句字符串,callback 是一个回调函数,用于处理查询结果,data 是传递给回调函,数的数据指针,errmsg 是指向指针的指针,用于存储执行过程中的错误信息。函数返回一个整数值,表示函数调用的状态。

  • 回调函数:
int callback(void* data, int argc, char** argv, char** azColName);

sqlite3_exec() 函数执行一个 SELECT 查询时,它会将查询结果作为参数传递给回调函数。回调函数会被调用一次或多次,每次调用都传递一行数据。data 参数是在调用 sqlite3_exec() 时传递的指针,可以用于传递额外的数据给回调函数。argc 参数表示结果集中的列数,argv 是一个包含结果集中数据的指针数组,每个指针指向一个包含一行数据的字符串数组,其中每个字符串表示一个数据值。azColName 是一个包含结果集中列名的指针数组,每个指针指向一个字符串,表示相应列的名称。

回调函数应该返回 0 来继续处理结果集,或者返回非零值来停止处理结果集。如果回调函数返回非零值,sqlite3_exec() 函数也会立即停止查询并返回相应的状态码。

回调函数调用的次数等于表格中元组数。

回调函数只有在sqlite3_exec()执行select语句时才会被调用。

代码示例:

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

int callback(void* data, int num, char** argv, char** azColName)
{
    int i;

    printf("%s", (char* )data);

    for(i = 0; i < num; i++)
    {

        printf("%s = %s\n", azColName[i], argv[i]);

    }

    printf("====================================\n");

    return 0;
}
int main(int argc, char** argv)
{
    sqlite3 *db;
    int ret;
    int rc;
    char* errmsg = NULL;

    if(argc != 3)
    {
        printf("Usage: %s xxx.db table\n",argv[0]);
        return -1;
    }


    ret = sqlite3_open(argv[1], &db);

    if(ret == SQLITE_OK)
    {
        printf("open success.\n");
    }
    else
    {
        printf("error:%s\n", sqlite3_errmsg(db));

        return -1;
    }

    char sql[64];
    sprintf(sql, "select * from %s", argv[2]);

    rc = sqlite3_exec(db, sql, callback, "content:\n", &errmsg);

    if(rc != SQLITE_OK)
    {
        printf("err:%s\n",errmsg);
    }



    sqlite3_close(db);


    return 0;
}

运行结果:

 

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

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

int main(int argc, char **argv) {
    sqlite3 *db;
    char *errmsg = 0;
    int rc;
    char sql_create_table[128];
    char sql_insert[128];
    char sql_select[128];

    // 打开数据库
    rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    // 创建表
    sprintf(sql_create_table, "create table %s(id Integer, name char, score Integer)", argv[2]);
    rc = sqlite3_exec(db, sql_create_table, callback, 0, &errmsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't create table: %s\n", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    // 插入数据
    sprintf(sql_insert, "insert into %s values(001, 'zhangsan', 98)", argv[2]);
    rc = sqlite3_exec(db, sql_insert, callback, 0, &errmsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't insert data: %s\n", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    // 查询数据
    sprintf(sql_select, "select * from %s", argv[2]);
    rc = sqlite3_exec(db, sql_select, callback, 0, &errmsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't select data: %s\n", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

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

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值