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
- #define SQLITE_H
- // Standard constants
- #undef NULL
- #define NULL 0
- #include "sqlite3.h"
- #include <stdio.h>
- #include <iostream>
- #include <string>
- #include <windows.h>
- #include <tchar.h>
- using namespace std; // 定义命名空间
- #pragma comment(lib,"sqlite3.lib") // 加载 sqlite3.DLL
- //////////////////////////////////////////////////////////////////////////
- // 类功能: 操作SQLITE数据库时的出错处理
- // 作者: 孙高朝
- // 日期: 2010.06.14
- //////////////////////////////////////////////////////////////////////
- class CMyError:public std::runtime_error // 继承与 experience类
- {
- public:
- CMyError(const char* strErrMsg);
- };
- //////////////////////////////////////////////////////////////////////////
- // 类功能: 数据库记录集类
- // 作者: 孙高朝
- // 日期: 2010.06.14
- //////////////////////////////////////////////////////////////////////
- class CSqliteRecordset
- {
- public:
- void finalize(); // 释放记录集函数
- void NextRow(); // 记录指针移动函数
- LPCTSTR GetFieldValue(LPCTSTR strField); // 获取字段值
- bool RsEOF(); // 记录集指针末尾函数
- CSqliteRecordset(sqlite3* pDB,sqlite3_stmt* pVM,bool bEof,bool bFinalize=true);
- CSqliteRecordset();
- ~CSqliteRecordset();
- public:
- void MoveFrist();
- private:
- int iCols; // 列数
- sqlite3* m_pDB; // 定义数据库对象
- sqlite3_stmt* m_pVM; // 记录集指针 An instance of the following opaque structure is used to represent a compiled SQL statment.
- bool IsEOF; // 末尾标志位
- bool IsFinalize; // 释放标志位
- };
- //////////////////////////////////////////////////////////////////////////
- // 类功能: 操作SQLITE数据库 打开数据库 执行操作数据库 读数据库表
- // 作者: 孙高朝
- // 日期: 2010.06.14
- //////////////////////////////////////////////////////////////////////
- class CSqlite
- {
- public:
- void CloseDB();
- bool ExecuteSQL(const char* strSQL); // 执行SQL语句函数
- bool OpenSqliteDB(const char* strNameDB); // 连接数据库操作
- bool funCheckTable(string strTableName); // 检查数据表是否存在 存在 TRUE 不存在 FALSE
- CSqliteRecordset ExecQuery(LPCTSTR strSQL); // 读取特定字段的值
- CSqlite();
- virtual ~CSqlite();
- private:
- sqlite3* SqliteDB; // 定义数据库对象
- };
- #endif
Sqlite.cpp
- // Sqlite.cpp: implementation of the CSqlite class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "Sqlite.h"
- extern "C"
- {
- #include "sqlite3.h"
- };
- //////////////////////////////////////////////////////////////////////
- // CSqlite Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- //
- CSqlite::CSqlite()
- {
- SqliteDB = 0; // 初始化
- }
- CSqlite::~CSqlite()
- {
- CloseDB(); // 关闭数据库
- }
- //////////////////////////////////////////////////////////////////////
- // CSqliteRecordest Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CSqliteRecordset::CSqliteRecordset()
- {
- // 初始化成员变量
- m_pVM = 0;
- IsEOF = true;
- iCols = 0;
- m_pDB = 0;
- }
- CSqliteRecordset::CSqliteRecordset(sqlite3* pDB,sqlite3_stmt* pVM,bool bEOF,bool bFinalize/*=true*/)
- {
- // 成员变量赋值
- m_pDB = pDB;
- m_pVM = pVM;
- IsEOF = bEOF;
- iCols = sqlite3_column_count(m_pVM);
- }
- CSqliteRecordset::~CSqliteRecordset()
- {
- // 释放记录集指针
- finalize();
- }
- //////////////////////////////////////////////////////////////////////
- // CMyError Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CMyError::CMyError(const char* strErrMsg):runtime_error(strErrMsg) {}
- //*********************************************
- //
- // 函数功能: 连接SQLITE数据库
- // 参数: char* 字符串
- // 返回值: TRUE: 连接成功 FALSE:连接失败
- // 作者: 孙高朝 2010.06.13
- //
- //*********************************************
- bool CSqlite::OpenSqliteDB(const char *strNameDB)
- {
- int iOpenResult;
- iOpenResult=0;
- // 打开SQLITE数据库
- iOpenResult = sqlite3_open(strNameDB,&SqliteDB);
-
- if (iOpenResult != SQLITE_OK)
- {
- throw CMyError("数据库打不开!");
- }
- return true;
- }
- //*********************************************
- //
- // 函数功能: 执行数据库操作
- // 参数: TRUE: 连接成功 FALSE:连接失败
- // 返回值: 返回记录集数
- // 作者: 孙高朝 2010.06.13
- //
- //*********************************************
- bool CSqlite::ExecuteSQL(const char *strSQL)
- {
-
- int iOpenResult; // 存连接数据库的结果
- char* strErrMsg; // 错误信息
- iOpenResult=0;
- // SQLITE数据库在操作库时,需要先执行BEGIN; 然后再以COMMIT;结束 才能生效
- if (sqlite3_exec(SqliteDB, "BEGIN;", 0, 0, &strErrMsg)) // 开始操作库
- {
- throw CMyError(strErrMsg);
- }
- iOpenResult = sqlite3_exec(SqliteDB,strSQL,0, 0, &strErrMsg); // 执行SQL语句
- if (iOpenResult != SQLITE_OK)
- {
- throw CMyError(strErrMsg); // 抓取错误信息
- }
- if (sqlite3_exec(SqliteDB, "COMMIT;", 0, 0, &strErrMsg)) // 数据库操作生效
- {
- throw CMyError(strErrMsg);
- }
- return true;
- }
- //*********************************************
- //
- // 函数功能: 读取SQLITE数据库表指定字段
- // 参数: const char *strTableName 表名
- // const char *strFactor 查询条件
- // cconst char *strFieldName 查询字段名
- // 返回值: 返回记录集
- // 作者: 孙高朝 2010.06.13
- //
- //*********************************************
- CSqliteRecordset CSqlite::ExecQuery(LPCTSTR strSQL)
- {
- int iResult;
- sqlite3_stmt* pVM;
-
- do
- {
- iResult = sqlite3_prepare(SqliteDB,strSQL,-1,&pVM,NULL); // 执行SQL语句查询 execute an SQL query
- if (iResult != SQLITE_OK) // 执行成功 SQLITE_OK Successful result
- {
- pVM=NULL;
- throw CMyError(sqlite3_errmsg(SqliteDB)); // 执行失败 返回错误信息
- }
- iResult = sqlite3_step(pVM); // 逐步查询记录 this function must be called one or more times to execute the statement.
- if (SQLITE_DONE == iResult) // 完成查询 SQLITE_DONE sqlite3_step() has finished executing
- { // 已经到最后一行
- return CSqliteRecordset(SqliteDB, pVM, true/*EOF*/);
- }
- else if (SQLITE_ROW == iResult) // SQLITE_ROW sqlite3_step() has another row ready
- { // 至少有一行
- return CSqliteRecordset(SqliteDB, pVM, false/*EOF*/);
- }
- iResult = sqlite3_finalize(pVM);
-
- } while (SQLITE_SCHEMA == iResult); // SQLITE_SCHEMA The database schema changed
- throw CMyError(sqlite3_errmsg(SqliteDB)); // 抛出异常
- }
- //*********************************************
- //
- // 函数功能: 查询SQLITE数据库表是否存在
- // 参数: const char *strTableName 表名
- // 返回值: TRUE: 存在 FALSE:不存在
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- bool CSqlite::funCheckTable(string strTableName)
- {
- string strSQL;
- const char* strTail;
- string strFieldValue;
- sqlite3_stmt* pStmt;
- int iResult;
- // sqlite_master 系统表 type 类型 name 表名 只能小写
- strSQL = "SELECT * FROM sqlite_master WHERE type = 'table' AND name = '" + strTableName + "';";
- if (sqlite3_prepare(SqliteDB,strSQL.c_str(),-1,&pStmt,&strTail))
- {
- throw CMyError(sqlite3_errmsg(SqliteDB)); // 执行失败 返回错误信息
- }
- iResult = sqlite3_step(pStmt); // 执行SQL
-
- sqlite3_finalize(pStmt); // 释放stmt
- if (iResult != SQLITE_ROW) // 无记录
- {
- return false;
- }
- return true;
- }
- //*********************************************
- //
- // 函数功能: 查是否到了记录集尾
- // 参数:
- // 返回值: TRUE: 到了 FALSE:未到
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- bool CSqliteRecordset::RsEOF()
- {
- if (m_pVM == 0) // 是否有记录指针
- {
- throw CMyError(_T("Null Virtual Machine pointer"));
- }
- return IsEOF;
- }
- //*********************************************
- //
- // 函数功能: 获取字段值
- // 参数: 字段名
- // 返回值: 指定字段值
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- LPCTSTR CSqliteRecordset::GetFieldValue(LPCTSTR strField)
- {
- int nField; // 获取该字段的列数
- if (strField) // 字段名不为空
- {
- for (nField = 0;nField < iCols; nField++)
- {
- LPCTSTR szTemp = (LPCTSTR)sqlite3_column_name(m_pVM, nField); // 获取对应列的字段名
- if (_tcscmp(strField, szTemp) == 0) // 比较连字段名 相同 则获取字段值
- {
- return (LPCTSTR)sqlite3_column_text(m_pVM, nField);
- }
- }
- }
- throw CMyError(_T("Invalid field name requested")); // 字段为空 抛出异常
- }
- //*********************************************
- //
- // 函数功能: 查记录集的下一行
- // 参数:
- // 返回值: TRUE: 到了 FALSE:未到
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- void CSqliteRecordset::NextRow()
- {
- int nRet = sqlite3_step(m_pVM);
- if (nRet == SQLITE_DONE)
- {
- // 已经到最后一行 行尾标志位置一
- IsEOF = true;
- }
- else if (nRet == SQLITE_ROW)
- {
- // 有行 行尾标志位置0
- IsEOF = false;
- }
- else
- {
- nRet = sqlite3_finalize(m_pVM); // 执行出错 释放记录集指针
- m_pVM = 0;
- throw CMyError(sqlite3_errmsg(m_pDB)); // 抛出异常
- }
- }
- //*********************************************
- //
- // 函数功能: 释放记录集指针
- // 参数:
- // 返回值:
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- void CSqliteRecordset::finalize()
- {
- if (m_pVM) // 有记录集指针
- {
- int nRet = sqlite3_finalize(m_pVM); // 释放
- m_pVM = 0;
- if (nRet != SQLITE_OK) // 执行不成功 则抛出异常
- {
- throw CMyError(sqlite3_errmsg(m_pDB));
- }
- }
- }
- //*********************************************
- //
- // 函数功能: 关闭数据库
- // 参数:
- // 返回值:
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- void CSqlite::CloseDB()
- {
- if (SqliteDB) // 数据在打开状态
- {
- int nRet = sqlite3_close(SqliteDB); // 关闭数据库
-
- if (nRet != SQLITE_OK)
- {
- throw CMyError(sqlite3_errmsg(SqliteDB));
- }
-
- SqliteDB = 0; // 置0
- }
- }
- //*********************************************
- //
- // 函数功能: 返回到记录集的首行
- // 参数:
- // 返回值:
- // 作者: 孙高朝 2010.06.17
- //
- //*********************************************
- void CSqliteRecordset::MoveFrist()
- {
- if (m_pVM)
- {
- int nRet = sqlite3_reset(m_pVM); // 复位记录集
- NextRow(); // 调用NextRow 执行一次sqlite3_step 产生记录
- IsEOF = false; // 尾标志位清零
- if (nRet != SQLITE_OK)
- {
- throw CMyError(sqlite3_errmsg(m_pDB));
- }
- }
- }