前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作。

使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据库源码的文件打包成库文件.so放到ubuntu函数库(/bin)目录下,并且把linux数据库sqlite中的.sh文件拷贝到/usr/include目录中。

第一步:把.c文件生成.o文件

gcc -fPIC -o sqlite3.o -c sqlite3.c -lpthread -ldl

第二步:把.o文件生成.so文件

gcc -shared -fPIC -o libsqlite3.so sqlite3.o -lpthread -ldl

第三步:把生成的.so文件拷贝都ubuntu的/lib目录下,方便以后使用

sudo cp libsqlite3.so /lib/

第四步:把.sh文件拷贝到/usr/include/目录下,如果前面已经做过这一步了,可以不做

sudo cp *.h /usr/include/ 

到这里我们使用c语言实现linux数据库操作的环境就搭建好。

下面我们来看看用c语言实现linux数据库操作要用到的几个主要的接口,当然我们还可以上sqlite的官网去看更多的API接口。

1、打开数据库

int sqlite3_open(
const char *filename, /* 数据库名 ,如果数据库不在同一目录下请写上绝对路径*/
sqlite3 **ppDb /* 数据库句柄 */
); 返回值:成功:SQLITE_OK
失败:SQLITE_ERROR

2、执行操作指令(可实现回调查询,前提是第三个参数不能为空)

int sqlite3_exec(
sqlite3*, /* 数据库句柄 */
const char *sql, /* 执行的语句(执行的命令行) */
int (*callback)(void*,int,char**,char**), /* 回调函数(可设为NULL) */
void *, /* 1st argument to callback(可设为NULL) */
char **errmsg /* 错误信息(可设为NULL)*/
);
返回值:成功:SQLITE_OK
失败:SQLITE_ERROR

3、回调函数查询(自定义实现)

int callback(void*,int,char**,char**)
参数:
void* --由sqlite3_exec函数的第四个参数
int---查询的数据有多少列
char** ----每一列的值
char**----每一列的名字

4、非回调查询

int sqlite3_get_table(
sqlite3 *db, /* 数据库句柄 */
const char *zSql, /* 查询指令 */
char ***pazResult, /* 存储查询到的结果 */
int *pnRow, /* 存储查询到的行数*/
int *pnColumn, /* 存储查询到的列数 */
char **pzErrmsg /* 存储错误信息 */
);

5、释放所占用空间

void sqlite3_free_table(char **result);
//result为调用了sqlite3_get_table后pazResult中的数据

6、关闭表格

int sqlite3_close(sqlite3*);

下面是代码示例

  #include <sqlite3.h>
#include <stdio.h>
#include <string.h> /*定义此宏时使用回调函数查询,否则使用非回调函数查询*/
#define CALLBACK //如果查询到多行数据, 那么这个函数就会调用多次(每一行调用一次)
int callback(void *arg, int col, char **value, char **name)
{
int i=;
for(i=;i<col; i++)
{
printf("%s\t", value[i]);
}
printf("\n");
return ;
} int main(void)
{
//1.打开数据库
sqlite3 *ppdb = NULL;
int ret = sqlite3_open("./mysql.db", &ppdb); //打开一个当前目录下名为mysql.db的数据库
if(ret != SQLITE_OK)
{
perror("open fail");
return -;
} //执行sql语句,创建一个表格
char *sql="create table IF not EXISTS myname(id integer primary key, name text)";
ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);
if(ret != SQLITE_OK)
{
perror("create fail");
sqlite3_close(ppdb);
return -;
} //插入数据
char name[] ={};
int id = ;
while()
{
printf("please input name and id:"); scanf("%s %d", name, &id);
if(id == )break; //输入q退出插入数据
char *insert = "insert into myname values(%d, '%s')";
char insql[strlen(insert) + strlen(name) + ];
sprintf(insql, insert, id, name); ret = sqlite3_exec(ppdb, insql, NULL, NULL, NULL);
if(ret != SQLITE_OK)
{
perror("exec fail");
sqlite3_close(ppdb);
return -;
}
} #ifdef CALLBACK
//回调查询
char *selectsql = "select * from myname";
ret = sqlite3_exec(ppdb, selectsql, callback, NULL, NULL);
if(ret != SQLITE_OK)
{
perror("create fail");
sqlite3_close(ppdb);
return -;
} //非回调查询
#else
char *sql2 = "select * from myname";
char **result = NULL;
int row = ;
int col = ;
char *error = NULL;
ret = sqlite3_get_table(ppdb,sql2,&result,&row,&col,&error);
if(ret != SQLITE_OK)
{
perror("get table fail");
return -;
}
int i=, j=;
for(i=;i<row+;i++)
{
for(j=;j<col;j++)
{
printf("%s\t",result[j+i*col]);
}
printf("\n");
}
sqlite3_free_table(result);//释放结果
#endif sqlite3_close(ppdb);
return ;
}

编译代码:

gcc -o mysqlite3 mysqlite3.c -lsqlite3

