sqlite3数据库Native C++封装类(Unicode)Cppsqlite3U的初步认识与使用
(1)
http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
从上面的网址可以找到对sqlite数据库的C API的各种语言的封装。包括c、c++、vb、c#.net、delphi、Lisp、D、Java、Javascript、Objective-C、Perl、PHP、Python、Ruby、Lua、Fortran等等。从这也可以看出sqlite数据库作为本地数据存储工具而得到的广泛应用。单单是“C++ Wrappers”也有几十种,常见的如:easysqlite、sqlite++、Cppsqlite、CppsqliteU等等。因为我通常是在Windows CE嵌入式操作系统上开发APP,而Windows CE操作系统只支持Unicode字符集,所以今天要学习和测试的是Unicode版“C++ Wrappers”:CppsqliteU。
(2)
因为是在Windows CE操作系统上使用sqlite,所以在使用CppsqliteU之前,要先编译针对Windows CE平台的sqlite3 DLL。这一步省了,我直接借用了别人已经编译好的。
(3)
下面是一个简单测试示例,主要是利用class Cppsqlite3DB新建数据库、创建表、插入删除更新记录、使用事务、查询记录等等。
- #definesqlITE3_FILE_NAMETEXT("sqlite.db3")
- //获取程序当前路径
- voidGetCurrentDirectory(CString&szPath)
- {
- TCHARbuf[256]={0};
- GetModuleFileName(NULL,buf,sizeof(buf)/sizeof(TCHAR));
- szPath=buf;
- szPath=szPath.Left(szPath.ReverseFind('\\')+1);
- }
- CStringstrDbPath;
- GetCurrentDirectory(strDbPath);
- strDbPath+=sqlITE3_FILE_NAME;
- Cppsqlite3DBdb;
- try
- //打开或新建一个数据库
- db.open(strDbPath);
- //判断表名是否已经存在
- if(!db.tableExists(TEXT("Customers")))
- //不存在,新建表Customers
- db.execDML(TEXT("CREATETABLECustomers(cust_namevarchar(50)NOTNULLPRIMARYKEY,cust_addressvarchar(50));"));
- //插入1条记录
- db.execDML(TEXT("INSERTINTOCustomersVALUES('VillageToys','200MapleLane');"));
- db.execDML(TEXT("INSERTINTOCustomersVALUES('KidsPlace','333SouthLakeDrive');"));
- //删除1条记录
- db.execDML(TEXT("DELETEFROMCustomersWHEREcust_name='VillageToys';"));
- //使用显示事务插入10条记录
- TCHARbuf[256]={0};
- db.execDML(TEXT("BEGINTRANSACTION;"));
- for(inti=0;i<10;++i)
- {
- memset(buf,153); background-color:inherit; font-weight:bold">sizeof(buf));
- wsprintf(buf,TEXT("INSERTINTOCustomersVALUES('Fun%dALL','%dSunnyPlace');"),i,i);
- db.execDML(buf);
- db.execDML(TEXT("COMMITTRANSACTION;"));
- //更新1条记录
- db.execDML(TEXT("UPDATECustomeRSSETcust_address='454553rdStreet'WHEREcust_name='Fun0ALL';"));
- //获取总记录条数
- intnCount=db.execScalar(TEXT("SELECTCOUNT(*)FROMCustomers;"));
- TCHARszCount[50]={0};
- memset(szCount,153); background-color:inherit; font-weight:bold">sizeof(szCount));
- wsprintf(szCount,TEXT("Recordcount:%d."),nCount);
- AfxMessageBox(szCount);
- //获取每一条记录
- Cppsqlite3Queryq=db.execQuery(TEXT("SELECT*FROMCustomers;"));
- while(!q.eof())
- AfxMessageBox(q.fieldValue(0));
- q.nextRow();
- }
- //销毁语句
- q.finalize();
- //关闭数据库
- db.close();
- AfxMessageBox(TEXT("测试完成!"));
- catch(Cppsqlite3Exceptionex)
- AfxMessageBox(ex.errorMessage());
- }
(4)
Cppsqlite3U封装了4个类:Cppsqlite3Exception、Cppsqlite3DB、Cppsqlite3Statement、Cppsqlite3Query。
a)Cppsqlite3Exception用于捕捉异常,errorCode以整数类形返回错误码,errorMessage以Unicode字符串类型返回错误码。
@H_793_502@copy