SQLite数据库编程进阶指南(二)
发表时间: 2020-07-22 14:43
在 C程序中使用 SQLite 之前,我们需要确保机器上已经有 SQLite 库。可以查看 SQLite 安装章节了解安装过程。(在上篇文章中有介绍两种安装方式)。
接下来介绍几个C语言的 接口 API。
一、打开/关闭数据库的API
案例分析:(打开/关闭数据库API使用)
#include <stdio.h>#include <sqlite3.h>int main(int argc, char* argv[]){ sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if(rc != SQLITE_OK) { perror("sqlite3_open"); } else { printf("创建数据库成功\n"); } sqlite3_close(db); return 0;}
现在,让我们来编译和运行上面的程序,在当前目录中创建我们的数据库test.db。您可以根据需要改变路径。
$gcc test.c -lpthread -ldl$./a.out创建数据库成功$lstest.db
二、执行sql语句的API
1、回调法
2、非回调法
案例分析:创建表、插入数据、查询数据等
#include<stdio.h> #include"sqlite3.h" int main(int argc, char const *argv[]) { sqlite3 *db = NULL; int ret = sqlite3_open("test.db", &db); if(ret != SQLITE_OK) { perror("sqlite3_open"); } printf("ok\n"); //1、创建一个person表 char *errmsg = NULL; char *cmd = "create table person(id int, name text, addr text);"; sqlite3_exec(db,cmd,NULL,NULL,&errmsg); //2、往test.db中插入数据 cmd = "insert into person values(100, \'lucy\', \'sz\');"; sqlite3_exec(db,cmd,NULL,NULL,&errmsg); cmd = "insert into person values(300, \'bob\', \'bj\');"; sqlite3_exec(db,cmd,NULL,NULL,&errmsg); cmd = "insert into person values(200, \'tom\', \'sz\');"; sqlite3_exec(db,cmd,NULL,NULL,&errmsg); //3、查询数据库的数据 cmd = "select * from person where name=\'tom\';"; //调用非回调函数 char **result=NULL; int nRow = 0;//存放行数 int nCol = 0;//存放列数 sqlite3_get_table(db,cmd,&result, &nRow, &nCol, &errmsg); printf("nRow = %d\n", nRow); printf("nCol = %d\n", nCol); for (size_t i = 0; i < nRow+1; i++)//0 1 2 { for (size_t j = 0; j < nCol; j++) { printf("%s ", result[j+i*nCol] ); } printf("\n"); } //释放result指向的堆区空间 if(result != NULL) { sqlite3_free_table(result); result = NULL; } sqlite3_close(db); getchar(); return 0; }
总结:
如果执行sql命令 不需要结果 sqlte3_exec函数
如果执行sql命令 需要结果 sqlite3_get_table函数
综合案例:【终端实现考勤】
#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include "rfid_lib.h"#include "sqlite3.h"#include <pthread.h>//串口号#if 0 #define UART_DEV "/dev/ttyUSB0"#else #define UART_DEV "/dev/ttySAC2"#endifint flag = 0;//0表示考勤 1表示注册char rfid_tmp[32]="";//存放rfidsqlite3 * sqlite3_init(char *db_name){ //打开数据库 sqlite3 *db = NULL; int ret = sqlite3_open(db_name, &db); if(ret != SQLITE_OK) { perror("sqlite3_open"); return NULL; } //创建一张考勤表KQ id time rfid char *cmd = "create table KQ(id int, time text, rfid text);"; sqlite3_exec(db,cmd,NULL, NULL, NULL); //创建一张员工表person id name rfid cmd = "create table person(id int, name text, rfid text);"; sqlite3_exec(db,cmd,NULL, NULL, NULL); //创建一张管理员表amdin usr psw cmd = "create table admin(usr text, psw text);"; sqlite3_exec(db,cmd,NULL, NULL, NULL); return db;}void* usr_input_fun(void *arg){ sqlite3 *db = (sqlite3 *)arg; printf("注册:register\n"); printf("查询:search\n"); while(1) { char cmd[32]=""; fgets(cmd,sizeof(cmd),stdin); cmd[strlen(cmd)-1] = 0;//去掉回车 if(strncmp(cmd,"register", strlen("register")) == 0) { //注册信息 int id=0; char name[32]=""; char rfid[64]=""; printf("请输入需要注册的id name:"); scanf("%d %s", &id, name); flag = 1;//注册 while(flag);//等待线程2获取rfid卡号 strcpy(rfid, rfid_tmp); memset(rfid_tmp, 0, sizeof(rfid_tmp)); char sql[128]=""; sprintf(sql,"insert into person values(%d, \'%s\', \'%s\');", id, name, rfid); sqlite3_exec(db,sql,NULL, NULL,NULL); printf("成功注册"); } else if(strncmp(cmd,"search", strlen("search")) == 0) { //查询 printf("请输入要查询的姓名:"); char name[32]=""; fgets(name, sizeof(name), stdin); name[strlen(name)-1] = 0; char sql[128]=""; sprintf(sql,"select name,time from KQ,person where person.id=KQ.id and person.name=\'%s\';",name); char **result=NULL; int nRow = 0; int nCol = 0; sqlite3_get_table(db,sql, &result, &nRow, &nCol, NULL); int i=0,j=0; for (i = 0; i < nRow+1; i++) { for (j = 0; j < nCol; j++) { printf("%s ", result[j+i*nCol]); } printf("\n"); } } }}int main(void){ int len,i;char type; unsigned char id[18] = {0}; //捕获信号 //rfid初始化 uart_rfid_init(UART_DEV); //数据库初始化 sqlite3 *db = sqlite3_init("rfid.db"); //创建一个用户输入线程(项目中用网页实现) pthread_t tid; pthread_create(&tid, NULL, usr_input_fun , db); pthread_detach(tid); while(1) { if(len = get_rfid_card_id(id,&type)){ printf("%c类卡卡号:",type); for(i=0;i<len;i++) printf("%02x ",id[i]); puts(""); char rfid[128]=""; for (i = 0; i < len; i++) { sprintf(rfid+strlen(rfid),"%02x-", id[i]); } rfid[strlen(rfid)-1]=0;//去掉最后一个‘-’ if(flag == 1)//注册 { flag =0; //遍历数据库 如果不存在此卡 才允许注册 strcpy(rfid_tmp,rfid); } else if(flag == 0)//考勤 { //在person通过rfid的id char sql[128]=""; sprintf(sql,"select id from person where rfid=\'%s\';", rfid); char **result=NULL; int nRow = 0; int nCol = 0; sqlite3_get_table(db,sql, &result, &nRow, &nCol, NULL); if(nRow == 0) { printf("无效的卡\n"); } else { //id存放在resualt[1]中 memset(sql,0,sizeof(sql)); sprintf(sql,"insert into KQ values(%s, datetime(\'now\'), \'%s\');",\ result[1], rfid); sqlite3_exec(db,sql,NULL,NULL,NULL); printf("KQ ok\n"); } } } } return 0;}