关于 SQLite
这是一个用 C++ 编写的简单 SQLite 包装器。SQLite 是一个嵌入式 SQL 数据库引擎,经过全面测试。SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。
SQLite 数据库的描述请访问
这里。Windows OS 版 SQLite 可在此
下载。
SQLite 包装器
此源代码提供创建数据库和在便携式数据库中运行查询的简单方法。创建的 SQLite 数据库文件是平台独立的,可以在 Windows 或 Linux OS 上使用或复制。
SQLiteDB 类
此类包含 SQLite 包装器的方法。
打开连接的方法接受两个参数,第一个是数据库文件名,可以是 *.db 格式,第二个是 DB 文件将创建的目录。如果 DB 文件已存在,则会打开它,否则会创建一个新文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
class SQLiteDB : public IResult
{
public:
SQLiteDB();
~SQLiteDB();
/*Open Connection*/
bool OpenConnection(string DatabaseName,string DatabaseDir);
/*Close Connection*/
void CloseConnection();
/*Query Wrapper*/
/*For large insert operation Memory Insert option for SQLLITE dbJournal*/
void BeginTransaction();
void CommitTransection();
/*This Method called when SELECT Query to be excuted.
Return RESULTSET class pointer on success else NULL of failed*/
IResult* ExcuteSelect(const char *Query);
/*This Method called when INSERT/DELETE/UPDATE Query to be excuted.
Return UINT count of effected data on success*/
UINT Excute(const char *Query);
/*Get Last Error of excution*/
string GetLastError();
/*Return TRUE if databse is connected else FALSE*/
bool isConnected() ;
protected:
/*SQLite Connection Object*/
typedef struct SQLLITEConnection
{
string SQLiteDatabaseName; //Database Name
string SQLiteDBPath; //Databse File Dir
sqlite3 *pCon; //SQLite Connection Object
sqlite3_stmt *pRes; //SQLite statement object
}SQLITECONNECTIONOBJECT;
//SQLite Connection Details
SQLITECONNECTIONOBJECT *pSQLiteConn;
/*Sync Database in Case of Multiple Threads using class object*/
SyncDB *Sync;
bool m_bConnected; /*Is Connected To DB*/
bool m_bConsole; /*If Console Application*/
string m_strLastError; /*Last Error String*/
int m_iColumnCount; /*No.Of Column in Result*/
private:
/*This function return of count of column
present in result set of last excueted query*/
int GetColumnCount();
/*Get the next coloumn name*/
const char* NextColomnName(int iClmnCount);
/*This function returns TRUE if still rows are
der in result set of last excueted query FALSE
if no row present*/
bool Next();
/*Get the next coloumn data*/
const char* ColomnData(int clmNum);
/*RELEASE all result set as well as RESET all data*/
void Release();
};
|
可以在方法
IResult* ExcuteSelect(const char *Query);
中执行 select 查询,该方法返回 IResult 接口类的对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
/*Interface class for Result data of query*/
class IResult
{
public:
/*This function return of count of column
present in result set of last excueted query*/
virtual int GetColumnCount() = 0;
/*Get the next coloumn name*/
virtual const char* NextColomnName(int iClmnCount) = 0;
/*This function returns TRUE if still rows are
der in result set of last excueted query FALSE
if no row present*/
virtual bool Next() = 0;
/*Get the next coloumn data*/
virtual const char* ColomnData(int clmNum) = 0;
/*RELEASE all result set as well as RESET all data*/
virtual void Release() = 0;
};
|
如何使用
测试文件 SQLiteTest.cpp 使用 SQLLite Wrapper 类实现。对于大量数据插入,使用 void
void BeginTransaction();
和
void CommitTransection();
方法。如果不使用这些方法,多次插入将比平时花费更长的时间。
IResult 类具有纯虚方法,用于提供读取结果数据的接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
//Get Data From DB
IResult *res=pSQLite->ExcuteSelect("Select * from test;");
if(!res)
cout<<"\n Error:"<<pSQLite->GetLastError().c_str();
else
{
//Get Column Count
int i = res->GetColumnCount();
//Print Colomn Name
for(int k=0;k<i;k++)
{
printf("%s\t",res->NextColomnName(k));
}
cout<<endl;
//Print Result
while(res->Next())
{
for(int k=0;k<i;k++)
printf("%s\t",res->ColomnData(k));
cout<<endl;
}
//release Result Data
res->Release();
}
|
附件:[SQLiteTest.cpp] [SQLLiteWrapper.cpp] [SQLLiteWrapper.h]