VC链接SQLite的方法

在官网上下载相关源码,建立一个静态链接库--lib库,这个lib库不需要预编译头文件(不需要stdafx.h和stdafx.cpp文件),将下载好的文件导入进去,直接编译即可通过,我所使用的版本是sqlite-amalgamation-3080002,在官网上可下载。可是我在网上查找相关资料时,只发现了两种方法,一种方法是下载官网上的dll和def文件,然后根据这两个文件生成lib文件,在从源码中获取.h头文件,这样在使用,只是使用时需要dll文件,还有一种方法是下载源码然后建立一个空的dll项目生成Dll,然后利用生成的.obj文件生成静态链接库lib文件,这样使用时不需要lib文件。可是为什么要用这两种方法那???在使用的性能和效率上也并没有什么区别啊?!!!虽然第一种方法中使用的是动态链接库,可是使用的是它的静态链接啊,在程序运行时就直接加载进内存了啊?它唯一的作用就是减小了最终可执行文件的单文件大小,可是这又必要吗?!在网上搜索中文资料找了半天都没找到直接用官网上下的源码生成lib文件的,都是需要同过dll转的,真是悲哀,难道都是互相拷贝的?!我自己试验了下是可以直接生成lib文件的,完全不需要什么狗屁转换,而且我也找到一篇文章证实了我的想法http://code.google.com/p/sqlitebot/wiki/VisualStudio。下面我把在网上找到的方法也复制过来,不过是在想不通为什么要这么做,特别是第二种方法,刚开始以为是sqlite版本的问题,可是我按照作者使用的版本试了一下,完全可以直接建立静态链接库生成Lib文件,所以真是弄不明白,希望看到这篇文章并且知道原因的人给个解释。

Win7下VS2010编译生成sqlite.lib库(转自:http://www.cnblogs.com/imoon/archive/2012/11/30/2796726.html

知识补充:

      sqlite3.dll动态链接库,它允许程序共享执行特殊任务所必需的代码和其他资源。

      动态的sqlite3.lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,其生成的sqlite3.exe在运行时需要相应的dll文件支持 。

静态的sqlite3.lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序,其生成的sqlite3.exe可直接运行。


任务:

     一.使用VS2010编译sqlite3,生成动态的sqlite3.lib和sqlite3.dll(sqlite3.dll在官网中也可下载到)。在VS2010中编写简单程序,使用动态的sqlite3.lib和sqlite3.dll。

     二.使用VS2010编译sqlite3,生成静态的sqlite3.lib。在VS2010中编写简单程序,使用静态的sqlite3.lib。 


任务一:

1.在sqlite官网 http://www.sqlite.org/download.html 上下载sqlite-amalgamation-3071000.zipsqlite-dll-win32-x86-3071000.zip(我用的此版本)。

2.分别解压上述两个文件到各自文件夹下(sqlite3.def、sqlite3.dll在同一文件夹sqlite-dll下)。

3.从VS2010的安装目录下MicrosoftVisual Studio 10.0\VC\bin找到lib.exe和link.exe,从VS2010的安装目录下G:\MicrosoftVisual Studio 10.0\Common7\IDE找到mspdb100.dll。将lib.exe link.exe mspdb100.dll放到步骤2中的sqlite-dll文件夹下。

4.打开cmd窗口,转到上述sqlite-dll文件夹下,我的是E:\SoftwareDesign\SQLite\sqlite-dll


5.输入命令:LIB /DEF:sqlite3.def /machine:IX86。这时,在sqlite-dll文件夹下会出现sqlite3.lib。(这是动态的sqlite3.lib文件,只有47KB大小。)

6.在VS2010中编写简单程序。文件->新建->项目->Win32控制台应用程序,命名为test1。

7.将test1.cpp中的内容替换为以下代码:

// test1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include "sqlite3.h"
int _tmain(int argc, _TCHAR* argv[])
{
    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);
    int a;
    scanf("%d",&a);//没有此行代码,运行窗口出现后会马山消失。
    return 0;
}

8.将sqlite3.h、sqlite3.lib、sqlite3.dll复制到工程所在文件目录中。我的是E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test1\test1,如下图所示:


9.在VS2010中,右键test1工程,添加->现有项,在出现的对话框中选择上一步中的sqlite3.lib。(必须将lib文件再添加到工程中)

10.按F5键,运行成功。

