ubuntu下C语言调用sqlite3数据库实现增删查改
Ubuntu下安装sqlite3数据库以及使用
$ sudo apt-get install sqlite3 //安装命令
$ sqlite3 --version //查看安装的版本
$sqlite3 student.db //创建数据库student.db
$create table stu(id int,name char); //创建一个数据表
$.table //查看数据库中的数据表
$.schema //查看创建语句
$insert or replace into stu(id,name)values(10001,‘张三’);//以更新的方式向表中插入一条数据记录
$select *from stu; //查看表记录
$delete from stu where id = 10001 //删除数据
$update stu set name =‘王五’ //更新数据#接下来是用C语言实现增删查改功能的完整程序代码。
头文件
sqlite3.h
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#ifndef PRACTICE_DICT2_H_
#define PRACTICE_DICT2_H_
#if defined(__cplusplus) & __cplusplus
extern "C" {
#endif
#define ssize_t int //定义int别名
/**
* 容器数据结构
*/
typedef struct tagDICT2
{
/**
* 向容器插入一条数据。
*
* @return 成功插入返回0,重复插入返回0,失败返回-1。
*/
int
(*insert)(struct tagDICT2 *dict, const char *id, const char *content);
/**
* 从容器中移除一条指定的数据。
*
* @return 移除成功返回0,否则返回-1。
*/
int
(*remove)(struct tagDICT2 *dict, const char *id);
/**
* 返回容器索引的条目数。
*/
ssize_t
(*length)(struct tagDICT2 *dict);
/**
* 按字符串查找到该索引上的数据。
*
@return 若对应索引上有字符串则把字符串拷贝到缓冲长度为stacklen的stack的缓冲中并返回字符串的长度,\n
* 否则返回-1。
*/
ssize_t
(*lookup)(struct tagDICT2 *dict, const char *id, char *stack, size_t stacklen);
/**
* 按顺序打印容器中的索引以及数据。
*
* @return 无。
*/
void
(*dump)(struct tagDICT2 *dict);
/**
* 清空容器内的所有索引数据。
*
* @return 无。
*/
void
(*empty)(struct tagDICT2 *dict);
sqlite3 *db;
struct tagDICT2 *next;
}stDICT2 ,*pstDICT2;
/**
* 创建容器。
*
* @param[in] dbPath 数据库文件所在路径。
*
* @retval 容器句柄 创建成功。
* @retval NULL 创建失败。
*/
/*
extern pstDICT2
DICT2_create(const char *dbPath);*/
extern pstDICT2
DICT2_create();
/**
* 释放容器。
*
* @param[in] dict 容器句柄。
*
* @return 无。
*/
extern void
DICT2_release(struct tagDICT2 *dict);
#if defined(__cplusplus) & __cplusplus
}
#endif
#endif
源代码
sqlite3.c
/**
* 使用SQLITE辅助实现。
* http://www.sqlite.com/
*/
#include "dict2.h"
#include "sqlite3.h"
#define DATABASE "stu.db"
//插入数据
static int
dict_insert(struct tagDICT2 *dict, const char *id, const char *content)
{
if((!content)||(!id))
{
return -1;
}
char sql[128] = {};
char *errmsg;
sprintf(sql,"insert or replace into stu values('%s','%s');",id,content);//sql插入数据表记录语句
if(sqlite3_exec(dict->db,sql,NULL,NULL,&errmsg)!= SQLITE_OK)//执行语句
{
printf("%s\n",errmsg);
}
else
{
printf("Insert done\n");
}
return 0;
}
//移除数据库内容
static int
dict_remove(struct tagDICT2 *dict, const char *id)
{
char sql[128] = {};
char *errmsg;
sprintf(sql,"delete from stu where id='%s';",id);//sql 删除语句
if(sqlite3_exec(dict->db,sql,NULL,NULL,&errmsg)!= SQLITE_OK)//执行语句
{
printf("%s\n",errmsg);
}
else
{
printf("Delete done.\n");
}
return 0;
}
//回调函数
int callback(void *para,int f_num,char **f_value,char **f_name)
{
int i = 0;
for(i = 0;i< f_num;i++)
{
printf("%-11s ",f_value[i]);
}
putchar(10);
return 0;
}
//长度
static ssize_t
dict_length(struct tagDICT2 *dict)
{
char sql[128] = {};
char *errmsg;
printf("length is ");
sprintf(sql,"select count(*) from stu;");//sql 计算长度语句
if(sqlite3_exec(dict->db,sql,callback,NULL,&errmsg)!= SQLITE_OK)//执行语句
{
printf("%s\n",errmsg);
}
else
{
printf("Length done\n");
}
return 0;
}
//索引
static ssize_t
dict_lookup(struct tagDICT2 *dict, const char *id, char *stack, size_t stacklen)
{
char sql[128] = {};
char *errmsg;
sprintf(sql,"select * from stu where id='%s';",id);//sql按索引id查询语句
if(sqlite3_exec(dict->db,sql,callback,NULL,&errmsg)!= SQLITE_OK)//执行语句
{
printf("%s\n",errmsg);
}
else
{
printf("Index done.\n");
}
return 0;
}
//遍历
static void
dict_dump(struct tagDICT2 *dict)
{
char sql[128] = {};
char *errmsg;
sprintf(sql,"select * from stu;");//sql查询语句
if(sqlite3_exec(dict->db,sql,callback,NULL,&errmsg)!= SQLITE_OK)//执行语句
{
printf("%s\n",errmsg);
}
else
{
printf("Query done.\n");
}
// return 0;
}
//初始化
pstDICT2
DICT2_create()
{
pstDICT2 dict = (pstDICT2)calloc(sizeof(stDICT2), 1);
// TODO
if(!dict)
{
return NULL;
}
char *errmsg;
//用sqlite3_open打开一个数据库容器
if(sqlite3_open(DATABASE,&dict->db) != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(dict->db));
return NULL;
}
else
{
printf("Open DATABASE success.\n");
}
//创建数据的表stu,列表项为索引id 和索引相关的内容content
if(sqlite3_exec(dict->db,"create table stu(id char primary key not null,content char);",NULL,NULL,&errmsg)!= SQLITE_OK)//执行语句
{
printf("%s\n",errmsg);
}
else
{
printf("create table or open success.\n");
}
//接口
dict->insert = dict_insert;
dict->remove = dict_remove;
dict->length = dict_length;
dict->lookup = dict_lookup;
dict->dump = dict_dump;
dict->next = NULL;//next指针域为空
return dict;
}
//释放空间和句柄
void
DICT2_release(struct tagDICT2* dict)
{
if(!dict)
{
return;
}
// TODO
free(dict);
sqlite3_close(dict->db);
dict = NULL;
}
ubuntu下C语言调用sqlite3数据库实现增删查改ubuntu下C语言调用sqlite3数据库实现增删查改
下面是main.c文件调用
#include "sqlite3.h"
int
main(int argc, char *argv[])
{
int cmd;
pstDICT2 dict = NULL;
int i=0;
char text[512];
char id[200]={};
char content[200]={};
dict = DICT2_create();
while(1)
{
printf("..................................................\n");
printf("1,insert 2,remove 3,length 4,lookup 5,dump 6,quit \n");
printf("..................................................\n");
printf("..........please enter your choice(1-6):");
scanf("%d",&cmd);
getchar();
switch(cmd)
{
case 1:
printf("Input id:");
scanf("%s",&id);
printf("Input content:");
scanf("%s",&content);
dict->insert(dict,id,content);
break;
case 2:
printf("Input id:");
scanf("%s",&id);
dict->remove(dict,id);
break;
case 3:
dict->length(dict);
break;
case 4:
printf("Input id:");
scanf("%s",&id);
dict->lookup(dict,id,text,sizeof(text));
break;
case 5:
dict->dump(dict);
break;
case 6:
DICT2_release(dict);
//sqlite3_close(dict->db);
exit(0);
break;
default:
printf("Error cmd.\n");
}
}
return 0;
}
运行结果
有不足之处请指教。