• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C语言实现sqlite3创建表格,插入数据,查看数据

武飞扬头像
HaiQinyanAN
帮助3

C语言实现sqlite3创建表格,插入数据,获取数据

1-接口API

API是应用程序接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。以下是重要的C语言SQLite 接口程序,可以满足在 C程序中使用 SQLite 数据库的需求。
至于API的具体了解,可以参考这篇文章:API详解

2-sqlite3_open()

sqlite3_open(const char *filename, sqlite3 **ppDb)

const char * filename:
第一个参数是传文件名,文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
sqlite3 ~~ppDb:
第二个参数让我们传一个 ~~ ppDb, ~~Db是地址的地址,因为在函数里想改变值,就必须传地址,返回的连接句柄保存在*ppDb,所以我们声明一个sqlite3 *ppDb指针,传递进去用来接收返回的句柄,把句柄理解成数据库对象的地址就好。返回值int是成果返回SQLITE_OK,也就是0,错误返回其他值。

3-sqlite3_exec()

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

返回值int是成果返回SQLITE_OK,也就是0,错误返回其他值。
sqlite3 * :
第一个参数是在sqlite3_open函数中返回的数据库句柄。
const char * sql:
第二个参数是执行的sql语句
sqlite_callback:
第三个参数是callback回调功能,在select获取表格数据的时候会用到
void * data:
第四个参数是用户传入的参数,可以为NULL。想传入的话一般是一串字符串,说明语句吧
char errmsg:
第五个参数是返回错误信息,注意是指针的指针。第五个参数不为空的时候,它被分配内存并写入了错误信息,所以在sqlite3_exec后面要调用sqlite3_free去释放这个对象防止内存泄露。

4-sqlite3_close()

sqlite3_close(sqlite3*)

sqlite3 * :
第一个参数是在sqlite3_open函数中返回的数据库句柄。 即关闭数据库连接对象。

5-回调函数

