C++ VS2013环境编译使用sqlite数据库全过程
转载:http://www.cnblogs.com/imoon/archive/2012/11/30/2796726.html
转载:https://blog.csdn.net/hjm4702192/article/details/8283018(缺点)
转载:https://www.cnblogs.com/ccEmma/p/8308974.html (缺点)
知识补充:
sqlite3.dll动态链接库,它允许程序共享执行特殊任务所必需的代码和其他资源。
动态的sqlite3.lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,其生成的sqlite3.exe在运行时需要相应的dll文件支持 。
静态的sqlite3.lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序,其生成的sqlite3.exe可直接运行。
任务:
一.使用VS2013编译sqlite3,生成动态的sqlite3.lib和sqlite3.dll(sqlite3.dll在官网中也可下载到)。在VS2013中编写简单程序,使用动态的sqlite3.lib和sqlite3.dll。
二.使用VS2013编译sqlite3,生成静态的sqlite3.lib。在VS2013中编写简单程序,使用静态的sqlite3.lib。
任务一:
1.在sqlite官网 http://www.sqlite.org/download.html 上下载sqlite-amalgamation-3270200.zip 和sqlite-dll-win32-x86-3270200.zip(我用的此版本)。
2.分别解压上述两个文件到各自文件夹下(sqlite3.def、sqlite3.dll在同一文件夹sqlite-dll下)。
3.从VS2013的安装目录下Microsoft Visual Studio 12.0\VC\bin找到lib.exe和link.exe,
从VS2013的安装目录下G:\Microsoft Visual Studio 12.0\VC\bin找到mspdb120.dll。
将lib.exe link.exe mspdb120.dll放到步骤2中的sqlite-dll文件夹下。
4.在D:\testdemo\sqlite-dll-win32-x86-3270200目录下,打开cmd窗口
5.输入命令:
LIB /DEF:sqlite3.def /machine:IX86
这时,在sqlite-dll-win32-x86-3270200文件夹下会出现sqlite3.lib。(这是动态的sqlite3.lib文件,只有896KB大小。)
6.在VS2013中编写简单程序。文件->新建->项目->Win32控制台应用程序,命名为Testsqlite 。
7.将main.cpp中的内容替换为以下代码:
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#pragma warning(disable:4996) #pragma comment(lib,"sqlite3.lib")
int main()
{
int rc;
int i, nrows, ncols, tr;
char *errmsg = NULL;
char **results; sqlite3 *db = NULL;
rc = sqlite3_open("demodb", &db);
if (rc)
{
fprintf(stderr, "can't open db!\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit();
}
else
{
printf("db open successfully!\n");
}
sqlite3_get_table(db, "select * from clients;", &results, &nrows, &ncols, &errmsg);
printf("DB has %d rows and %d cols\n\n", nrows, ncols);
tr = (nrows + )*ncols;
for (i = ; i < tr; ++i) //输出查询结果
{
printf("results[%d]= %s/n", i, results[i]); //此处可以自己定义输出格式,
}
sqlite3_free_table(results); //free
sqlite3_close(db); getchar();
return ;
}
8.将sqlite3.h、sqlite3.lib、sqlite3.dll复制到工程所在文件目录中
9.sqlite3.dll 和exe放到同一个目录
10.按F5键,运行成功。
备注:
1:SQLITE不可储存过多的数据库,它的性能发挥最好只能在存放较小的数据量情况下。不要把它当做MYSQL甚至ORACLE来使用。它只是一个200K的数据库。
2:sqlite3不像MYSQL那样使用固定日志文件,所有使用insert、update、delete的运行效率只是一般,sqlite3的一个事务,需要调用4次fsync()操作,而一般的大型数据库,如mysql只用到了2次。sqlite3对每个事务都创建一个临时文件来记录日志,这个日志创建、更新和删除竟然使用了3次fsync()!为什么不用一个固定的日志文件呢?实在难以理解设计者的思路。可能他们把重点放在"Select" 性能上吧。通过阅读sqlite3-3.5.1的源代码,发现作者也试图对这个问题进行修正,可能由于可靠性的原因,一直没有正式公布。
SQLite是为中小规模的应用程序设计的一个嵌入式的数据库
局限性一:
并发。SQLite的锁机制是粗粒度的,它允许多个读,但是一次只允许一个写。 写锁会在写期间排他地锁定数据库,其他人在此期间不能访问数据库。 SQLite已经采取措施以最小化排它锁所占用的时间。 通常来讲,SQLite中的锁只保持几毫秒。 但是按照一般经验,如果您的应用程序有很高的写并发(许多连接竞争向同一数据库写),并且是时间关键型,您可能需要其他数据库。 需要实际测试您的应用程序才能知道能获得怎样的性能。 一个简单的网络应用程序中,SQLite用100个并发连接每秒处理500多个事务。 事务所修改的记录数以及查询所涉及的复杂性可能有所不同。 什么样的并发性是可接受的,这取决于具体的应用程序,只能通过直接测试来判断。 总之,对任何数据库都是真理:直到您做了实际测试才能知道应用程序能获得怎样的性能。 |
局限性二:
网络。 虽然SQLite数据库可以通过网络文件系统共享,但是与这种文件系统相关的潜在延时会导致性能受损。 更糟的是,网络文件系统实现中的一些缺陷也使得打开和修改远程文件--SQLite或其他--很容易出错。 如果文件系统的锁实现不当,可能允许两个客户端同时修改同一个数据库文件,这样必然会导致数据库出错。 实际上,并不是因为SQLite的实现导致SQLite不能在网络文件系统上工作。 相反,SQLite在底层文件系统和有线协议下工作,但是这些技术有时并不完善。 例如,许多NFS使用有缺陷的fcntl(),这意味着锁可能并不像设想的那样工作。 一些较新版本的NFS,如Solaris NFSV4就可以工作正常,SQLite需要的锁机制也是相当可靠的。 然而,SQLite开发者既没有时间,也没有资源去验证任何给定的网络文件系统在所有的情况下都可以无缺陷工作。 |
局限说明:
绝大部分限制是有意设计的--它们是SQLite设计的结果。 例如,支持高度的写并发会带来很大的复杂性,这将使SQLite的简单性无法保持。 同样,作为嵌入式数据库,SQLite是有意不支持网络的。 这一点并不奇怪。总之,SQLite不能做的都是它所能做的直接结果。 它开始的设计就是一款模块化、简单、紧凑的以及易于使用的嵌入式关系数据库,它的基础代码都在使用它的程序员的掌握范围内。 从多方面看,它能完成许多其他数据库不能做的事情,例如,运行在电力消耗实际上是一项制约因素的嵌入式环境中。 |
C++ VS2013环境编译使用sqlite数据库全过程的更多相关文章
- Win7 64位 VS2013环境编译Squirrel 3.0.7
Squirrel是一个类似Lua,但是更面向对象的脚本语言. 国内这个介绍很少,环境配置更是没有任何文章提到,花了点时间搞定了,备忘记录下过程. 首先是下载,写本文时Squirrel最新版本为3.0. ...
- Win7 VS2013环境编译Squirrel 3.0.7
Squirrel是一个类似Lua,但是更面向对象的脚本语言. 国内这个介绍很少,环境配置更是没有任何文章提到,花了点时间搞定了,备忘记录下过程. 首先是下载,写本文时Squirrel最新版本为3.0. ...
- Win7 64位 VS2013环境编译Lua5.3.1
主要参考这篇文章,原文有几个错误顺便改正了. 在Windows下使用Visual Studio编译Lua5.3 写本文时Lua官方网站放出的新版本为5.3.1,然后我不知道为啥,神奇的国内不能访问Lu ...
- Win7 64位 VS2013环境编译CGAL-4.7
看到有人在QQ空间感叹编译CGAL配置折腾了一天时间,自己也想试试,虽然并不打算用,但感觉这库也挺有名的,想必日后用得着,于是着手试着编译. 首先是看一下官网的windows下配置说明 http:// ...
- Win7 64位 VS2013环境编译boost1_58_0
备忘,发现好多不常用的东西不记笔记再想用要重新花时间找,所以试着开始记笔记,写入博客吧. 首先去官网下最新的版本 http://www.boost.org/ 写本文时boost最新版本为1_58_0, ...
- Win7 VS2013环境编译Lua5.3.1
主要参考这篇文章,原文有几个错误顺便改正了. 在Windows下使用Visual Studio编译Lua5.3 写本文时Lua官方网站放出的新版本为5.3.1,然后我不知道为啥,神奇的国内不能访问Lu ...
- Win7 VS2013环境编译CGAL-4.7
看到有人在QQ空间感叹编译CGAL配置折腾了一天时间,自己也想试试,虽然并不打算用,但感觉这库也挺有名的,想必日后用得着,于是着手试着编译. 首先是看一下官网的windows下配置说明 http:// ...
- Win7 VS2013环境编译boost1_58_0
备忘,发现好多不常用的东西不记笔记再想用要重新花时间找,所以试着开始记笔记,写入博客吧. 首先去官网下最新的版本 http://www.boost.org/ 写本文时boost最新版本为1_58_0, ...
- C++连接sqlite数据库的坑
新的第一次用vs2013搞 C++连接sqlite数据库,遇到了很多问题,我也不搞不懂~~~下面写点小体会 首先: 你要先配置好sqlite的环境 参考链接: https://blog.csdn.ne ...
随机推荐
- CVPixelBuffer
https://www.cnblogs.com/psklf/p/7700834.html https://stackoverflow.com/questions/16475737/convert-ui ...
- SpringMVC:JSON形式输出(基于Fastjson)
在Spring3.0中,@ResponseBody标记可以将对象"封装"为JSON形式的数据,并输出,下面的例子中使用的是阿里的Fastjson JSONaz解析工具,在sprin ...
- Github常用命令【转】
本地仓库(local repository) 创建一个本地仓库的流程: 为本地仓库创建一个目录 在目录中执行 git init 对本地仓库所做的改变(例如添加.删除文件等)首先加入到本地仓库的 Ind ...
- 【Python】关于Python多线程的一篇文章转载
猪哥推荐的学习网址 http://www.jb51.net/article/110164.htm yeayee ------>更多技巧------>更多源码------>http:/ ...
- 【Pyton】【小甲鱼】文件
1.打开文件的集中模式: 2.文件对象方法: 对于文件对象方法的练习代码: 读取F:\\script\\script.txt位置文件中内容 >>> f=open('F:\\scrip ...
- golang语言调试
https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs https: ...
- 关于LUA中的随机数问题
也许很多人会奇怪为什么使用LUA的时候,第一个随机数总是固定,而且常常是最小的那个值,下面我就简要的说明一下吧,说得不好,还请谅解.我现在使用的4.0版本的LUA,看的代码是5.0的,呵呵 LUA4. ...
- [LeetCode] 513. Find Bottom Left Tree Value_ Medium tag: BFS
Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...
- Java-二叉树算法
二叉树算法的排序规则: 1.选择第一个元素作为根节点 2.之后如果元素大于根节点放在右子树,如果元素小于根节点,则放在左子树 3.最后按照中序遍历的方式进行输出,则可以得到排序的结果(左->根- ...
- 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析
2018-2019-2 网络对抗技术 20165324 网络对抗技术 Exp4:恶意代码分析 课下实验: 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析E ...