ubuntu下C语言调用sqlite3数据库实现增删查改

ubuntu下C语言调用sqlite3数据库实现增删查改

Ubuntu下安装sqlite3数据库以及使用

$ sudo apt-get install sqlite3 //安装命令
$ sqlite3 --version //查看安装的版本
安装成功的sqlite3数据库$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;
}

运行结果

介绍有不足之处请指教。

发布了26 篇原创文章 · 获赞 11 · 访问量 622

猜你喜欢

转载自blog.csdn.net/weixin_38251305/article/details/90371464
今日推荐