sqlite安装与封装后编译
========================安装sqlite=================
官网下载安装包*.tar.gz格式
./configure --prefix=/usr/server/sqlit 安装包目录
make
make install
测试安装成功 sqlite3 test.db
=======================编译====================
编译时 加入参数 -I /usr/server/sqlite/include
-L /usr/server/sqlite/lib
如果编译为静态 则 -static
gcc db.c test.c -o main -I /usr/server/sqlite/include -L /usr/server/sqlite/lib -lsqlite3
=======================源程序=================
网上找的
test.c
/*****************
对sqlite封装函数的测试
名称:test.c
*********************************/
#include <stdio.h>
#include "db.h"
int main(int argc, char *argv[])
{
char *dbname="dtmsg.db";
sqlite3 *db;
int iReturn=DbOpenDatabase(dbname,&db);
printf("-0->打开返回值%d<---\n",iReturn);
if(iReturn==1)
{
//新建table t_msg
char *sql="create table t_msg(msg,msg_buff)";
printf("-1-->新建sql语句 %s<--\n",sql);
int cReturn=DbChangeDataRecord(db,sql);
if (cReturn==-1)
return 0;
printf("-1-->执行新建返回值 %d<--\n",cReturn);
//增加、修改、删除
sql="insert into t_msg values ('test','测试信息11')";
//char * sql="update t_msg set msg_buff='测试信息2222222' where msg='test'";
//char * sql="delete from t_msg where msg='test'";
printf("-2-->%s<--\n",sql);
int iSqlRet=DbChangeDataRecord(db,sql);
printf("-3-->%d<--\n",iSqlRet); //查询
sql="select * from t_msg";
char **dbResult;
int nRow,nColumn,index;
int i,j;
int iQret=DbExecuteQuerySql(db,sql,&dbResult,&nRow,&nColumn);
if(iQret==1)
{
index=nColumn;
for( i = 0; i < nRow ; i++ )
{
printf( "第====================> %d 条记录\n", i+1 );
for( j = 0 ; j < nColumn; j++ )
{
printf( "字段名:%s ==>字段值:%s\n", dbResult[j],dbResult[index]?dbResult[index]:"" );
++index;
}
}
}
//不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放
//sqlite3_free_table( dbResult );
DbFreeResources(dbResult);
}
DbCloseDatabase(db);
return 1;
}
db.c
/*************************************************
File name: db.c
Description: C语言查询sqlite3数据库的基本操作封装
Others: 需要sqlite3的动态库 gcc -o db db.c -lsqlite3
*************************************************/
#include "db.h" /*************************************************
Function: DbOpenDatabase
Description: 打开sqlite3数据库
Input: strDbName:数据库名称;hDbCon:sqlite3的句柄
Output: 无
Return: 1,数据库打开成功;0,数据库打开失败
Others: 无
*************************************************/
int DbOpenDatabase(char *strDbName, sqlite3 **hDbCon)
{
int iRet = sqlite3_open(strDbName,hDbCon); //打开数据库
if(iRet != SQLITE_OK)
{
return 0;
}
else
{
return 1;
}
}
/*************************************************
Function: DbCloseDatabase
Description: 关闭sqlite3数据库
Input: hDbCon:sqlite3的句柄
Output: 无
Return: 无
Others: 无
*************************************************/
void DbCloseDatabase(sqlite3 *hDbCon)
{
sqlite3_close(hDbCon);
}
/*************************************************
Function: DbChangeDataRecord
Description: 向数据库进行插入、修改、删除操作
Input: hDbCon:sqlite3的句柄; strSql:sql语句;
Output: 无
Return: -1,插入(或修改或删除)失败;
大于-1,执行sql后,返回响应的行数
Others: 无
*************************************************/
int DbChangeDataRecord(sqlite3 *hDbCon,char *strSql)
{
char *pErrMsg = 0; //错误信息
int iRet = sqlite3_exec(hDbCon, strSql, NULL, NULL, &pErrMsg);
if(iRet != SQLITE_OK)
{
printf("查询失败,错误码==>:%d,错误原因==>:%s\n", iRet, pErrMsg);
return -1;
}
else
{
return iRet;
}
} /*************************************************
Function: DbExecuteQuerySql
Description: 查询数据库中的记录集
Input: hDbCon:sqlite3的句柄;strSql:sql语句;
Output: strResult:结果集;iRow:行;iColumn:列;
Return: 1,查询成功;0,查询失败
Others: 无
*************************************************/
int DbExecuteQuerySql(sqlite3 *hDbCon,
char *strSql,
char ***strResult,
int *iRow,
int *iColumn)
{
char *pErrMsg = NULL; //错误日志
int iReturn = 0;
int iResult = sqlite3_get_table( hDbCon,strSql, strResult, iRow, iColumn, &pErrMsg );
if( SQLITE_OK == iResult )
{
iReturn = 1;
}
else
{
iReturn = 0;
}
return iReturn;
}
/*************************************************
Function: DbFreeResources
Description: 不论数据库查询是否成功,都释放 char**
查询结果,使用 sqlite 提供的功能来释放
Input: strResult:结果集
Output: 无
Return: 无
Others: 无
*************************************************/
void DbFreeResources(char **strResult)
{
sqlite3_free_table( strResult );
}
db.h
/*************************************************
File name: db.h
Description: C语言查询sqlite3数据库的基本操作封装
Others: 无
*************************************************/ #ifndef DB_H
#define DB_H #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h> /*************************************************
Function: DbOpenDatabase
Description: 打开sqlite3数据库
Input: strDbName:数据库名称;hDbCon:sqlite3的句柄
Output: 无
Return: 1,数据库打开成功;0,数据库打开失败
Others: 无
*************************************************/
int DbOpenDatabase(char *strDbName, sqlite3 **hDbCon); /*************************************************
Function: DbCloseDatabase
Description: 关闭sqlite3数据库
Input: hDbCon:sqlite3的句柄
Output: 无
Return: 无
Others: 无
*************************************************/
void DbCloseDatabase(sqlite3 *hDbCon); /*************************************************
Function: DbChangeDataRecord
Description: 向数据库进行插入、修改、删除操作
Input: hDbCon:sqlite3的句柄; strSql:sql语句;
Output: 无
Return: -1,插入(或修改或删除)失败;
大于-1,执行sql后,返回响应的行数
Others: 无
*************************************************/
int DbChangeDataRecord(sqlite3 *hDbCon,char *strSql); /*************************************************
Function: DbExecuteQuerySql
Description: 查询数据库中的记录集
Input: hDbCon:sqlite3的句柄;strSql:sql语句;
Output: strResult:结果集;iRow:行;iColumn:列;
Return: 1,查询成功;0,查询失败
Others: 无
*************************************************/
int DbExecuteQuerySql(sqlite3 *hDbCon,
char *strSql,
char ***strResult,
int *iRow,
int *iColumn); /*************************************************
Function: DbFreeResources
Description: 不论数据库查询是否成功,都释放 char**
查询结果,使用 sqlite 提供的功能来释放
Input: strResult:结果集
Output: 无
Return: 无
Others: 无
*************************************************/
void DbFreeResources(char **strResult); #endif
/* Others: 需要sqlite3的动态库 gcc -o db db.c ./libsqlite3.so //还没弄懂
或 gcc -o db db.c -lsqlite3 //还没弄懂
*************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h> int DbOpenDatabase(char *strDbName, sqlite3 **hDbCon)
{
int iRet = sqlite3_open(strDbName,hDbCon); //打开数据库
if(iRet != SQLITE_OK)
{
return 0;
}
else
{
return 1;
}
} void DbCloseDatabase(sqlite3 *hDbCon)
{
sqlite3_close(hDbCon);
} int DbChangeDataRecord(sqlite3 *hDbCon,char *strSql)
{
char *pErrMsg = 0; //错误信息
int iRet = sqlite3_exec(hDbCon, strSql, NULL, NULL, &pErrMsg);
if(iRet != SQLITE_OK)
{
//printf("查询失败,错误码==>:%d,错误原因==>:%s\n", ret, errmsg );
return -1;
}
else
{
return iRet;
}
} int DbExecuteQuerySql(sqlite3 *hDbCon,
char *strSql,
char ***strResult,
int *iRow,
int *iColumn)
{
char *pErrMsg = NULL; //错误日志
int iReturn = 0;
int iResult = sqlite3_get_table( hDbCon,strSql, strResult, iRow, iColumn, &pErrMsg );
if( SQLITE_OK == iResult )
{
iReturn = 1;
}
else
{
iReturn = 0;
}
return iReturn;
} void DbFreeResources(char **strResult)
{
sqlite3_free_table( strResult );
} int DbSqliteCallBack(sqlite3 * hDbCon,const char *strSql,int (*QueryResultBack)())
{
char *pErrMsg;
int iRetDb = 0;
iRetDb = sqlite3_exec(hDbCon,strSql,QueryResultBack,NULL,&pErrMsg);
if(iRetDb != SQLITE_OK)
{
return 0;
}
return 1;
} //回调函数例子测试
/*static int QueryResultBack(void *para,int iColumn,char **cValue,char **cColumnValueName)
{
int iCn;
for(iCn = 0; iCn < iColumn; iCn++)
{
//printf( "%s = %s\n" , cColumnValueName[i], cValue[i] ? cValue[i] : "NULL" );
printf( "%s = %s\n" , cColumnValueName[i], cValue[i]);
}
return 0;
}*/ int main(int argc, char *argv[])
{
char *dbname="dtmsg.db";
sqlite3 *db;
int iReturn=DbOpenDatabase(dbname,&db);
printf("-1->%d<---\n",iReturn);
if(iReturn==1)
{
//增加、修改、删除
char *sql="insert into t_msg (msg,msg_buff) values ('test','测试信息11')";
//char * sql="update t_msg set msg_buff='测试信息2222222' where msg='test'";
//char * sql="delete from t_msg where msg='test'";
printf("-2-->%s<--\n",sql);
int iSqlRet=DbChangeDataRecord(db,sql);
printf("-3-->%d<--\n",iSqlRet); //查询
//char *sql="select * from t_msg";
sql="select * from t_msg";
char **dbResult;
int nRow,nColumn,index;
int i,j;
int iQret=DbExecuteQuerySql(db,sql,&dbResult,&nRow,&nColumn);
if(iQret==1)
{
index=nColumn;
for( i = 0; i < nRow ; i++ )
{
printf( "第====================> %d 条记录\n", i+1 );
for( j = 0 ; j < nColumn; j++ )
{
printf( "字段名:%s ==>字段值:%s\n", dbResult[j],dbResult[index]?dbResult[index]:"" );
++index;
}
}
}
//不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放
//FreeResources(dbResult);
sqlite3_free_table( dbResult );
}
DbCloseDatabase(db);
return 1;
}
sqlite安装与封装后编译的更多相关文章
- SQLite安装、编译与应用
什么是 SQLite SQLite是一款轻量级的.基于文件的嵌入式数据库,实现自包容.零配置.支持事务的SQL数据库引擎.与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下, ...
- sqlite 安装与编译
本文简述了SQLite的概念,并详细描述了SQLite在Linux和Windows平台下的编译方法 关于 SQLite SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 ...
- C++第三十四篇 -- 安装Windows Driver后,编译以前项目出现打不开lib文件
VS2017默认是没有安装WDK的,但是我们写驱动文件的话需要用到WDK.不过安装了WDK后,发现以前一些正常的项目在Release模式下编译会报LINK1104,无法打开.lib的错误 针对这个错误 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- sass安装:webpack sass编译失败,node-sass安装失败的终极解决方
文章来源:sass安装:webpack sass编译失败,node-sass安装失败的终极解决方 sass难言之隐-sass安装的坑 之前花了很多时间折腾node-sass,发现sass老是安装不上 ...
- 安装好php后,配置httpd以便支持php3脚本
Apache是目前应用最广的Web服务器,PHP是一种类似ASP的易学的脚本语言,而且性能和功能都比ASP要强,而MySQL又是一个Linux上应用最多的数据库系统,特别是用于网站建设,这3个软件均是 ...
- C++ 升级到 Vs2013后编译设置
编译 EasyDarwin 时,Vs2008的C++升级到 Vs2013时报错: 1. 找不到 windows.h 项目->属性->配置属性->C/C++->所有选项: 附加包 ...
- 在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便。通过安装VirtualBox提供的“增强功能组件”,-摘自网络
在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便.通过安装VirtualBox提供的“增强功能组件”,可以解决这一问题,并且使用非常方便. 一.环境 | En ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
随机推荐
- Linux 时间同步 04 ntp时间同步
Linux 时间同步 04 ntp时间同步 目录 Linux 时间同步 04 ntp时间同步 安装ntp 配置与外部时间服务器进行时间同步的客户端主机 配置其他客户端与以上客户端主机时间同步 验证查看 ...
- JVM——GC(垃圾回收)算法
一.垃圾回收的基本概念 垃圾回收(GC,Garbage Collection),指内存中不会再被使用的对象清理掉. 垃圾回收有很多种算法:如引用计数法.标记压缩法.复制算法.分代/分区的思想 二.垃圾 ...
- 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令
小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...
- LOG_PATH_IS_UNDEFINED
问题: SpringBoot + LogBack 写日志,除了正常的日志之外,程序跑起来后会在项目根目录多生成一个 LOG_PATH_IS_UNDEFINED 的文件夹,我的配置是以下: applic ...
- C语言几种排序算法
(1)选择排序算法:选择排序算法是,将第一个数和其它的数比较,将较小的数(从小到大的排列)和第一个数换位,以此类推 #include<stdio.h> int main() { int i ...
- Modbus 协议图文详解
1.概论 Modbus是一种串行通信协议,由于其协议简单易用,且没有版权要求,目前已经成为工业领域通信协议的实时标准.ModBus协议是又施耐德电气的前身Modicon公司在1979年提出的.Modb ...
- chatsRoom Design Report
基于TCP实现聊天室 主要使用四个类 ChatClient类 使用BufferedReader 得到输入流,使用OutputStream得到输出流 实现读取服务器广播的消息和发送消息到 ...
- Python requirements.txt 语法
前言 之前一直苦于一个问题,比如一些包在Win上安装不了,比如 uvloop 但是为了提高效率,代码中必须有这个模块 在运行中可以通过 os 模块判断是否使用, 那依赖文件呢? requirement ...
- 剑指offer 面试题7:重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- Kubernetes K8S之kube-prometheus概述与部署
Kubernetes K8S之kube-prometheus概述与部署 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7. ...