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新建数据库、创建表、插入删除更新记录、使用事务、查询记录等等。
[cpp]
view plain
copy
- #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字符串类型返回错误码。
copy
class CppSQLite3Exception
public:
……
constinterrorCode(){returnmnErrCode;}
LPCTSTRerrorMessage(){returnmpszErrMess;}
staticLPCTSTRerrorCodeAsString(intnErrCode);
};
通常用法如:
copy
try
……
catch(CppSQLite3Exceptionex)
b)CppSQLite3DB用于新建数据库,打开关闭数据库连接,执行DML、DDL,检索数据等。如:open打开数据库连接,close关闭数据库连接,tableExists检查某表是否存在,execDML执行SQL命令,execQuery检索记录,setBusyTimeout设置SQLite内部的busy handler的超时时间,SQLiteVersion返回SQLite版本。
copy
class CppSQLite3DB
voidopen(LPCTSTRszFile);
voidclose();
booltableExists(LPCTSTRszTable);
intexecDML(LPCTSTRszSQL);
CppSQLite3QueryexecQuery(LPCTSTRszSQL);
intexecScalar( CStringexecScalarStr( CppSQLite3StatementcompileStatement( sqlite_int64lastRowId();
voidinterrupt(){sqlite3_interrupt(mpDB);}
voidsetBusyTimeout(intnMillisecs);
staticchar*SQLiteVersion(){returnSQLITE_VERSION;}
};
c)CppSQLite3Statement也可以执行SQL命令,它最大的特点是支持参数绑定。对于参数绑定的用处,参考“SQlite数据库的C编程接口(四) 绑定参数(Bound Parameters) ——《Using SQlite》读书笔记”学习。该类导出的接口函数中,bind用于给SQL语句中的参数绑定指定的值,reset函数用于重置SQL语句,finalize用于销毁语句。
copy
class CppSQLite3Statement
CppSQLite3Statement&operator=(constCppSQLite3Statement&rStatement);
intexecDML();
CppSQLite3QueryexecQuery();
voidbind(intnParam,LPCTSTRszValue);
intnValue);
doubledwValue);
constunsignedchar*blobValue,87); background-color:inherit; font-weight:bold">intnLen);
voidbindNull(intnParam);
voidreset();
voidfinalize();
用法如:
copy
CppSQLite3DBdb;
db.execDML("CREATETABLEemp(empnoint,empnamechar(20));");
db.execDML("BEGINTRANSACTION;");
CppSQLite3Statementstmt=db.compileStatement("INSERTINTOempVALUES(:empno,:empname);");
for(i=0;i<nRowsToCreate;++i)
charbuf[16];
sprintf(buf,"EmpName%06d",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> stmt.bind(":empno",i);
stmt.bind(":empname",buf);
stmt.execDML();
stmt.reset();
db.execDML("COMMITTRANSACTION;");
catch(CppSQLite3Exception&e)
cerr<<e.errorCode()<<":"<<e.errorMessage()<<endl;
d)CppSQLite3Query用于检索记录并读出结果。它导出的public接口函数大多都是SQLite3的C API _sqlite3_column_xxx函数的封装,通过该API函数读取结果集中某一行的某一列。nextRow函数用于检索下一行,eof用于判断是否到结果集的结尾。
copy
classCppSQLite3Query
…….
intnumFields();
intfieldIndex(LPCTSTRszField);
LPCTSTRfieldName(intnCol);
LPCTSTRfieldDeclType(intnCol);
intfieldDataType(LPCTSTRfieldValue(intnField);
LPCTSTRszField);
intgetIntField(intnField,87); background-color:inherit; font-weight:bold">intnNullValue=0);
LPCTSTRszField,87); background-color:inherit; font-weight:bold">intnNullValue=0);
doublegetFloatField(doublefNullValue=0.0);
doublefNullValue=0.0);
LPCTSTRgetStringField(LPCTSTRszNullValue=_T(""));
LPCTSTRszNullValue=_T(""));
char*getBlobField(int&nLen);
int&nLen);
boolfieldIsNull(booleof();
voidnextRow();
SQLite3数据库Native C++封装类(Unicode)CppSQLite3U的初步认识与使用 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|