PS:这时,到工程所在文件目录下找到test1.exe(大小为29KB),我的是在E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test1\Debug。如果直接双击运行的话,会提示因缺少sqlite3.dll文件而无法运行。这是因为动态的sqlite3.lib只是将声明部分编译到test1.exe中,运行时需要dll文件的支持。将sqlite3.dll文件复制到test1.exe同一目录下,再双击运行test1.exe,就会运行成功。

 

任务二:

1.在VS2010中,文件->新建->项目->Win32项目,命名为sqlite3(其他名称也行)。在向导设置中,选择DLL(D)、空项目。

2.将下载的sqlite-amalgamation-3071000.zip 中的“sqlite3.h”、“sqlite3.c”、“sqlite3ext.h”三个文件添加到工程中,具体做法:右键sqlite3工程->添加->现有项,在出现的对话框中选择上述三个文件。

3.(release版本比debug版本体积小,运行速度快,所以操作中我发布的是release版本)如下图所示:


4.按F7键编译(或右键->生成)。在工程所在文件目录中会编译出sqlite3.dll文件。(PS:网上有的讲解需要配置很多的参数等等,试了很多次都不成功,然而按照上述无需多余操作即可成功。可能是VS或sqlite版本不同的原因)

5.编译的同时会在工程所在目录中产生sqlite3.obj文件,我的是在E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\sqlite3\sqlite3\Release下。接下来要用到VS安装目录下的lib.exe文件。将sqlite3.obj文件复制到lib.exe所在目录下,我的是G:\MicrosoftVisual Studio 10.0\VC\bin。将G:\Microsoft Visual Studio 10.0\Common7\IDE下的mspdb100.dll,mspdbcore.dll,mspdbsrv.exe,msobj100.dll复制到lib.exe所在目录下。

6.打开cmd窗口,转到lib.exe所在文件夹下,我的是G:\MicrosoftVisual Studio 10.0\VC\bin。输入命令:lib sqlite3.obj。这时会生成静态的sqlite3.lib(大小为2.32MB)。


7.在VS2010中编写简单程序。文件->新建->项目->Win32控制台应用程序,命名为test2。

8.test2.cpp中的代码替换为上述的代码。(任务一步骤7中的代码)

9.将sqlite3.h和步骤6中生成的静态sqlite3.lib复制到test2工程所在的文件目录中,我的是E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test2\test2。

10.在VS2010中,右键test2工程->添加->现有项。选择sqlite3.lib。

11.按F5键,运行成功。

PS:这时,在E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test2\Debug下会生成test2.exe(大小为501KB)。双击可以直接运行。此时不需dll文件支持。因为静态的sqlite3.lib将导出声明和实现都放在lib中,编译后所有代码都嵌入到test2.exe,可直接运行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MFC中,连接SQLite3需要使用CDatabase类来封装连接和操作数据库的功能。 以下是使用MFC封装类连接SQLite3的方法: 1. 首先,需要确保SQLite3的库文件已经正确地引入到项目中。可以将sqlite3.dll文件复制到项目的Debug或Release文件夹中,并在项目属性的配置属性->常规->附加库目录中添加库文件所在的文件夹路径。 2. 在需要连接SQLite3数据库的地方,创建一个CDatabase对象,并调用OpenEx函数来打开数据库连接。示例代码如下: ``` CDatabase db; if (db.OpenEx(L"DRIVER=SQLite3 ODBC Driver;Database=mydatabase.db;Trusted_Connection=yes;") == TRUE) { // 数据库连接成功 } else { // 数据库连接失败 } ``` 在上面的代码中,根据SQLite3的ODBC驱动程序名称和要连接的数据库文件路径创建了一个合适的连接字符串,并传递给OpenEx函数进行连接。如果连接成功,返回值为TRUE;否则,返回值为FALSE。 需要注意的是,要确保数据库文件mydatabase.db存在于指定的路径中,否则连接将失败。 3. 连接成功后,可以通过CRecordset类来执行SQL语句并处理结果。示例代码如下: ``` CRecordset recset(&db); CString strSQL = L"SELECT * FROM mytable"; if (recset.Open(CRecordset::forwardOnly, strSQL) == TRUE) { // SQL语句执行成功,可以获取和处理结果 while (!recset.IsEOF()) { // 处理每一行数据 // ... // 移动到下一行 recset.MoveNext(); } recset.Close(); } else { // SQL语句执行失败 } ``` 在上面的代码中,通过一个SELECT语句查询指定的表mytable的所有数据,并逐行处理结果。 以上就是使用MFC封装类连接SQLite3的大致步骤和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值