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

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

文章目录

    • C语言实现sqlite3创建表格,插入数据,获取数据
    • 1-接口API
    • 2-sqlite3_open()
    • 3-sqlite3_exec()
    • 4-sqlite3_close()
    • 5-回调函数
    • 6-代码示例

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

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

6-代码示例

#include 
#include 
#include 
#include 
#include 

/*回调函数*/
static int callback(void *data, int argc, char **argv, char **azColName){
    int i;
    for(i=0; itm_year+1900, tm_ptr->tm_mon+1, tm_ptr->tm_mday,(tm_ptr->tm_hour)+8, tm_ptr->tm_min, tm_ptr->tm_sec);
}

C语言实现sqlite3创建表格,插入数据,查看数据_第1张图片

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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, "%02d-%02d-%02d  %02d:%02d:%02d",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;
    }
}

你可能感兴趣的:(Sqlite3,C语言,sqlite,数据库,c语言,sqlite3,linux)