1

我需要在我的 QT 代码中 同时读取 microsoft ODBC数据库和postgres数据库。

问题

  1. 一旦我打开数据库连接,我如何指示 qsqlQuery 使用哪一个?
  2. 为什么我的数据库连接失败但这些数据库存在
谢谢

#include <QtCore/QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <Qdebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //odbc
    QSqlDatabase dbODBC= QSqlDatabase::addDatabase("QODBC","microsoft_connection");
    dbODBC.setDatabaseName("BIO");
    if(!dbODBC.open())
    {
        qDebug()<<"failed to open BIO";
        exit(1);
    }
    //postgress
    QSqlDatabase dbPostgres= QSqlDatabase::addDatabase("QPSQL","postgres_connection");
    dbPostgres.setDatabaseName("makerere_boys_db");
    dbPostgres.setHostName("127.0.0.1");
    dbPostgres.setUserName("postgres");
    dbPostgres.setPassword("student");  
    if (!dbPostgres.open()) {
        qDebug()<<"failed to open postgres database";
        exit(1);
    }
    //how do i tell QSqlQuery to use dbODBC instead of dbPostgress?. Frustration follows
    QSqlQuery query;
    query.exec("SELECT * FROM fees");
    qDebug()<<query.value(0).toString();
    return a.exec();
    system("pause");
}

上面的代码可以编译,但是 QSqlQuery 说数据库没有打开

4

3 回答 3

3

请注意,您正在将此ctor 用于查询对象,并且仅对两个参数使用默认参数。注意文档所说的。因此,您告诉 ctor 使用默认数据库,该数据库必须是您的 postgres 数据库。

于 2012-05-09T16:04:38.553 回答
3

对于问题 #1:您需要将数据库作为参数传递给 QSqlQuery 构造函数:

QSqlQuery query(dbPostgres);
...

对于问题 #2:查看 QSqlDatabase 类的文档。在addDatabase它的功能描述的底部指出:

在使用连接之前,必须对其进行初始化。例如,调用部分或全部 setDatabaseName()、setUserName()、setPassword()、setHostName()、setPort() 和 setConnectOptions(),最后调用 open()。

看起来你只是在调用 setDatabaseName。您可能需要向对象提供所描述的附加信息。

于 2012-05-09T16:12:35.373 回答
1
QSqlQuery query1(QSqlDatabase::database("postgres_connection"));
query1.exec("SELECT * FROM fees");
while (query1.next()){
    QString col0 = query1.value(0).toString();
    QString col1 = query1.value(1).toString();
    qDebug() <<  QString("%1 , %2").arg(col0).arg(col1);
}



QSqlQuery query2(QSqlDatabase::database("microsoft_connection"));
query2.exec("SELECT * FROM fees");    
while (query2.next()){
    QString col0 = query2.value(0).toString();
    QString col1 = query2.value(1).toString();
    qDebug() <<  QString("%1 , %2").arg(col0).arg(col1);
}

有点题外话,但您实际上并不需要实例化 a QCoreApplication(or QApplication) 来针对 RDBMS 运行查询。您可以放心地注释掉

// this line
#include <QtCore/QCoreApplication>
// and this line
QCoreApplication a(argc, argv);
// and this line
return a.exec();
于 2012-05-09T23:15:40.460 回答