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;}