2007年3月1日木曜日

SQLite调用C++封装类

如果你已经习惯了面向对象编写代码,那么对Sqlite提供的C接口可能让你使用起来比较费劲。所以你需要对sqliteC接口进行封装,用面向对象的方法使用sqlite。以下介绍一个对sqliteC++封装。

先来看看封装之后的使用方法吧:

Void main(void) {

try {

/*

打开一个数据库连接,只需创建一个sqlite3_connection对象指定要连接的数

据库,如果数据不存在创建这个数据库。

*/

sqlite3_connection con("test.db");

/*

执行一条sql语句,查询当前系统是否存在表名为’t_test’的表

直接调用sqlite3_connection的方法可以执行语句,并根据语句类型返回不同类型的值,当然需要调用不同的方法,比如返回一个string型的值可以调用con.executestring()方法。

*/

int count=con.executeint("select count(*) from sqlite_master where name='t_test';");//

if(count==0)

{

/*

创建数据表:t_test,包含两个字段。

*/

con.executenonquery("create table t_test(number,string);");

}

//为了测试使用和不使用事务的时候效率的区别

time_t begin,end;

begin = time(NULL);

/*

使用事务执行语句

*/

sqlite3_transaction trans(con);

{

/*

创建sqlite3_command对象来执行语句,对于需要给定参数的地方,可以在语句上写“?”,在用bind()方法来给定参数的实际值。

*/

sqlite3_command cmd(con, "insert into t_test values(?,?);");

cmd.bind(2, "foobar", 6);

for(int i=0; i<1000000;>

cmd.bind(1, (int)i);

cmd.executenonquery();

}

}

trans.commit();

end = time(NULL);

con.close();

cout<<"execute time"<<

}

catch(exception &ex) {

/*

捕捉异常,输出异常信息

*/

cerr << "Exception Occured: " <<>

}

}

这样使用起来很方便,相比以前纯C接口中的回调函数,这个使用方式更加符合面向对象的思想。而且加上了异常捕捉的信息之后可以很方便的对程序中出现的问题进行判断。比如一个sql语句写错了,或者是数据库读写冲突都可以在exception信息中给出。调试起来也是相当容易的。

SQLite原来自带的回调函数方法比较的复杂,而且并没有什么实质性的好处,使用起来不太方便,数据在调用函数与回调函数之间的传递也比较麻烦。而且对面向对象的思想也是一种破坏,因此推荐使用此封装类。

使用封装类对于SQLite的另外一个主要的问题也比较容易解决-----数据库的锁定问题。关于这个问题我们将在下一篇文章中介绍。

下载本文所提到的源代码

0 件のコメント: