第一次使用SQLite数据库,而且BCB2007也不熟,这两者的结合那就更让我难受了。今天只是简单的在BCB中调用SQLite,就花了我一下午时间,这也足见本人知识的浅薄,另一方面也说明我对这二者确实不熟悉。

网上能搜到比较多SQLite应用于VC++6.0和C++Builder 6.0的文章,之前按这些方法都没成功过;当然并不这些方法本身不行,个人觉得应该是现在无论是vs还是BCB版本较以前高,兼容性不好。

BCB中使用SQLite最重要的是生成sqlite3.lib文件。而SQLite官方下载只给了sqlite3.dll和sqlite3.def文件,并没有提供我们所需的sqlite3.lib。有两种选择,一种是使用DLL动态加载使用里面的函数,这种方法我没有试过,据说这麻烦,而且如果在程序执行的时候,理论上是有些慢的(因为它每次都要LoadLibrary跟GetProcAddress)。另一种选择就是自己来生成LIB文件。

这里引用网上的方法:

<1>VC++2005:启动一个命令行,进入VC的安装目录,我的目录是C:\Program Files\Microsoft Visual Studio 8\VC\bin在这个目录下面有一个lib.exe,对,使用它就能生成所需要的sqlite3.lib文件。将SQLite官方下载的sqlite3.def文件放到相同目录,然后在命令行输入如下命令:

C:\Program Files\Microsoft Visual Studio 8\VC\bin>LIB /MACHINE:IX86 /DEF:sqlite.def

此时,并不能成功运行,原因是无法加载mspdb80.dll,解决办法很简单:从Common7\IDE下找到该文件复制刚才的目录下,再次执行就好了。

这样就得到了sqlite3.lib文件。将sqlite3.h sqlite3.lib sqlite3.dll文件复制到项目/解决方案,在需要写库文件的cpp文件顶部填写#include "sqlite3.h",并且通过 项目-->添加现有项 把lib加入项目/解决方案中,如此就能调用sqlite3.dll里面的所有函数了。

<2>Borland C++ Builder 6:使用lib文件跟vc完全不同,不要混淆,BCB本身提供一个命令行工具用于生成一个sqlite3.lib文件,具体的方法如下:

在BCB的安装目录找到implib.exe,复制出来或者在它本目录,并把sqlite3.dll文件也复制到相同目录下,然后执行如下命令(假如这两个文件都放到C盘根目录下):

C:\implib sqlite3 sqlite3.dll

这样就生成所需的专用于BCB的sqlite3.lib文件了,具体使用比较简单,不再赘述。

这两种方法我都试过。其中第二种方法我在BCB2007使用,无论怎么调试都不行,到现在都没有解决。

而第一种方法生成sqlite3.lib虽然能在vs2005中成功使用,但是其所生成的静态链接库文件并不能直接移植到BCB2007中使用。还有一个小小的问题,是关于OMF格式的lib和COFF格式的lib之间的区别及转换问题。

具体OMF和COFF是什么,这里不深究。一个区别是OMF格式的LIB是BCB使用的;COFF格式的LIB是vc使用的。COFF到OMF的转换使用coff2omf.exe即可。知道这些这个问题就好解决了:vc生成的lib是COFF格式的,使用BCB的转换工具coff2omf.exe,该文件在BCB安装目录下,我的在C:\Program Files\CodeGear\RAD Studio\5.0\bin中。具体命令如下:

C:\Program Files\CodeGear\RAD Studio\5.0\bin>coff2omf sqlite3.lib c:\sqlite3.lib

这里需要先把用vc生成的sqlite3.lib移到coff2omf.exe所在目录下。上面命令的第二个参数是转换后的lib文件,由于二者的文件名相同,所以把转换后的lib文件放到另外一个目录下。

至此,所有问题已经解决。

只是一个小问题竟弄了我一下午,唉~ 不过收获也不小~

小秀一下我的第一个SQLite应用程序:

//---------------------------------------------------------------------------
#include <iostream>
#include <string>
#include <sstream>
#include "sqlite3.h"
using namespace std;
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
sqlite3 *pDB;
int createTable()
{
char *errMsg;
std::string dropTab="drop table test_tab;";
string strSQL="create table test_tab(f1 int,f2 long);";
int res=sqlite3_exec(pDB,dropTab.c_str(),0,0,&errMsg);
if(res!=SQLITE_OK)
{
cout<<"执行sql出错."<<errMsg<<endl;
//return -1;
}
res=sqlite3_exec(pDB,strSQL.c_str(),0,0,&errMsg);
if(res!=SQLITE_OK)
{
cout<<"执行创建table的SQL出错."<<endl;
return -1;
}
else
{
cout<<"创建table的SQL成功执行."<<endl;
}
return 0;
}
int insert1()
{
char *errMsg;
int res=sqlite3_exec(pDB,"begin transaction;",0,0,&errMsg);
for(int i=1;i<10;i++)
{
stringstream strsql;
strsql<<"insert into test_tab values(";
strsql<<i<<","<<(i+10)<<");";
string str=strsql.str();
res=sqlite3_exec(pDB,str.c_str(),0,0,&errMsg);
if(res!=SQLITE_OK)
{
cout<<"执行SQL出错."<<errMsg<<endl;
return -1;
}
}
res=sqlite3_exec(pDB,"commit transaction;",0,0,&errMsg);
cout<<"SQL成功执行."<<endl;
return 0;
}
static int callback(void *NotUsed,int argc,char **argv,char **azColName)
{
int i;
for(i=0;i<argc;i++)
{
cout<<azColName[i]<<" = "<<(argv[i]?argv[i]:"NULL")<<",";
}
cout<<endl;
return 0;
}
int select1()
{
char *errMsg;
string strSQL="select * from test_tab;";
int res=sqlite3_exec(pDB,strSQL.c_str(),callback,0,&errMsg);
if(res!=SQLITE_OK)
{
cout<<"执行SQL出错."<<errMsg<<endl;
return -1;
}
else
{
cout<<"SQL执行成功."<<endl;
}
return 0;
}
int main(int argc, char* argv[])
{
int res=sqlite3_open("test_tab.db",&pDB);
if(res)
{
cout<<"Can't open database:"<<sqlite3_errmsg(pDB);
sqlite3_close(pDB);
return -1;
}
res=createTable();
if(res!=0)
{
return 0;
}
res=insert1();
if(res!=0)
{
return 0;
}
select1();
system("pause");
return 0;
}
//---------------------------------------------------------------------------
运行结果:

