我需要在我的QT代码中读取微软 ODBC 数据库和 postgres 数据库同时。
问题
#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表示数据库未打开
答案 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();