QT噩梦与2个同步数据库连接

时间:2012-05-09 15:36:40

标签: c++ database qt

我需要在我的QT代码中读取微软 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表示数据库未打开

3 个答案:

答案 0 :(得分:3)

注意,您正在使用this ctor作为查询对象,并且只使用两个参数的默认参数。注意文档说的内容。因此,您告诉ctor使用默认数据库,该数据库必须是适合您的postgres。

答案 1 :(得分:3)

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

QSqlQuery query(dbPostgres);
...

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

  

在使用连接之前,必须初始化它。例如,打电话给一些   或者所有setDatabaseName(),setUserName(),setPassword(),   setHostName(),setPort()和setConnectOptions(),最后,   打开()。

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

答案 2 :(得分: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);
}

有点偏离主题,但您并不需要实例化QCoreApplication(或QApplication)来对RDBMS运行查询。您可以放心地注释掉

// this line
#include <QtCore/QCoreApplication>
// and this line
QCoreApplication a(argc, argv);
// and this line
return a.exec();