数据库编程
来源:互联网 发布:java项目打包jar工具 编辑:程序博客网 时间:2024/05/29 04:46
本文主要讲的是Linux下使用c语言对sqlite数据库的一些操作。
SQLite将每个数据库都保存成一个文件。
数据库中的数据被组织成表的形式。
表由若干拥有相同字段的记录组成。
表可以为空,即拥有0条记录。
字段指的是记录中的数据域,它有不同的类型,可以是一个数值,也可以是字符串。
每个表中可以指定一个或多个字段为主键,表中所有记录的主键的值都不能重复。这种不重复是在插入记录时控制的,即如果向一个表中插入记录时,这个表中已有与插入记录具有相同主键的记录,则插入操作失败。
几个数据库相关操作
1、打开数据库、关闭数据库
int sqlite3_open( 文件名, sqlite3 ** );
用这个函数开始数据库操作。
int sqlite3_close(sqlite3 *);
前面如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
案例:
int main(){ sqlite3 * database; // 打开数据库 int ret = sqlite3_open("student.db", &database); if (ret != SQLITE_OK) { printf ("打开数据库失败\n"); return -1; } printf ("打开数据库成功\n"); // 关闭数据库 sqlite3_close(database); return 0;}
2、执行SQL语句
int sqlite3_exec(sqlite3*, const char sql, sqlite3_callback, void , char **errmsg );这就是执行一条 sql 语句的函数。
第1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习)
第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。
第5个参数char ** errmsg 是错误信息。
注意是指针的指针。sqlite3里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个 char*得到具体错误提示。
说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填NULL表示你不需要回调。比如你做insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。
typedef int (* sqlite3_callback)(void*,int, char**, char**);你的回调函数必须定义成上面这个函数的类型。
int main(){ sqlite3 * database; // 打开数据库 int ret = sqlite3_open("student.db", &database); if (ret != SQLITE_OK) { printf ("打开数据库失败\n"); return -1; } printf ("打开数据库成功\n"); char *errmsg = NULL; //创建表 char *sql = "create table if not exists student(ID INTEGER,name TEXT,sex TEXT,age INTEGER,primary key(ID))"; ret = sqlite3_exec(database, sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf ("数据库操作失败:%s\n", errmsg); return -1; } int id; char name[20]; char sex[2]; int age; printf ("请输入ID:\n"); scanf ("%d", &id); printf ("请输入用户名:\n"); scanf ("%s", name); printf ("请输入性别:\n"); scanf ("%s", sex); printf ("请输入年龄:\n"); scanf ("%d", &age); // insert into student values(id, name, sex, age); char buf[100]; //插入数据 sprintf (buf, "insert into student values(%d, '%s', '%s', %d)", id, name, sex, age); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf ("数据库操作失败:%s\n", errmsg); return -1; } // 关闭数据库 sqlite3_close(database); return 0;}
查询数据库,需要使用回调函数
// 1、exec传过来的参数// 2、代表查询的列数// 3、char** value 代表一条记录的值 char *value[] = {"1", "zhang1", "M", "12"};// 4、char** name 代表每一列的字段 char *name[] = {"id", "name", "sex", "age"};// 每查到一条记录,该函数被调用一次int msg(void* v, int num, char** value, char** name){ int i; for (i = 0; i < num; i++) { printf ("%s : %-8s", name[i], value[i]); } printf ("\n"); return 0; // 函数内部一定要返回一个0}int main(int argc, char *argv[]){ sqlite3 * database; // 打开数据库 int ret = sqlite3_open("student.db", &database); if (ret != SQLITE_OK) { printf ("打开数据库失败\n"); return -1; } printf ("打开数据库成功\n"); char *errmsg = NULL; char *sql = "select * from student"; ret = sqlite3_exec(database, sql, msg, NULL, &errmsg); if (ret != SQLITE_OK) { printf ("数据库操作失败:%s\n", errmsg); return -1; } // 关闭数据库 sqlite3_close(database); return 0;}
上面介绍的 sqlite3_exec 是使用回调来执行 select 操作。还有一个方法可以直接查询而不需要回调。但是,我个人感觉还是回调好,因为代码可以更加整齐,只不过用回调很麻烦,你得声明一个函数。
虽然回调显得代码整齐,但有时候你还是想要非回调的 select 查询。这可以通过 sqlite3_get_table 函数做到。
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
第1个参数不再多说,看前面的例子。
第2个参数是 sql 语句,跟 sqlite3_exec 里的 sql 是一样的。是一个很普通的以/0结尾的char *字符串。
第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。
第4个参数是查询出多少条记录(即查出多少行)。
第5个参数是多少个字段(多少列)。
案例:
int main(int argc, char *argv[]){ sqlite3 * database; // 打开数据库 int ret = sqlite3_open("student.db", &database); if (ret != SQLITE_OK) { printf ("打开数据库失败\n"); return -1; } // 3、char ***resultp: char *resultp[] = {"id", "name", "sex", "age", "1", "zhang", "M", "12","2".....}; // 4、nrow: 多少行数据 // 5、ncolumn: 多少列数据 char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from student"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf ("数据库操作失败:%s\n", errmsg); return -1; } int i; printf ("nrow = %d, ncolumn = %d\n", nrow, ncolumn); for (i = 0; i < (nrow+1)*ncolumn; i++) { if (i % ncolumn == 0) printf ("\n"); printf ("%-8s", resultp[i]); } printf ("\n"); sqlite3_free_table(resultp); // 关闭数据库 sqlite3_close(database); return 0;}
本文是在Linux下使用sqlite3数据库进行的一些操作,只有几条SQL语句,相对来说不是很难,如果有兴趣可以学习一下数据库相关内容,对本文内容进行一个拓展。
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- 数据库编程
- HTML数据库编程、JavaScript数据库编程
- php数据库编程,php数据库编程步骤
- Java 数据库编程 - 连接数据库
- MySQL 数据库编程-连接数据库
- java数据库编程--MySQL数据库
- ADO数据库编程入门
- 【模板】快速幂
- Java多线程——Condition条件
- java简介
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- pywin32应用——python在windows下系统编程初步
- 数据库编程
- Reverse-Interger
- 数据库操作练习10
- Handler深入解析(二)
- namespace、autoload、sql_autoload_register、PSR-4
- Java基础之程序设计基础
- 前端
- pytorch学习总结
- flask 传参