Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用。不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqlite做数据持久化,所以先热热身。
第一步:下载相关文件
首先到 这里下载 sqlite-source-3_6_12.zip、 sqlite-3_6_12.zip、 sqlitedll-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的表。
然后编写如下代码:
第一步:下载相关文件
首先到 这里下载 sqlite-source-3_6_12.zip、 sqlite-3_6_12.zip、 sqlitedll-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啦```
原文出处:http://sexycoding.javaeye.com/blog/365311
转载于:https://blog.51cto.com/wanqiufeng/469101