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程序 html
若是設置了環境變量,利用LIB仍不能編譯成功,可把SQLITE3.DEF,sqlite3.dll拷貝到VS對應的Bin下,來執行Lib命令。個人開發環境是Win7 64,VS2010.ios
在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 路徑下lib成功。git
第三步:編寫測試工程
新建項目,將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的表。
而後編寫以下代碼: github
- #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. sql
更多學習參看sqlite提供的document啦```數據庫
第四步,測試經過了,若是要應用的項目裏,使用sqlite3提供的藉口,不是很方便,須要再封裝一層。推薦一個不錯的 開源的wapper:SQLiteCpp.app
地址:https://github.com/SRombauts/SQLiteCpp工具
SQLiteC++ (SQLiteCpp) is a smart and easy to use C++ SQLite3 wrapper.
學習