sqlite应用以及相应问题排查(基于VS2008)

0、系统环境

开发环境:VS2008

开发语言:C/C++

1、文件准备

    SQLite官网https://www.sqlite.org/index.html下载最新的SQLite相关文件(sqlite3.dll 和 sql3.def),当前最新版本为3.22.0。我们找到windows所对应的Precompiled Binaries forWindows 下载

      依据实际情况下载 32位/64位zip文件。sqlite-tools-win32-x86-3220000.zip 是用于管理SQLite数据库文件的一系列命令行工具,此处我们暂时不需要用到它。

Source Code 栏中下载sqlite-amalgamation-3220000.zip以获取头文件sqlite3.h.

2、静态链接库生成

      下载后的sqlite-dll-win32-*-3220000.zip,包含了我们所需要的sqlite3.dll和 sql3.def。解压此下载的zip至文件夹,如D:\4-Temp\temp_obj\sqlit  接着打开CMD命令行。执行以下命令

C:\Users\baiqishi>D:

D:\>cd D:\4-Temp\temp_obj\sqlit

D:\4-Temp\temp_obj\sqlit>lib /DEF:sqlite3.def

运行成功会有如下打印显示

Microsoft (R) Library Manager Version 9.00.21022.08

Copyright (C) Microsoft Corporation.  All rights reserved.

 

LINK : warning LNK4068: 未指定 /MACHINE;默认设置为X86

   正在创建库 sqlite3.lib 和对象 sqlite3.exp

此时就在当前目录下编译产生了我们所需要的静态链接库sqlite3.lib ,如下图所示

(注意:此处若不成功,请查看后续【异常处理1】)

 

3、VS工程创建

创建win32控制台工程

将头文件sqlite3.h以及生成的静态链接库文件sqlite3.lib复制到工程文件夹

在工程属性中添加sqlite3.lib库依赖(项目---属性---链接器----输入-----在附加依赖项中添加sqlite3.lib)


源文件如下:

// sqlit2-demo.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

 

 

#include "sqlite3.h"  

#include <iostream>   

using namespace std; 

 

int_tmain(int argc, _TCHAR* argv[]) 

{  

   int rc = 0; 

   int i = 0; 

   sqlite3 *db = NULL; 

   char *sql = NULL; 

   char *err = NULL; 

   rc = sqlite3_open("sqlite3test.db",&db); 

   if (rc) 

   { 

       printf("\r\nopen database sqlite3test.dbfail!\r\nERR: %s", sqlite3_errmsg(db)); 

       sqlite3_close(db); 

       return -1; 

   } 

   printf("\r\nopen databasesqlite3test.db ok!"); 

 

 

   sql = "create table stu(id int PRIMARYKEY,name text);"; 

   rc = sqlite3_exec(db, sql, NULL, NULL, &err); 

   if (SQLITE_OK != rc) 

   { 

       if (NULL != err) 

       { 

            printf("\r\nSQL1ERR:%s", err); 

            sqlite3_free(err); 

            return-1; 

       } 

   } 

 

   sql = "insert into stu values (1,'zhangsan');"; 

   rc = sqlite3_exec(db, sql, NULL, NULL, &err); 

   if (SQLITE_OK != rc) 

   { 

       if (NULL != err) 

       { 

            printf("\r\nSQL2ERR:%s", err); 

            sqlite3_free(err); 

            return-1; 

       } 

       printf("\r\n error insert"); 

   } 

   sql = "insert into stu values (2,'lisi');"; 

   rc = sqlite3_exec(db, sql, NULL, NULL, &err); 

   if (SQLITE_OK != rc) 

   { 

       if (NULL != err) 

       { 

            printf("\r\nSQL2ERR:%s", err); 

            sqlite3_free(err); 

            return-1; 

       } 

       printf("\r\n error insert"); 

   } 

 

   sql = "select * from stu;"; 

   char **result; 

   int nrow = 0, ncolumn = 0; 

   rc = sqlite3_get_table(db, sql, &result, &nrow, &ncolumn,&err); 

   if (SQLITE_OK != rc) 

   { 

       if (NULL != err) 

       { 

            printf("\r\nSQL3ERR:%s", err); 

            sqlite3_free(err); 

           return-1; 

       } 

       printf("\r\n error select"); 

   } 

 

   printf("\r\nrow: %d ,column: %d",nrow, ncolumn); 

 

   for (i = 0; i<(nrow + 1)*ncolumn;i++) 

   { 

       printf("\r\n %s\t %s",result[i++], result[i]); 

   } 

 

   sqlite3_free_table(result); 

 

   sqlite3_close(db); 

     getchar();

   return 0; 

}

编译完成执行后的结果如下(如编译执行异常,请查看续【异常处理2】)

===========================================================================

【异常处理1】:sqlite3.lib静态链接库异常

    当我们在CMD命令行执行lib /DEF:sqlite3.def 出现如下所示的“ lib不是内部或外部命令……”异常时

      在vs2008的安装目录下(C:\Program Files(x86)\Microsoft Visual Studio 9.0\VC\bin)拷贝 lib.exe 和link.exe到当前执行目录下即可。

注意:此处需要根据实际下载的是32位/64位的SQLite预编译文件来拷贝相应的lib.exe和link.exe。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin   --- 32为

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64     ---64位

 

    或者我们可以不用拷贝这两个执行文件,而采用VS2008所提供的命令行CMD,同样需要根据实际下载的32位/64位的SQLite预编译文件来执行想对应的命令行CMD。如下图所示

 

    上述两种解决方式的效果一样,可以成功编译产生我们所需要的静态链接库文件。

 

【异常处理2】:编译/运行异常解决

1) “LNK2019:无法解析的外部符号 _sqlite3*……”

出现此类编译异常,是因为当前使用的静态链接库文件的平台与当前VS工程的活动解决方案平台不匹配。简单点说就是两者之间,静态链接库文件是64位的,而当前VS解决方案平台是Win32的,在编译时就会出现上述异常。

    此时解决方法是:匹配静态链接库与VS解决方案平台,要么都使用32位的,要么都使用64位的。

上图为修改当前VS解决方案平台的方式,以此来调整平台为32位还是64位

 

2)运行时出现如下的“0x0000007b”异常

出现上述异常是因为在生成静态链接库时我们所使用的CMD命令行平台与实际的包不匹配所致。

    就是说,我们在SQLite官网下载的是64位的dll文件,但是我们在编译产生静态链接库文件时使用的是32位的命令行处理(link.exe、lib.exe为32位的),此时sqlite3.lib静态链接库文件能够正常产生,但是我们在VS中采用Win32平台操作时,程序编译正常,执行的时候就会出现上述错误了。

    此时解决方法是:采用匹配的CMD命令行模式去编译产生静态链接库。

 

小结:在使用SQLite时,我们需要确保

1、SQLite官网下载的dll版本

2、编译产生lib静态链接库时使用的CMD命令行平台

3、VS解决方案平台

上述三者必须保证是统一的平台(32位/64位)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值