在需要查询表格数据之类的情况下是需要使用回调函数的,如果只是创建表格或者插入数据,则不需要调用回调函数。如果需要获取并且打印表格中的数据,那就需要去调用回调函数。具体工作流程也不需要详细参照了,我一般都是直接拿过来用的。这个回调函数比较固定,只需要放在那里就可。

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i<argc; i  ){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

void * NotUsed:
第一个参数是由sqlite3_exec()传递过来的,一般都是0
int argc:
第二个参数表示表的行数(横着数)
char ** argv:
第三个参数表示表的列数(竖着数)
char ** azColName:
第四个参数是指向表头的数组指针

6-代码示例

#include <stdio.h>
#include <sqlite3.h>
#include <time.h>
#include <string.h>
#include <errno.h>

/*回调函数*/
static int callback(void *data, int argc, char **argv, char **azColName){
    int i;
    for(i=0; i<argc; i  ){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

static inline void get_time(char *buf);//这是一个获取系统时间日期的函数,获取的时间日期在这个buf中

/*方便查看我将变量的定义分开【创建表】【插入数据】【获取数据】*/
int main(int argc, char argv[])
{
【创建表】
    char     buf[512];
    sqlite3  *db = 0;
    memset(buf, 0, sizeof(buf));
    int ret = sqlite3_open("temper.db", &db);//当前文件夹下打开数据库文件,没有就创建
    get_time(buf);//获取时间放在buf中
    /*创建表准备*/
    const char * creat = "create table temper("
        "cid  integer primary key autoincrement,"           //设置名叫cid的自动增长的主键
        "ID varchar(10), "                              //ID 字段
        "Data varchar(500),"                                //name字段
        "Temperature valchar(30));";
    char * p2= 0;
    sqlite3_exec(db, creat, 0, 0, &p2 );//我的理解是:sqlite3_exec()作为API,收到我的命令creat表,告诉数据库执行相关命令。


【插入数据】
    char *rt;
    char *port="12345";
    char *temper="31.0000摄氏度";
    rt = sqlite3_mprintf("INSERT INTO temper VALUES(NULL,'%s','%s','%s')", port, buf, temper);//插入数据准备
    sqlite3_exec(db, rt, 0, 0, &p2);//执行命令


【获取数据】
    char *select;
    int rc = -1;
    select = "SELECT * from temper";
    rc = sqlite3_exec(db, select, callback, 0, &p2);
    if(rc != SQLITE_OK )
    {
        printf("Select error\n");
        sqlite3_free(p2);
    }

    sqlite3_close(db);
    return 0;
}


static inline void get_time(char *buf)
{
    struct tm *tm_ptr;
    time_t the_time;
    (void)time(&the_time);
    tm_ptr = gmtime(&the_time);
    sprintf(buf, "d-d-d  d:d:d",tm_ptr->tm_year 1900, tm_ptr->tm_mon 1, tm_ptr->tm_mday,(tm_ptr->tm_hour) 8, tm_ptr->tm_min, tm_ptr->tm_sec);
}

学新通

创建表格,插入数据,获取数据,删除数据,获取行数函数封装:

#include <stdio.h>
#include <sqlite3.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct {
    char sed_del_buf[512];
    int count;
} Time;

int callback(void *data, int argc, char **argv, char **azColName);
void get_time(char *buf);
int create_table(sqlite3 *db);
int insert_data(sqlite3 *db, char *buf);
int get_data(sqlite3 *db, Time *t_tmp);
int delete_data(sqlite3 *db);
int select_count(sqlite3 *db, Time *t_tmp);
int callback2(void *NotUsed, int argc, char **argv, char **azColName);

int main(int argc, char *argv[])
{
    /*计算开始时间*/
    time_t stime;
    time(&stime);      
    int start_time=stime; 
    printf("开始的时间是:%d s\n",start_time);

    /*获取时间*/
    char buf[512];
    memset(buf, 0, sizeof(buf));
    get_time(buf);

    /*创建数据库*/
    sqlite3  *db = 0;
    int rc = -1;
    rc = sqlite3_open("temper2.db", &db);
    if(rc)
    {
        printf("open database failure:%s\n", strerror(errno));
        return 0;
    }
    else
    {
        printf("open database success!\n");
    }

    /*创建表*/
    create_table(db);

    /*插入数据*/
    insert_data(db, buf);
    
    /*获取第一条数据*/
    Time t_tmp;
    get_data(db, &t_tmp);
    printf("%s\n",t_tmp.sed_del_buf);

    /*删除已经发送的数据*/
    delete_data(db);
   
   /*表中存在的数据数量*/ 
    select_count(db, &t_tmp);
    return 0;
}

int callback2(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   Time *sq_count;
   sq_count = (Time *)NotUsed;
   for(i=0; i<argc; i  ){
      sq_count->count = atoi(argv[i] ? argv[i] : "NULL");
   }
   printf("count:%d\n", sq_count -> count);
   return 0;
}

int select_count(sqlite3 *db, Time *t_tmp)
{
    int rc = -1;
    char *sql_count;
    sql_count = "select count(*) from temper";
    rc = sqlite3_exec(db, sql_count, callback2, t_tmp, NULL);
    if(rc != SQLITE_OK)
    {
        printf("get_data failure:%s\n",strerror(errno));
        return -1;
    }
    else
    {
        return 1;
    }
}

/*插入数据*/
int insert_data(sqlite3 *db, char* buf)
{   
    char *rt;
    char *port="12345";
    char *temper="31.0000摄氏度";
    rt = sqlite3_mprintf("INSERT INTO temper VALUES(NULL,'%s','%s','%s')", port ,buf, temper);
    int rc = sqlite3_exec(db, rt, 0, 0, NULL);
    if(rc != SQLITE_OK)
    {
        printf("Insert data faliure:%s\n", strerror(errno));
        return -1;
    }
}
/*删除已经发送的数据*/
int delete_data(sqlite3 *db)
{   
    int rc = -1;
    char *sql_delete;
    sql_delete = "delete from temper limit 1";
    rc = sqlite3_exec(db, sql_delete, NULL, NULL, NULL);
    if(rc != SQLITE_OK)
    {
        printf("delete failure: %s\n", strerror(errno));
        return -1;
    }
}

int get_data(sqlite3 *db, Time *t_tmp)
{
    int rc = -1;
    char *sql_select;
    sql_select = "select *from temper limit 1";
    rc = sqlite3_exec(db, sql_select, callback, t_tmp, NULL);
    if(rc != SQLITE_OK)
    {
        printf("get_data failure:%s\n",strerror(errno));
        return -1;
    }
    else
    {
        return 1;
    }
}

int create_table(sqlite3 *db)
{
    int rc =-1;
    const char * creat = "create table temper("
        "ID  integer primary key autoincrement,"
        "DEVICE varchar(10), "
        "Data varchar(500),"
        "Temperature valchar(30));";
    rc = sqlite3_exec(db, creat, 0, 0, NULL );
    if(rc != SQLITE_OK)
    {
        printf("table already exit\n");
        return 1;
    }
    else
    {
        printf("Create table failure:%s\n",strerror(errno));
        return -1;
    }
}

void get_time(char *buf)
{
    struct tm *tm_ptr;
    time_t the_time;
    (void)time(&the_time);
    tm_ptr = gmtime(&the_time);
    sprintf(buf, "d-d-d  d:d:d",tm_ptr->tm_year 1900, tm_ptr->tm_mon 1, tm_ptr->tm_mday,(tm_ptr->tm_hour) 8, tm_ptr->tm_min, tm_ptr->tm_sec);
}

int callback(void *data, int argc, char **argv, char **azColName){
    int i;
    int ofset = 0;
    int rv = 0;
    Time *sq_data;
    sq_data = (Time*)data;
    memset(sq_data -> sed_del_buf, 0, sizeof(sq_data -> sed_del_buf));
    for(i=0; i<argc; i  )
    {
       rv = snprintf( (sq_data -> sed_del_buf)   ofset, sizeof(sq_data -> sed_del_buf) - ofset, "%s ", argv[i] ? argv[i] : "NULL");
       ofset  = rv;
    }
}

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhefca
系列文章
更多 icon
同类精品
更多 icon
继续加载