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

問題 #1: データベースを引数として QSqlQuery コンストラクターに渡す必要があります。

QSqlQuery query(dbPostgres);
...

問題 #2 の場合: QSqlDatabase クラスのドキュメントを参照してください。関数の説明の下部に次のように記載されaddDatabaseています。

接続を使用する前に、初期化する必要があります。たとえば、setDatabaseName()、setUserName()、setPassword()、setHostName()、setPort()、および setConnectOptions() の一部またはすべてを呼び出し、最後に open() を呼び出します。

setDatabaseName のみを呼び出しているようです。説明されている追加情報をオブジェクトに提供する必要がある場合があります。

于 2012-05-09T16:12:35.373 に答える
3

クエリ オブジェクトにこのctor を使用しており、両方のパラメーターにデフォルトの引数を使用していることに注意してください。ドキュメントの内容に注意してください。したがって、デフォルトのデータベースを使用するように ctor に指示しています。これは、postgres である必要があります。

于 2012-05-09T16:04:38.553 に答える
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);
}

トピックから少し外れていますが、RDBMS に対してクエリを実行するためにQCoreApplication(または) をインスタンス化する必要はありません。QApplication安全にコメントアウトできます

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