`

C++访问sqlite3的初体验

    博客分类:
  • C++
阅读更多
Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用。不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqlite做数据持久化,所以先热热身。

第一步:下载相关文件
首先到这里下载sqlite-source-3_6_12.zipsqlite-3_6_12.zipsqlitedll-3_6_12.zip三个包,并分别解压。

第二步:生成SQLite的lib文件
cmd进入命令行后输入: LIB /DEF:SQLITE3.DEF /MACHINE:IX86
如果找不到命令LIB,则需要将Microsoft Visual Studio\VC98\Bin这个目录添加到环境变量里。这样就生成了sqlite3.lib文件,我们在后面需要用到这个库,用于链接win32程序

第三步:编写测试工程
新建项目,将sqlite3.h(在源码包里)、sqlite3.dll、sqlite3.lib设置到工程环境里,或者直接拷贝到工程目录下。
然后我们将cmd切换到sqlite3的目录下,里面有个sqlite3.exe。执行命令:
> sqlite3 D:\sql.db   ;生成sql.db的数据库文件
sqlite3 > create table test_tab (f1 int, f2 long);
sqlite3 > .q

这样我们就生成了一张test_tab的表。
然后编写如下代码:
#include "sqlite3.h"
#include <iostream>
#include <sstream>

using namespace std;
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)
    {
        std::cout << "执行SQL 出错." << errMsg << std::endl;
        return -1;
    }
    res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);
 
    if (res != SQLITE_OK)
    {
        std::cout << "执行创建table的SQL 出错." << errMsg << std::endl;
        return -1;
    }
    else
    {
        std::cout << "创建table的SQL成功执行."<< std::endl;
    }
 
    return 0;
}
 
int insert1()
{
    char* errMsg;
 
    int res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);
 
    for (int i= 1; i < 10; ++i)
    {
        std::stringstream strsql;
        strsql << "insert into test_tab  values(";
        strsql  << i << ","<< (i+10) << ");";
        std::string str = strsql.str();
        res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
        if (res != SQLITE_OK)
        {
            std::cout << "执行SQL 出错." << errMsg << std::endl;
            return -1;
        }
    }
 
    res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);
 
    std::cout << "SQL成功执行."<< std::endl;
 
 
    return 0;
}
 
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
   
    for(int i = 0 ; i < argc ; i++)
    {
        std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", " ;
    }
 
    std::cout<< "\n";
    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)
    {
        std::cout << "执行SQL 出错." << errMsg << std::endl;
        return -1;
    }
    else
    {
        std::cout << "SQL成功执行."<< std::endl;
    }
 
    return 0;
}
 
int main()
{
    int res = sqlite3_open("D:\\sql.db", &pDB);
 
    if( res ){
        std::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();

    return 0;
}

编译、链接、执行,看看效果吧。
SQLite不愧是数据存储的 "瑞士军刀".不像使用某些数据库,要配置ODBC,还要把一大堆的dll一起打包到最终的用户程序中去.还得使用depends之类的工具看要打包哪些.dll.
更多学习参看sqlite提供的document啦```
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics