上一节从网络上找了一个一般的示例给大家,下面将逐步修改代码将其变为常规开发中可用的可复用代码。
首先说下上面的代码在本人实际使用过程中遇到的问题及如何结果
1、创建程序后提示“QsqlDatabase: No such file or directory” 的错误
2、大部分的实例中直接通过在main函数声明QsqlDatabasedbconn=QsqlDatabase::addDatabase("QsqlITE")来添加数据库,创建的QsqlDatabase对象的作用域有问题,即在其他的函数或这类对象中使用此局部对象的问题,还有就是在其他非dbconn作用域函数中在debug调试版本中可以通过QsqlQuery得到结果,但是在非debug调试版本中无法获取到结果
3、在使用QsqlQuery的时候直接通过如下方式使用
- {
- .....
- QsqlQueryquery;
- query.exec("createtablestudent(idvarchar,namevarchar)");
- .....
- }
{
.....
QsqlQuery query;
query.exec("create table student(id varchar,name varchar)");
.....
}
首先说明这条语句可以执行的前提是在同一个函数中(前面示例中为main函数),且声明的QsqlDatabase对象在同一个作用域中;
如果在其他非QsqlDatabase对象的函数或作用域中的时候在debug的调试状态下可以得到QsqlQuery 的执行结果,但是在非debug调试状态下将得不到所要的结果(如通过QsqlQuery 执行select语句)
4、使用QsqlQuery 没有任何参数的对象,运行exec函数的时候如何查找我要执行那个数据库的sql语句?
针对以上的问题,可以有以下的解决方法
1、可以通过在工程的pro文件添加QT += sql 使工程(或lib)支持数据库的操作
2、可以通过如下代码方式创建一个QsqlDatabase的指针,然后将指针保存在类中,这样就可以解决作用域的问题,
为了防止QsqlQuery查询不到结果,最好是创建数据库的时候指定链接名(connectionName),就是上面代码的第二个参数。
3、在使用了2的解决方案后,其实3也就容易解决了,在声明QsqlQuery的时候加上QsqlDatabase 参数,代码如下
其中m_sqliteDB是通过2的方案中创建的指针的解引用。