先创建一个叫mysql.db的库

sqlite3 mysql.db

运行结果如下:

使用c语言实现linux数据库的操作的更多相关文章

  1. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

  2. Linux centos 7/ubantu下: 用 C 语言连接 MySQL数据库

    前言:最近用IPC.socket做ATM.聊天项目,考虑到需要用到数据库,所以总结一下centos.ubantu环境下怎么用C语言操作数据库,例如常见的增删改查等! 一.Centos环境安装mysql ...

  3. 新手学python(2):C语言调用完成数据库操作

    继续介绍本人的python学习过程.本节介绍如何利用python调用c代码.内容还是基于音乐信息提取的过程,架构如图一.Python调用c实现的功能是利用python访问c语言完成mysql数据库操作 ...

  4. linux c编程操作数据库(sqlite3应用)

     首先pThread 不是linux系统默认库,连接的时候需要使用库libpthread.a. 加入-lpthread参数.另外会有lopen什么找不到的情况.加入-ldl 指定目录.Project_ ...

  5. 利用workbench对linux/Ubuntu系统中的mysql数据库进行操作

    在上一篇文章中,我分享了在linux中如何安装mysql数据库,但是这只是安装了mysql的服务,并没有图形化管理界面,所以这样子操作起来并没有那么方便,那么现在我们就来实现如何利用在window中安 ...

  6. 【Linux】Ubuntu下C语言访问MySQL数据库入门

    使用的系统是Ubuntu 11.10.数据库是MySQL. MySQL数据库环境配置 首先需要安装MySQL客户端和服务器,命令行安装方式为: sudo apt-get install mysql-s ...

  7. Linux 数据库操作(一)

    我们可以将用于数据服务的数据库分为关系型数据库和非关系型数据库,关系型数据库最典型的就是Mysql,以及和他同源的MariaDB数据库,oracle等,非关系型数据库则有redis数据库,mongod ...

  8. linux下的mongodb数据库原生操作

    mongodb,是一种结构最像mysql的nosql mysql中的数据库,mongodb中也有,区别在于, myql中数据库下的是表,字段和数据的形式存在 mongodb数据库下的是叫集合(和pyt ...

  9. Java语言访问Redis数据库之Set篇

    如果想通过Java语言对Redis数据库进行访问. 首先,需要安装Redis数据库,可以是Windows系统,或者Linux系统.(本文以Windows系统的本地Redis数据库为例,代码说明如何操作 ...

随机推荐

  1. .net 图片无损压缩

    命名空间: using System.Drawing.Imaging; using System.Drawing; using System.Drawing.Drawing2D; #region Ge ...

  2. 英式英语VS美式英语

  3. 1-安装MQTT服务器(Windows)

    对于不知道MQTT的肯定会问MQTT是干什么的....... 现在我有一个项目需求, 看到这个项目第一想法肯定需要一个服务器,所有的wifi设备和手机都去连接这个服务器,然后服务器进行信息的中转,类似 ...

  4. Docker(十):Docker安全

    1.Docker安全主要体现在如下方面 a)Docker容器的安全性 b)镜像安全性 c)Docker daemon安全性 2.安装策略 2.1 Cgroup Cgroup用于限制容器对CPU.内存的 ...

  5. 微信小程序如何开发制作

    微信小程序如何开发制作 微容SMO是一款微信小程序的免费在线制作工具,用户在微容平台上无需编辑代码,可通过拖拽式操作即可完成小程序的制作,真正意义上实现了小程序零代码免费制作! 消除技术门槛:无需代码 ...

  6. centos7 系统安装问题汇总

    centos7 系统安装问题汇总: 1.使用u盘 安装centos7时,一直提示:'.../dev/root  does not exist,could not boot' 解决方法: 2.不能将原来 ...

  7. unity图片后期处理

    处理算法如下,在Start方法中分别调用想要的效果就行了.其中,将你需要处理的 图片 拖拽到 image参数上.注意,如果想要图片保持原来的尺寸不被压缩,需要更改图片的导入设置如下图,主要的Textu ...

  8. C#实现冲顶大会辅助工具 (截图+图像识别+搜索)

    前两天在博客园看到 .NET开发一个微信跳一跳辅助程序, 原来可以通过C#连接手机操作.正好朋友圈有人分享"冲顶大会".冲顶大会是一个在线答题APP.每次12道题,每道题有10秒钟 ...

  9. Spark监控官方文档学习笔记

    任务的监控和使用 有几种方式监控spark应用:Web UI,指标和外部方法 Web接口 每个SparkContext都会启动一个web UI,默认是4040端口,用来展示一些信息: 一系列调度的st ...

  10. UTC 通用格式时间 转换为 时间戳,并格式化为2017-01-01 12:00:00

    在使用阿里云oss获取文件列表是,发现时间格式是这样的 2016-09-20T13:45:04.000Z (尼玛,是什么鬼), 经过度娘的解答,发现这就是传说中的 UTC通用格式时间 问题来了,怎么转 ...