- 数据库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;
}