转自:http://blog.sina.com.cn/s/blog_14e2781330102w7xm.html
QKingbase原理:
在QT中,QTSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口。QSqlDatabase对象表征了与数据库的关联。QT使用驱动程序与各种数据库的应用编程接口进行通信。
由于授权许可的限制,QT无法提供所有的驱动程序,这个时候就需要以插件的形式来建立驱动程序了。
插件就是一个动态库,它的本质在于不修改程序主体(平台)的情况下对软件功能进行扩展与加强,当插件需要的接口公开后,任何公司或个人都可以制作自己的插件来解决一些操作上的不便或增加新的功能,也就是实现真正意义上的“即插即用”软件开发。平台+插件软件结构是将一个待开发的目标软件分为两部分,一部分为程序的主体或主框架,可定义为平台,另一部分为功能扩展或补充模块,可定义为插件。Kingbase的驱动程序就是作为插件来实现对QT功能的扩展的。
QT插件必须放在特殊的子目录下(如plugins/xxx),QT应用程序会可执行文件所在目录下的plugins目录下查找插件。如果希望把插件配置到不同于此的目录下。可以调用Qcoreapplication::addLibraryPath()来扩展插件的搜索路径,或者也可以在启动程序之前设置QT_PLUGIN_PATH环境变量。
QKingbase的实现核心在于继承了QT中的两个接口类,或者说是QT中专门提供了这两个接口类以利于功能的扩展。
QKingbaseDriver : public QSqlDriver;
QKingbaseResult : public QSqlResult;
接口类的特点是主要子函数都是虚函数,这一点保证了我们可以在它的子类中尽情发挥。kingbase提供的插件对于和数据库特性有关的操作都在继承于QT接口类的子类中进行了实现,通过这种多态的方式完成了QT对于kingbase数据库的访问和处理等操作。
附QT开发中操作kingbase数据库的流程:
1、工程PRo文件中添加
QT += sql
2、引入头文件
#include <QtSql/QSql>#include <QtSql/QSqlDatabase>#include <QtSql/QSqlError>#include <QtSql/QSqlQuery>
3、通常情况下,是在应用程序中调用一个单独函数来建立数据库连接。例如:
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("acidalia");
db.setDatabaseName("customdb");
db.setUserName("mojito");
db.setPassWord("J0a1m8");
db.open();
这里首先调用QSqlDatabase::addDatabase()来创建QsqlDatabase对象。addDatabase()的第一个参数指定了QT必须使用哪一个数据库驱动程序来访问这个数据库。接下来要和选定的数据库进行连接, 通过设置主机名,数据库名,用户名及密码来连接数据库。Kingbase也支持通过服务名来和数据库进行连接,当没有设置主机名的时候,db.setDatabaseName()设置的其实就是服务名,行为和DCi或者OCCI一致,这里注意正确配置好服务名以及设置好环境变量。
一旦连接建立,就可以使用QSqlQuery执行底层数据库支持的任何SQL语句了。
例如。以下是如何执行SELECT语句的代码:
QSqlQuery query;
query.exec("select * from student");
在exec()调用之后,可以便利查询的结果集:
while ( query.next() ) {
qWarning() << "Row: " << query.at() + 1 << ", ";
for (int i = 0; i < query.record().count(); i++) {
qWarning() << qPrintable(query.value(i).toString()) << ", ";
}
}
只要调用next()一次,就可以把这个QSqlQuery定位到结果集中的第一行记录。随后的next()调用,每次都会把记录指针前移一条记录,直到到达结尾时才返回FALSE。如果结果集为空(或查询失败),那么next的第一次调用就返回FALSE。 value()把获得的字段值作为QVariant返回。QVariant 作为一个数据类型的联合,存储在数据库中的不同类型的数据都可以映射为相应的C++和QT类型存储在QVariant中。
此外,插入数据除了query.exec("insert into student values( 2,
’jincang’)");这种方式外,也可以采用以下方法:对于需要一次插入多条记录或者避免将数值转换为字符串的插入需求,可以使用prepare()来指定一个包含占位符的语句,然后绑定要插入的数值。
query.prepare("insert into student values(?,?)");
ids << 11 << 12 << 13;
names<<"Dannby"<<"Penny"<<"HANMEIMEI";
query.addBindValue(ids);
query.addBindValue(names);
if(!query.execBatch())
{
qDebug() << "error: " << query.lastError().text() << endl;
return 1;
}
新闻热点
疑难解答