目录
数据库的概念
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库分类
常用的数据库
大型数据库 :Oracle
中型数据库 :Server是微软开发的数据库产品,主要支持windows平台
小型数据库 :mySQL是一个小型关系型数据库管理系统。开放源码
sqlite
sqlite基础
SQLite的源代码是C,其源代码完全开放。它是一个轻量级的嵌入式数据库。
sqlite有以下特性
零配置一无需安装和管理配置;
储存在单一磁盘文件中的一个完整的数据库;
数据库文件可以在不同字节顺序的机器间自由共享;
支持数据库大小至2TB(1024G = 1TB);足够小,全部源码大致3万行c代码,250KB;
比目前流行的大多数数据库对数据的操作要快;
在代码中常动态创建数据库 在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库
sqlite3相关函数
头文件:#include <sqlite3.h>
编译:gcc sqlite1.c -lsqlite3
1.int sqlite3_open(char *path, sqlite3 **db);
功能:打开sqlite数据库,如果数据库不存在则创建它
path: 数据库文件路径
db: 指向sqlite句柄的指针
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)2.int sqlite3_close(sqlite3 *db);
功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码返回值:返回错误信息
3.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:错误信息指针的地址
返回值:成功返回SQLITE_OK,失败返回错误码回调函数:
typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);功能:select:每找到一条记录自动执行一次回调函数
para:传递给回调函数的参数(由 sqlite3_exec() 的第四个参数传递而来)
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组(列值)
f_name:包含每个字段名称的指针数组(列名)
返回值:成功返回SQLITE_OK,失败返回-1,每次回调必须返回0后才能继续下次回调4.不使用回调函数执行SQL语句(只用于查询)
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);功能:执行SQL操作
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目(但是不包含字段名(表头 id name score))
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址返回值:成功返回SQLITE_OK,失败返回错误码
5.返回sqlite3定义的错误信息
char *sqlite3_errmsg(sqlite3 *db);
sqlite3案例
#include <sqlite3.h>
#include <stdio.h>
// int flag = 0;
// int callback(void *arg, int num, char **shuju, char **biaoti)
// {
// if (flag == 0)
// {
// for (int i = 0; i < num; i++)
// {
// printf("%s ", biaoti[i]);
// }
// printf("\n");
// flag = 1;
// }
// for (int i = 0; i < num; i++)
// {
// printf("%s ", shuju[i]);
// }
// printf("\n");
// return 0;
// }
int main(int argc, char const *argv[])
{
// 1.打开或创建数据库
sqlite3 *db = NULL;
if (sqlite3_open("./stu.db", &db) != 0)
{
printf("打开或创建数据库失败:%s", sqlite3_errmsg(db));
return -1;
}
printf("打开或创建数据库成功\n");
// 2.创建一个表
char *errmsg = NULL;
if (sqlite3_exec(db, "create table stu(id int primary key,name char,score float);", NULL, NULL, &errmsg) != 0)
{
printf("cteate失败%s\n", errmsg);
}
printf("创建表成功\n");
// 3.向表中插入数据
char sql[128];
int num;
int id;
char name[32];
float score;
printf("请输入要插入学生信息的数量:");
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
printf("请输入学生的学号 姓名 成绩\n");
scanf("%d %s %f", &id, name, &score);
sprintf(sql, "insert into stu values(%d,'%s',%f);", id, name, score);
if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0)
{
printf("insert失败%s\n", errmsg);
sqlite3_close(db);
return -1;
}
printf("sql语句:%s\n", sql);
printf("插入数据成功\n");
}
// 4.查询
// 1.使用sqlite3_exec函数
// if (sqlite3_exec(db, "select * from stu;", callback, NULL, &errmsg) != 0)
// {
// printf("select失败%s\n", errmsg);
// sqlite3_close(db);
// return -1;
// }
// printf("数据查询成功\n");
// 2.使用sqlite3_get_table函数
char **Result = NULL;
int lie, hang;
if (sqlite3_get_table(db, "select * from stu;", &Result, &hang, &lie, &errmsg) != 0)
{
printf("select失败%s\n", errmsg);
sqlite3_close(db);
return -1;
}
int k = 0;
for (int i = 0; i < hang + 1; i++)
{
for (int j = 0; j < lie; j++)
{
printf("%s ", Result[k++]);
}
printf("\n");
}
printf("数据查询成功\n");
// 5.关闭数据库
sqlite3_close(db);
return 0;
}