SQLite資料庫使用總結

來源:互聯網
上載者:User

SQLite 是一個小巧的開來源資料庫,主要應用於嵌入式行動裝置。

一、 下載 SQLite3 包

     大家可以到SQLite的官方網站去下載,使用各種系統的SQLite的版本,為:http://www.sqlite.org/

二、 編譯產生 Lib 檔案

     啟動一個命令列,進入 VC 的安裝目錄,如 C:/Microsoft Visual Studio/VC98/Bin 在這個目錄下面 有一個 LIB.exe 檔,我們就是利用本檔案產生所需要的 SQLite3.lib 檔案,將在 SQLite 官方下載的 sqlite-source-3_3_7.zip 包中的 SQLite3.def 檔案放到相同目錄,或者絕對路徑,然後在命令列輸入如下命令: D:/Microsoft Visual Studio/VC98/Bin>LIB /MACHINE:IX86 /DEF:sqlite.def 。 如果命令成功執行的話我們可以看到 LIB.exe 檔已經幫我們產生好了 SQLite3.lib 檔案。當然我已經編譯好了一個,大家可以去這裡下載:http://download.csdn.net/source/2480804

三、 使用C++封裝類


 由於SQLite是用C語言寫的,為了讓其更符合物件導向的思想,我在SQLite提供的C的API上,用C++在進行了封裝,使操作起來更方便,本類優點在於:簡潔明了,操作簡單,缺點是:不支援UTF-8.代碼如果有什麼問題,或者有什麼好的建議,可以提出來,也可以發郵件給我:sgc0710@gmail.com.源碼如下:

 

Sqlite.h

#ifndef SQLITE_H<br />#define SQLITE_H<br />// Standard constants<br />#undef NULL<br />#define NULL 0<br />#include "sqlite3.h"<br />#include <stdio.h><br />#include <iostream><br />#include <string><br />#include <windows.h><br />#include <tchar.h><br />using namespace std;// 定義命名空間<br />#pragma comment(lib,"sqlite3.lib")// 載入 sqlite3.DLL<br />//////////////////////////////////////////////////////////////////////////<br />//類功能: 操作SQLITE資料庫時的出錯處理<br />//作者: 孫高朝<br />//日期: 2010.06.14<br />//////////////////////////////////////////////////////////////////////<br />class CMyError:public std::runtime_error// 繼承與 experience類<br />{<br />public:<br />CMyError(const char* strErrMsg);<br />};<br />//////////////////////////////////////////////////////////////////////////<br />//類功能: 資料庫記錄集類<br />//作者: 孫高朝<br />//日期: 2010.06.14<br />//////////////////////////////////////////////////////////////////////<br />class CSqliteRecordset<br />{<br />public:<br />void finalize();// 釋放記錄集函數<br />void NextRow();// 記錄指標移動函數<br />LPCTSTR GetFieldValue(LPCTSTR strField);// 擷取欄位值<br />bool RsEOF();// 記錄集指標末尾函數<br />CSqliteRecordset(sqlite3* pDB,sqlite3_stmt* pVM,bool bEof,bool bFinalize=true);<br />CSqliteRecordset();<br /> ~CSqliteRecordset();<br />public:<br />void MoveFrist();<br />private:<br />int iCols;// 列數<br />sqlite3* m_pDB;// 定義資料庫物件<br />sqlite3_stmt* m_pVM;// 記錄集指標 An instance of the following opaque structure is used to represent a compiled SQL statment.<br />bool IsEOF;// 末尾標誌位<br />bool IsFinalize;// 釋放標誌位<br />};<br />//////////////////////////////////////////////////////////////////////////<br />//類功能: 操作SQLITE資料庫 開啟資料庫 執行操作資料庫 讀資料庫表<br />//作者: 孫高朝<br />//日期: 2010.06.14<br />//////////////////////////////////////////////////////////////////////<br />class CSqlite<br />{<br />public:<br />void CloseDB();<br />bool ExecuteSQL(const char* strSQL);// 執行SQL語句函數<br />bool OpenSqliteDB(const char* strNameDB);// 串連資料庫操作<br />bool funCheckTable(string strTableName);// 檢查資料表是否存在 存在 TRUE 不存在 FALSE<br />CSqliteRecordset ExecQuery(LPCTSTR strSQL);// 讀取特定欄位的值<br />CSqlite();<br />virtual ~CSqlite();<br />private:<br />sqlite3* SqliteDB;// 定義資料庫物件<br />};<br />#endif

Sqlite.cpp

