SQLite C++操作类
为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码。代码如下:
void SqliteOperate(){TCHAR *szDbPath = _T("Book.db");::DeleteFile(szDbPath);SQLite sqlite;// 打开或创建数据库//******************************************************if(!sqlite.Open(szDbPath)){_tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());return;} //******************************************************// 创建数据库表 //******************************************************TCHAR sql[512] = {0};_stprintf(sql,_T("%s"),_T("CREATE TABLE [Book] (")_T("[id] INTEGER NOT NULL PRIMARY KEY, ")_T("[name] NVARCHAR(20), ")_T("[author] NVARCHAR(20), ")_T("[catagory_id] INTEGER REFERENCES [Category]([id]), ")_T("[abstruct] NVARCHAR(100) ,")_T("[path] NVARCHAR(50), ")_T("[image] BLOB);")_T("CREATE INDEX [Book_id] ON [Book] ([id]);"));if(!sqlite.ExcuteNonQuery(sql)){printf("Create database table failed...\n");}//******************************************************// 插入数据【普通方式】DWORD dwBeginTick = GetTickCount();//******************************************************// 当一次性插入多条记录时候,采用事务的方式,提高效率sqlite.BeginTransaction();// 批量插入数据for(int i=0;i<1000;i++){memset(sql,0,sizeof(sql));_stprintf(sql,_T("insert into Book(name,author,catagory_id) values('红高粱%d','莫言',1)"),i);if(!sqlite.ExcuteNonQuery(sql)){_tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());break;}}// 提交事务sqlite.CommitTransaction();printf("Insert Data Take %dMS...\n",GetTickCount()-dwBeginTick); //******************************************************// 插入数据【通过参数绑定的方式,提交批量数据时,比上面的普通模式效率更高(提高约45%),同时可支持插入二进制数据】dwBeginTick = GetTickCount(); //******************************************************// 当一次性插入多条记录时候,采用事务的方式,提高效率sqlite.BeginTransaction();memset(sql,0,sizeof(sql));_stprintf(sql,_T("insert into Book(name,author,catagory_id,image) values(?,'韩寒',?,?)"));SQLiteCommand cmd(&sqlite,sql);// 批量插入数据for(int i=0;i<1000;i++){TCHAR strValue[16] = {0};_stprintf(strValue,_T("他的国%d"),i);// 绑定第一个参数(name字段值)cmd.BindParam(1,strValue);// 绑定第二个参数(catagory_id字段值)cmd.BindParam(2,20);BYTE imageBuf[] = {0xff,0xff,0xff,0xff};// 绑定第三个参数(image字段值,二进制数据)cmd.BindParam(3,imageBuf,sizeof(imageBuf));if(!sqlite.ExcuteNonQuery(&cmd)){_tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());break;}}// 清空cmdcmd.Clear();// 提交事务sqlite.CommitTransaction();printf("Insert Data Take %dMS...\n",GetTickCount()-dwBeginTick); //******************************************************// 查询dwBeginTick = GetTickCount();//******************************************************memset(sql,0,sizeof(sql));_stprintf(sql,_T("%s"),_T("select * from Book where name = '他的国345'"));SQLiteDataReader Reader = sqlite.ExcuteQuery(sql);int index = 0;int len = 0;while(Reader.Read()){_tprintf( _T("***************【第%d条记录】***************\n"),++index);_tprintf( _T("字段名:%s 字段值:%d\n"),Reader.GetName(0),Reader.GetIntValue(0));_tprintf( _T("字段名:%s 字段值:%s\n"),Reader.GetName(1),Reader.GetStringValue(1));_tprintf( _T("字段名:%s 字段值:%s\n"),Reader.GetName(2),Reader.GetStringValue(2));_tprintf( _T("字段名:%s 字段值:%d\n"),Reader.GetName(3),Reader.GetIntValue(3));_tprintf( _T("字段名:%s 字段值:%s\n"),Reader.GetName(4),Reader.GetStringValue(4));// 读取图片二进制文件const BYTE *ImageBuf = Reader.GetBlobValue(6,len);_tprintf( _T("*******************************************\n"));}Reader.Close();printf("Query Take %dMS...\n",GetTickCount()-dwBeginTick); //******************************************************// 关闭数据库sqlite.Close();}
Insert Data Take 645MS...
Insert Data Take 229MS...
***************【第1条记录】***************
字段名:id 字段值:1346
字段名:name 字段值:他的国345
字段名:author 字段值:韩寒
字段名:catagory_id 字段值:20
字段名:abstruct 字段值:(null)
*******************************************
Query Take 63MS...