VC++、MFC Sqlite3数据库的使用
SQLite数据库是一种本地的轻型数据库,在存储一些本地的数据的时候,或者不需要用到Oracle,SQL2008之类的大型数据库的时候,Sqlite的优势就能够得到发挥。程序需要采集数据存储起来,可以使用这个数据库。或者觉得ini文件,txt文件在存储的过程中,数据的组织比较困难可以使用这个数据库。
同时如果是涉及嵌入式系统,SQLite的便捷性能够得到更好的体现。他将所有的方法都包含在了三个文件中:
sqlite3.h
sqlite3.c
sqlite3ext.h
附下载地址:链接:http://pan.baidu.com/s/1qYawfFY 密码:l7fq
地址失效可以私信。
在使用的过程中,最简单的办法是,你可以直接将三个文件全部添加到相应的工程中,在引用头文件之后,你就可以使用其中的方法了。
其中的增删改查可以参考如下代码使用:但是要注意自己应该添加和完善一些功能
sqlite3 *db=NULL;char *zErrMsg = 0;int rc;//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件rc = sqlite3_open("zsl.db", &db);if( rc ){CString temp1;temp1.Format(_T("Can’t open database: %s\n"), sqlite3_errmsg(db));TRACE(temp1);//fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db);return (1);}elseTRACE("You have opened a sqlite3 database named zsl.db successfully!\n");//创建一个表,如果该表存在,则不创建,//并给出提示信息,存储在zErrMsg 中char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );//插入数据 sql = "INSERT INTO \"test\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0; //查询结果集的行数、列数char **azResult; //二维数组存放结果//查询数据 sql = "SELECT * FROM test ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( "row:%d column=%d \n" , nrow , ncolumn );printf( "\nThe result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//删除数据 sql = "DELETE FROM test WHERE AGE = 1 ;" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );//释放掉azResult 的内存空间 sqlite3_free_table( azResult );sqlite3_close(db); //关闭数据库int c=getchar();return 0; }
值得注意的地方,在于在使用sqlite3 的时候,你会发现存储的过程中会出现中文的乱码,那是因为,SQLite3数据库默认的编码格式为UTF-8,所以在使用之前,需要对你的格式进行转换。
以VC++ MFC为例,如果你的程序使用的是默认Unicode编码,那么只需要Unicode->UTF-8的转换,如果你是使用的多字节字符集,那么系统默认的编码格式应该是Ansi,这时候,你需要将编码从Ansi转换到Unicode,然后从Unicode转换到UTF-8。
因为我的工程中使用的多字节,所以我这里先贴出一个Ansi转换为UTF-8的代码:
//Ansi To Utf-8 Utf-8 To Ansi char* *****::AnsiToUtf8(char* stransi) {//Ansi to Unicodeint wcsLen = ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),NULL,0);wchar_t* strunicode = new wchar_t[wcsLen+1];::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),strunicode,wcsLen);strunicode[wcsLen] = '\0';//Unicode To UTF-8int utf8len = ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);char* strutf8 = new char[utf8len+1];::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),strutf8,utf8len,NULL,NULL);strutf8[utf8len] = '\0';delete [] strunicode;strunicode = NULL;return strutf8;} char* ***::Utf8ToAnsi(char* strutf8) {//UTF-8 To Unicodeint wlen = ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),NULL,0);wchar_t* strunicode = new wchar_t[wlen+1];::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),strunicode,wlen);strunicode[wlen] = '\0';//Unicode To Ansiint ansilen = ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);char* szAnsi = new char[ansilen+1];::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),szAnsi,ansilen,NULL,NULL);szAnsi[ansilen] = '\0';delete [] strunicode;strunicode = NULL;return szAnsi; }
注意这段代码中,使用了2个new,但是只delete了一个,这里需要你在使用完成转换后的字符串,进行手动delete,否则可能造成内存泄漏。。
转换完成之后的显示,中文就不是乱码。
最后附上一个工具,用来查看sqlite的数据库的内容,但是因为我的电脑上的安装包没有了,所以这里只留下一个名字好了,等到之后有机会再补上链接。
名字:Navicat premium 以及他的补丁
图标是这样的:
打开之后就可以查看你创建的SQLite数据库的文件,很方便可以检查你代码的正确或者错误
连接补完计划:
链接:http://pan.baidu.com/s/1pKELaSb 密码:icay
失效私信我,或者邮箱452875117@qq.com
转载于:https://www.cnblogs.com/fudong071234/p/6424856.html
VC++、MFC Sqlite3数据库的使用相关推荐
- VC++使用事务来写SQLite3数据库
如果使用VC++使用事务来写SQLite3数据库,首先要先能写库,这篇文章分为两部分,第一部分是怎么来写SQLite3数据库,第二部分怎么使用事务来写库. 第一部分写SQLite3数据库 SQLite ...
- VC++对Access数据库的操作(查询、插入、更新、删除等)
Microsoft Office Access是由微软发布的关系数据库管理系统.Access数据库常应用于小型软件系统中,比如:生产管理.销售管理.库存管理等各类企业管理软件,其最大的优点是:简单易学 ...
- oledb vc访问mdb数据库_vc实战oledb编程
VC 中用 ADO 和 DataGrid 控件显示和更新数据库中的数据分类: VC 编程 2010-07-06 15:58 1157 人阅读 评论(0) 收藏 举报 VC 中用 ADO 和 DataG ...
- VC++ MFC 多线程及线程同步(详细、全面总结!)
更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC 多线程及线程同步 ...
- VC/MFC QA 200407
CSDN 讨论总结系列: Jiangsheng的CSDN Digest (Dec 2005)(http://blog.csdn.net/jiangsheng/archive/2005/12/24/56 ...
- 【数据库】sqlite3数据库备份、导出方法汇总
[数据库]sqlite3常用命令及SQL语句 目录 1.直接拷贝数据库 2.使用.backup .clone 1)交互式 2)脚本 3.导出到csv文件中(其它格式类似) 1)交互式 2)脚本 3)导 ...
- c从sqlite3数据库中获取数据,并对数据进行拼接
c从sqlite3数据库中获取数据,并对数据进行拼接 函数功能 对数据库的操作 创建数据库: 创建USER表: 创建表内数据: 查看表内数据: 查看表结构: 函数实现 函数编译: 函数结果: 函数功能 ...
- 【Android 逆向】应用数据目录 ( files 数据目录 | lib 应用自带 so 动态库目录 | databases sqlite3 数据库目录 | cache 缓存目录 )
文章目录 一.应用数据目录 /data/data/package.name/files 二.自带 so 动态库 /data/data/package.name/lib 三.数据库文件 /data/da ...
- VC++ MFC DLL动态链接库编写详解
虽然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建.本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们. 一.DLL的不同类型 使用VC++可以生成 ...
- VC/MFC中常用宏的含义
VC/MFC中常用宏的含义 Visual C++ MFC 中常用宏的含义(转载) AND_CATCHAND_CATCH AND_CATCH(exception_class,exception ...
最新文章
- hdu 4502(DP)
- golang逃逸分析
- Linux Kernel 5.10 aarch64体系对TTBR寄存器的设置
- CenOS7中使用Docker安装配置Redis(数据持久化与数据卷映射)
- HDU - 2896 病毒侵袭(AC自动机)
- Val编程-任务编程
- matlab 柯西黎曼方程,【判断题】柯西-黎曼方程成立是函数解析的必要条件.
- 光功率 博科交换机_如何将交换机40G QSFP+与10G SFP+端口互连?
- IPC--进程间通信三(共享内存)
- 如何跨服务器访问html 页面,html页面如何跨域访问另一页面内容,并将部分内容呈现出来?...
- 大众1.4t可以一直加92号汽油吗?有哪些需要注意的问题?
- android-circlebutton介绍
- 在CentOS 6上用Samba Client访问windows共享文件夹
- 【近万字】分数傅里叶变换课程学习笔记
- kubernetes英语怎么读_小学三年级英语怎么学
- 【2018盘点VR一体机那些事】手机VR眼镜和VR一体机有什么区别?AR,VR眼镜和VR一体机哪个好?
- sql 财务科目余额表写法
- Feb14 小白《Linux就该这么学》学习笔记1
- 97年大学计算机考试是 级,1997年4月等级考试一级笔试试卷、答案
- msg.obj与msg.what、this与super
热门文章
- python模块:数字处理
- POJ读书笔记2.1 —— 鸡兔同笼
- 码支付如何对接网站_做“刷脸支付”怎么推广?怎么办理刷脸支付POS机?
- nginx php mysql zend_性能测试基本功 - 手动配置nginx+php-cgi+zend+mysql
- 现代控制理论概念梳理(脑图)
- 蓝桥杯2016年第七届C++省赛B组第二题-生日蜡烛
- Android AbsoluteLayout 绝对布局
- matlab读取excel里的数据并用imagesc画图
- vue 鼠标点击事件_点击鼠标,利用VBA代码实现精准控制触发事件的第二方案
- docker volume mysql_docker volume的理解