C语言实现sqlite3创建表格,插入数据,查看数据
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
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13