我在使用QSqlQuery执行sql语句时出错如下:
QSqlQuery::prepare: database not open
"Driver not loaded Driver not loaded"
可知错误为:驱动未加载!
但是程序成功连接到了Oracle数据库(qt需要提前编译oci驱动,并且qt和Oracle的位数一定要相同!!!编译教程可以参考其他博客)
连接Oracle的代码:
void MainWindow::on_Btn_LinkSQL_clicked()
{
//连接Oracle数据库
db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("localhost");
db.setDatabaseName("ORCL");
db.setPort(1521);
db.setUserName("scott");
db.setPassword("123456");
if(db.open())
{
QMessageBox::StandardButton ok=QMessageBox::information(this, "连接成功","数据库连接成功!");
ui->Btn_LinkSQL->setEnabled(false);
ui->statusBar->showMessage(tr("数据库连接状态:已连接"));
}else
{
QMessageBox::StandardButton wrong=QMessageBox::warning(this, "连接失败","请检查数据库账号密码是否正确!");
ui->statusBar->showMessage(tr("数据库连接状态:未连接"));
}
}
使用QSqlDatabase::Driver可以查看加载的sql驱动:
打印出来,可以看到是有qsqloci、qsqlocdi的,证明驱动是正常加载的,
那为什么会出现"Driver not loaded Driver not loaded"呢?
问题出现在:
QSqlQuery
对象采用默认的数据库连接,但以防万一,在创建将 db(实例的数据库名称) 作为参数传递的对象(QSqlQuery query(db);
),这能强制它针对您的数据库进行查询。
我在打开数据库之前声明了 QSqlQuery
对象。
如果要在不传递数据库连接的情况下执行此操作,请在创建数据库连接后创建查询对象,它应将其作为默认连接(前提是之前没有其他创建的数据库连接)。
所以说,需要先连接数据库后再实例query对象,避免绑定不到数据库对象。