zoukankan      html  css  js  c++  java
  • C++ Builder 2007中应用数据库SQLite(转载)

    第一次使用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 FilesMicrosoft Visual Studio 8VCin在这个目录下面有一个lib.exe,对,使用它就能生成所需要的sqlite3.lib文件。将SQLite官方下载的sqlite3.def文件放到相同目录,然后在命令行输入如下命令:

    C:Program FilesMicrosoft Visual Studio 8VCin>LIB /MACHINE:IX86 /DEF:sqlite.def

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

    这样就得到了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 FilesCodeGearRAD Studio5.0in中。具体命令如下:

    C:Program FilesCodeGearRAD Studio5.0in>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++

  • 相关阅读:
    java垃圾回收机制
    浮点数比较/运算BigDecimal
    java8新特性_::双冒号
    java的lambda表达式
    【转】DelphiXE10.2.3——跨平台生成验证码图片
    ide fix pack for delph 10.2.3发布了
    使用ALVideoPlayerSurface制作视频播放器
    kbmMWLog同时输出日志到多个日志管理器
    kbmMWLog输出日志到控制台或指定Grid
    推荐内置android控件的开源项目alcinoe
  • 原文地址:https://www.cnblogs.com/blogpro/p/11446037.html
Copyright © 2011-2022 走看看