MFC之sqlite
引用头文件和将生成的SQLite.dll加载到项目中
#include "sqlite3.h"
1.动态加载sqlite
//***********************数据库动态加载*****************************//
typedef int (SQLITE_STDCALL *psqlite3_open)(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
); typedef int (SQLITE_STDCALL *psqlite3_get_table)(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
typedef void (SQLITE_STDCALL *psqlite3_free_table)(char **result); typedef int (SQLITE_STDCALL *psqlite3_exec)(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
); typedef void (SQLITE_STDCALL *psqlite3_free)(void*); typedef int (SQLITE_STDCALL *psqlite3_close)(sqlite3*); psqlite3_open sql_open=NULL;
psqlite3_exec sql_exec=NULL;
psqlite3_close sql_close=NULL;
psqlite3_get_table sql_get_table=NULL;
psqlite3_free_table sql_free_table=NULL;
psqlite3_free sql_free=NULL;
2.转换函数
HINSTANCE hInst=LoadLibrary(L"\\NANDFlash\\SQLite.dll");//动态加载Dll sql_open=(psqlite3_open)GetProcAddress(hInst, _T("sqlite3_open"));
sql_exec=(psqlite3_exec)GetProcAddress(hInst, _T("sqlite3_exec"));
sql_close=(psqlite3_close)GetProcAddress(hInst, _T("sqlite3_close"));
sql_get_table=(psqlite3_get_table)GetProcAddress(hInst, _T("sqlite3_get_table"));
sql_free_table=(psqlite3_free_table)GetProcAddress(hInst, _T("sqlite3_free_table"));
sql_free=(psqlite3_free)GetProcAddress(hInst, _T("sqlite3_free"));
3.使用
//读取裂纹数据库文件并保存到裂纹数组中 sqlite3 * db = NULL; //声明sqlite关键结构指针
int result;
// 打开或创建数据库
result = sql_open("\\NANDFlash\\sqlite.db", &db );
if( result != SQLITE_OK )
{
//数据库打开失败
return -1;
} char **dbResult;
int nRow, nColumn;
char * errmsg = NULL; //查找 LiewenMes 表是否已有
sql_get_table(db, "SELECT * FROM sqlite_master where type='table' and name='LiewenMes'", &dbResult, &nRow, &nColumn, NULL);
if(nRow>0)
{
// 表已经存在,查询数据表
const char * sSQL3 = "select * from LiewenMes;";
// 不用回调函数的查询
char **dbResult1;
if(SQLITE_OK == sql_get_table( db, sSQL3, &dbResult1, &nRow, &nColumn, &errmsg ))
{
//dbResult1 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据
// dbResult1 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,
//后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示 int index = nColumn;
num_liewen=0;//裂纹个数置0
for(int i = 1; i <= nRow ; i++)
{ lw_jc_bianhao[num_liewen]=dbResult1[index++];
lw_cgq_bianhao[num_liewen]=dbResult1[index++];
lw_cgq_id[num_liewen]=dbResult1[index++];
lw_cgq_weizhi[num_liewen]=dbResult1[index++];
lw_weizhi[num_liewen]=dbResult1[index++];
lw_ry_name[num_liewen]=dbResult1[index++];
lw_cgq_date[num_liewen]=dbResult1[index++]; num_liewen++;
}
}
//不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放
sql_free_table( dbResult1 );
}else{
// 执行建表SQL const char * sSQL1 ="create table LiewenMes(liewen_jc_bianhao nvarchar(32),liewen_cgi_bianhao nvarchar(32),liewen_cgq_id nvarchar(50),liewen_cgq_locate nvarchar(32),liewen_lw_locate nvarchar(32),liewen_ry_name nvarchar(32),date_now DATETIME)";
result = sql_exec( db,sSQL1,0, 0, &errmsg ); if(result != SQLITE_OK )
{
printf("创建表失败,错误码:%d,错误原因:%s\n", result, errmsg );
sql_free(errmsg);
} }
sql_free_table( dbResult ); // 关闭数据库
sql_close( db );
db=0;
4.将 按照(http://blog.csdn.net/educast/article/details/8263468)制作的SQLite.lib SQLite.dll拷贝到wince系统的运行目录的路径下,即:\\NANDFlash\\
MFC之sqlite的更多相关文章
- MFC使用SQLite 学习系列 一: SQLITE_MISUSE错误
一 为什么要选择SQLite 由于使用文本文件来记录测试数据,速度越来越慢的问题,经过园友推荐,使用了SQLite来进行数据的存储,再次感谢园友@LightSmaile. 关于这个问题,可以参考一下上 ...
- MFC中SQLite数据库的使用
1打开数据库 BOOL playDlg::openData() { WCHAR a[100]; CString path; path = m_exePath+L"sentence_makin ...
- MFC使用SQLite 学习系列 二:无法容忍的数据插入效率
上一篇随笔中,介绍了,基本的使用没什么问题了,那么开始数据的插入. 一 问题--无法容忍的插入效率 代码写入基本完成,然后开始测试.起初,插入数据的时候基本上是插入每次插入9组数据,看不出来数据插入的 ...
- sqlite与C++进行连接
SQLite数据库是零配置的,sqlite数据库不同于SqlServer等数据库,SQLite不需要复杂配置,只需要,将SQLite的库文件和动态链接文件拷贝到相应工程目录下,就可以使用SQLite数 ...
- SQLite安装、编译与应用
什么是 SQLite SQLite是一款轻量级的.基于文件的嵌入式数据库,实现自包容.零配置.支持事务的SQL数据库引擎.与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下, ...
- C++ 使用SQLite
1.SQLite是一个完全独立的.不需要服务器.不要任何配置.支持SQL的.开源的文件数据库引擎.源代码和支持可以登录:http://www.sqlite.org/ 1.1.下载sqlite3.d ...
- 在MFC中支持sqlite3
在vc环境下支持sqlite3的方法有很多,sqlite官网也有推荐sqlitewrappers列表,我选用的是CppSqlite 建立MFC工程的步骤我就不赘述了,以下操作均假设你已经创建好了一个M ...
- VC++、MFC Sqlite3数据库的使用
SQLite数据库是一种本地的轻型数据库,在存储一些本地的数据的时候,或者不需要用到Oracle,SQL2008之类的大型数据库的时候,Sqlite的优势就能够得到发挥.程序需要采集数据存储起来,可以 ...
- MFC小程序------01 代码管理器
1.代码入库: 2.代码查找: 3.查看全部代码: 4.程序设置: 自己学习MFC写的一个小程序,当中还有很多功能还待完好,比方数据库的导入功能还没有写,但导出功能是能够用的,查找算法也不是非常好,还 ...
随机推荐
- # 20175120 2018.3.3 《Java程序设计》第1周学习总结
## 教材学习内容总结 1.安装ubuntu,在实验楼学习liunx系统各种功能的实现.2.在ubuntu平台上进行java程序的编写3.学会使用JDB调试java程序,并将代码上传到码云上4.学习j ...
- A New Function(LightOJ 1098)积性函数前缀和的应用
题意:要求对于1~n,每个数的约数(不包括1和其本身)的和. 题解:由于题目数据有2*10^9之大,因而不能直接暴力.需要考虑积性函数的特性,由于必定有重复的约数出现,因而可以对重复约数所在的区间进行 ...
- [CSL 的魔法][求排序最少交换次数]
链接:https://ac.nowcoder.com/acm/contest/551/E来源:牛客网题目描述 有两个长度为 n 的序列,a0,a1,…,an−1a0,a1,…,an−1和 b0,b1, ...
- JavaScript 堆排序详解
堆通常实现为全完二叉树,二叉堆一般分为两种:最大堆和最小堆.堆排序就是通过将数组转换成最大堆结构再进行排序. // 原理:把数组转换成最大堆来排序.把堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次 ...
- ios-改变图片的尺寸
//改变图片的尺寸 -(UIImage*) OriginImage:(UIImage *)image scaleToSize:(CGSize)size { UIGraphicsBeginImageCo ...
- telnet-redis-quit
很多时候 telnet 完就无法退出了,ctrl+c 有时也无法退出后来找到了正确的命令 ctrl+] 然后在telnet 命令行输入 quit 就可以退出了 telnet Trying 10.168 ...
- url集合
restful方面 Java后台框架篇--Spring与Restful风格API接口开发 https://blog.csdn.net/hello_worldee/article/details/781 ...
- day053 url反向解析图解 模板渲染
一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用 {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...
- 谈谈 ServerFul 架构
我写了一篇文章 <自己实现一个线程池> https://www.cnblogs.com/KSongKing/p/9803935.html , 其实 不仅仅 是 线程池, 中间件 层 的 ...
- socket资源
http://www.360doc.com/content/13/1231/16/14919052_341525862.shtml Linux下基于socket多线程并发通信的实现 https://w ...