// Sqlite.cpp: implementation of the CSqlite class.<br />//<br />//////////////////////////////////////////////////////////////////////<br />#include "Sqlite.h"<br />extern "C"<br />{<br />#include "sqlite3.h"<br />};<br />//////////////////////////////////////////////////////////////////////<br />// CSqlite Construction/Destruction<br />//////////////////////////////////////////////////////////////////////<br />//<br />CSqlite::CSqlite()<br />{<br />SqliteDB = 0;// 初始化<br />}<br />CSqlite::~CSqlite()<br />{<br />CloseDB();// 關閉資料庫<br />}<br />//////////////////////////////////////////////////////////////////////<br />// CSqliteRecordest Construction/Destruction<br />//////////////////////////////////////////////////////////////////////<br />CSqliteRecordset::CSqliteRecordset()<br />{<br />// 初始化成員變數<br />m_pVM = 0;<br />IsEOF = true;<br />iCols = 0;<br />m_pDB = 0;<br />}<br />CSqliteRecordset::CSqliteRecordset(sqlite3* pDB,sqlite3_stmt* pVM,bool bEOF,bool bFinalize/*=true*/)<br />{<br />// 成員變數賦值<br />m_pDB = pDB;<br />m_pVM = pVM;<br />IsEOF = bEOF;<br />iCols = sqlite3_column_count(m_pVM);<br />}<br />CSqliteRecordset::~CSqliteRecordset()<br />{<br />// 釋放記錄集指標<br />finalize();<br />}<br />//////////////////////////////////////////////////////////////////////<br />// CMyError Construction/Destruction<br />//////////////////////////////////////////////////////////////////////<br />CMyError::CMyError(const char* strErrMsg):runtime_error(strErrMsg) {}<br />//*********************************************<br />//<br />// 函數功能:串連SQLITE資料庫<br />// 參數:char*字串<br />// 傳回值:TRUE: 串連成功FALSE:串連失敗<br />// 作者:孫高朝2010.06.13<br />//<br />//*********************************************<br />bool CSqlite::OpenSqliteDB(const char *strNameDB)<br />{<br />int iOpenResult;<br />iOpenResult=0;<br />// 開啟SQLITE資料庫<br />iOpenResult = sqlite3_open(strNameDB,&SqliteDB);</p><p>if (iOpenResult != SQLITE_OK)<br />{<br />throw CMyError("資料庫打不開!");<br />}<br />return true;<br />}<br />//*********************************************<br />//<br />// 函數功能:執行資料庫操作<br />// 參數:TRUE: 串連成功FALSE:串連失敗<br />// 傳回值:返回記錄集數<br />// 作者:孫高朝2010.06.13<br />//<br />//*********************************************<br />bool CSqlite::ExecuteSQL(const char *strSQL)<br />{</p><p>int iOpenResult;// 存串連資料庫的結果<br />char* strErrMsg;// 錯誤資訊<br />iOpenResult=0;<br />// SQLITE資料庫在操作庫時,需要先執行BEGIN; 然後再以COMMIT;結束 才會生效<br />if (sqlite3_exec(SqliteDB, "BEGIN;", 0, 0, &strErrMsg))// 開始操作庫<br />{<br />throw CMyError(strErrMsg);<br />}<br />iOpenResult = sqlite3_exec(SqliteDB,strSQL,0, 0, &strErrMsg);// 執行SQL語句<br />if (iOpenResult != SQLITE_OK)<br />{<br />throw CMyError(strErrMsg);// 抓取錯誤資訊<br />}<br />if (sqlite3_exec(SqliteDB, "COMMIT;", 0, 0, &strErrMsg))// 資料庫操作生效<br />{<br />throw CMyError(strErrMsg);<br />}<br />return true;<br />}<br />//*********************************************<br />//<br />// 函數功能:讀取SQLITE資料庫表指定欄位<br />// 參數:const char *strTableName 表名<br />// const char *strFactor 查詢條件<br />// cconst char *strFieldName查詢欄位名<br />// 傳回值:返回記錄集<br />// 作者:孫高朝2010.06.13<br />//<br />//*********************************************<br />CSqliteRecordset CSqlite::ExecQuery(LPCTSTR strSQL)<br />{<br />int iResult;<br />sqlite3_stmt* pVM; </p><p>do<br />{<br />iResult = sqlite3_prepare(SqliteDB,strSQL,-1,&pVM,NULL);// 執行SQL語句查詢execute an SQL query<br />if (iResult != SQLITE_OK)// 執行成功SQLITE_OK Successful result<br />{<br />pVM=NULL;<br />throw CMyError(sqlite3_errmsg(SqliteDB));// 執行失敗 返回錯誤資訊<br />}<br />iResult = sqlite3_step(pVM);// 逐步查詢記錄 this function must be called one or more times to execute the statement.<br />if (SQLITE_DONE == iResult)// 完成查詢SQLITE_DONE sqlite3_step() has finished executing<br />{// 已經到最後一行<br />return CSqliteRecordset(SqliteDB, pVM, true/*EOF*/);<br />}<br />else if (SQLITE_ROW == iResult)// SQLITE_ROW sqlite3_step() has another row ready<br />{// 至少有一行<br />return CSqliteRecordset(SqliteDB, pVM, false/*EOF*/);<br />}<br />iResult = sqlite3_finalize(pVM);</p><p>} while (SQLITE_SCHEMA == iResult);// SQLITE_SCHEMA The database schema changed<br />throw CMyError(sqlite3_errmsg(SqliteDB));// 拋出異常<br />}<br />//*********************************************<br />//<br />// 函數功能:查詢SQLITE資料庫表是否存在<br />// 參數:const char *strTableName 表名<br />// 傳回值:TRUE: 存在FALSE:不存在<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />bool CSqlite::funCheckTable(string strTableName)<br />{<br />string strSQL;<br />const char* strTail;<br />string strFieldValue;<br />sqlite3_stmt* pStmt;<br />int iResult;<br />// sqlite_master 系統資料表 type 類型name 表名 只能小寫<br />strSQL = "SELECT * FROM sqlite_master WHERE type = 'table' AND name = '" + strTableName + "';";<br />if (sqlite3_prepare(SqliteDB,strSQL.c_str(),-1,&pStmt,&strTail))<br />{<br />throw CMyError(sqlite3_errmsg(SqliteDB));// 執行失敗 返回錯誤資訊<br />}<br />iResult = sqlite3_step(pStmt);// 執行SQL</p><p>sqlite3_finalize(pStmt);// 釋放stmt<br />if (iResult != SQLITE_ROW)// 無記錄<br />{<br />return false;<br />}<br />return true;<br />}<br />//*********************************************<br />//<br />// 函數功能:查是否到了記錄集尾<br />// 參數:<br />// 傳回值:TRUE: 到了FALSE:未到<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />bool CSqliteRecordset::RsEOF()<br />{<br />if (m_pVM == 0)// 是否有記錄指標<br />{<br />throw CMyError(_T("Null Virtual Machine pointer"));<br />}<br />return IsEOF;<br />}<br />//*********************************************<br />//<br />// 函數功能:擷取欄位值<br />// 參數:欄位名<br />// 傳回值:指定欄位值<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />LPCTSTR CSqliteRecordset::GetFieldValue(LPCTSTR strField)<br />{<br />int nField;// 擷取該欄位的列數<br />if (strField)// 欄位名不為空白<br />{<br />for (nField = 0;nField < iCols; nField++)<br />{<br />LPCTSTR szTemp = (LPCTSTR)sqlite3_column_name(m_pVM, nField);// 擷取對應列的欄位名<br />if (_tcscmp(strField, szTemp) == 0)// 比較連欄位名 相同 則擷取欄位值<br />{<br />return (LPCTSTR)sqlite3_column_text(m_pVM, nField);<br />}<br />}<br />}<br />throw CMyError(_T("Invalid field name requested"));// 欄位為空白 拋出異常<br />}<br />//*********************************************<br />//<br />// 函數功能:查記錄集的下一行<br />// 參數:<br />// 傳回值:TRUE: 到了FALSE:未到<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />void CSqliteRecordset::NextRow()<br />{<br />int nRet = sqlite3_step(m_pVM);<br />if (nRet == SQLITE_DONE)<br />{<br />// 已經到最後一行 行尾標誌位置一<br />IsEOF = true;<br />}<br />else if (nRet == SQLITE_ROW)<br />{<br />// 有行 行尾標誌位置0<br />IsEOF = false;<br />}<br />else<br />{<br />nRet = sqlite3_finalize(m_pVM);// 執行出錯 釋放記錄集指標<br />m_pVM = 0;<br />throw CMyError(sqlite3_errmsg(m_pDB));// 拋出異常<br />}<br />}<br />//*********************************************<br />//<br />// 函數功能:釋放記錄集指標<br />// 參數:<br />// 傳回值:<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />void CSqliteRecordset::finalize()<br />{<br />if (m_pVM)// 有記錄集指標<br />{<br />int nRet = sqlite3_finalize(m_pVM);// 釋放<br />m_pVM = 0;<br />if (nRet != SQLITE_OK)// 執行不成功則拋出異常<br />{<br />throw CMyError(sqlite3_errmsg(m_pDB));<br />}<br />}<br />}<br />//*********************************************<br />//<br />// 函數功能:關閉資料庫<br />// 參數:<br />// 傳回值:<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />void CSqlite::CloseDB()<br />{<br />if (SqliteDB)// 資料在開啟狀態<br />{<br />int nRet = sqlite3_close(SqliteDB); // 關閉資料庫</p><p>if (nRet != SQLITE_OK)<br />{<br />throw CMyError(sqlite3_errmsg(SqliteDB));<br />}</p><p>SqliteDB = 0;// 置0<br />}<br />}<br />//*********************************************<br />//<br />// 函數功能:返回到記錄集的首行<br />// 參數:<br />// 傳回值:<br />// 作者:孫高朝2010.06.17<br />//<br />//*********************************************<br />void CSqliteRecordset::MoveFrist()<br />{<br />if (m_pVM)<br />{<br />int nRet = sqlite3_reset(m_pVM);// 複位記錄集<br />NextRow();// 調用NextRow 執行一次sqlite3_step 產生記錄<br />IsEOF = false;// 尾標誌位清零<br />if (nRet != SQLITE_OK)<br />{<br />throw CMyError(sqlite3_errmsg(m_pDB));<br />}<br />}<br />}<br />

 

 


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.