转载自:http://hi.baidu.com/fifarzh/blog/item/3ca4bced0d1a90d2b31cb1e5.html/cmtid/8b32b94af2dad02809f7eff8
#vc++

C++ Builder 2007中应用数据库SQLite(转载)的更多相关文章

  1. Visio 2007中进行数据库建模时如何显示字段类型以及概念名称

    关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型:   在visio菜单上--->点击数据库--->选项--->文档    打开后选择表这项,在上 ...

  2. 3.2 手机中的数据库——SQLite

    http://www.sqlite.org/download.html 截至我安装SQLite数据库为止的时间,最新的版本可以下载sqlite-dll-win64-x64-3200000.zip和sq ...

  3. .Net中使用数据库(sqlite)的大体流程(简单向)

    说来数据库,各种语言各种数据库在操作上大体无异,基本都是连接数据库.操作数据库.关闭数据库连接的流程,不过Sqlite由于是单文件数据库,相比其他服务器的数据库连接更简单,只需要给定数据库文件的路径即 ...

  4. 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码

    VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码.下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录 #in ...

  5. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  6. Windows Phone8 中如何引用 SQLite 数据库2

    本博文编写环境 VS2013 + WP8 SDK 上篇介绍完了SQLite在wp中的部署(具体请参阅 Windows Phone8 中如何引用 SQLite 数据库),下面来看如何使用 SQLite ...

  7. QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData

    SQLite数据库: SQLite是轻量级的数据库,适合应用在移动设备和小型设备上,它的优点是轻量,可移植性强.但它的缺点是它的API是用C写的,不是面向对象的.整体来说,操作起来比较麻烦.所以,一般 ...

  8. (转载)c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程

    c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程 可能大多数程序员会问:透明窗口,特别是透明Panel有什么应用价值呢?可别小看它们哦,下面我就来讲讲他们的巨大 ...

  9. asp.net中配置使用Sqlite轻型数据库

    Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 破解方法: 注册表删除 HK ...

随机推荐

  1. 剑指offer——21正则表达式匹配

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  2. 【6折抢】戴尔i7新品Latitude高性能商用本

    致敬拼搏成长中的企业 戴尔5月有钜惠! 买1赠1送同款,单台价格2500元 这波来自戴尔官网的致敬很走心 满足初级办公和高性能运算多重需求 限时折扣火热开抢! 新品  latitude 6折抢! 戴尔 ...

  3. spring boot资源文件配置读取

    一般业务配置,尽量新建自己的配置文件,来读取,而不是配置在application.properties或application-*.properties或yml/yaml配置中. applicatio ...

  4. DRF的JWT用户认证

    目录 DRF的JWT用户认证 JWT的认证规则 JWT的格式 JWT认证的流程 JWT模块的导入为 JWT的使用 DRF的JWT用户认证 从根本上来说,JWT是一种开放的标准(RFC 7519), 全 ...

  5. sklearn中pipeline的用法和FeatureUnion

    一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...

  6. 针对Java集合类的小总结

    Java集合类包位于java.util下,有很多常用的数据结构:数组.链表.队列.栈.哈希表等等.了解不同的集合类的特性在开发过程中是比较重要的,感谢@兰亭风雨的专栏分析,这里我也根据自己的理解做轻度 ...

  7. .net Core开源框架NetModular记录

    NetModular 源码: https://github.com/iamoldli/NetModular 文档: https://nm.iamoldli.com/docs/guide/

  8. 关于SQL server2017无法连接远程服务器的问题

    安装了SQL server2017,能连接上本地数据库,但是连接远程数据库则老报错,什么实例错误之类的,百度找了也是什么打开sql server 服务,什么修改端口1433,什么TCP协议之类的,全部 ...

  9. 既然 start() 方法会调用 run() 方法,为什么我们调用 start() 方法,而不直接调用 run() 方法?

    当你调用 start() 方法时,它会新建一个线程然后执行 run() 方法中的代码.如果直接调用 run() 方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行

  10. delphi 第3课

    (1)主程序:汇总或者记载 Delphi应用程序是以窗体为中心的 (1) 1 (2) 控制语句 if 条件 then 语句1: else 语句2: 2018-04-22   21:47:17