赞助

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(1);
    }
    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 + 1)*ncols;
    for (i = 0; i < tr; ++i) //输出查询结果
    {
        printf("results[%d]= %s/n", i, results[i]); //此处可以自己定义输出格式,
    }
    sqlite3_free_table(results); //free 
    sqlite3_close(db);

     getchar();
    return 0;
}

 

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不能做的都是它所能做的直接结果。

它开始的设计就是一款模块化、简单、紧凑的以及易于使用的嵌入式关系数据库,它的基础代码都在使用它的程序员的掌握范围内。

从多方面看,它能完成许多其他数据库不能做的事情,例如,运行在电力消耗实际上是一项制约因素的嵌入式环境中。

posted @ 2017-08-14 09:12  车臣  阅读(5280)  评论(1编辑  收藏  举报