这是我尝试从db获取数据的方式:
#include <QCoreApplication>
#include <QtCore>
#include <QtSql>
#include "iostream"
int main(int argc, char *argv[])
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={InterSystems ODBC};SERVER=localhost;PORT=1972;DATABASE=USER;UID=_system;PWD=SYS; Unicode SQLTypes=1;");
if (!db.open())
{
std::cout << "Error opening database" << std::endl;
return -1;
}
else
{
QSqlQuery query;
if(query.exec("SELECT * FROM ACCOUNTS")){
std::cout << "Select succses!" << std::endl;
}
while (query.next())
{
std::cout << "Getting results..." << std::endl;
std::cout << query.value(0).toString().toStdString() << std::endl;
}
std::cout << "EXIT!" << std::endl;
return 0;
}
}
在query.exec(...)之后,query.next()始终为false,但我确实知道表中有数据。当我尝试从Cache DB的示例表中获取数据时,此行为会重现。我做错了什么?
感谢您的帮助。
答案 0 :(得分:2)
问题是连接配置错误:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={InterSystems ODBC};SERVER=localhost;PORT=1972;DATABASE=USER;UID=_system;PWD=SYS; Unicode SQLTypes=1;");
它应该是:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
db.setDatabaseName("DRIVER={InterSystems ODBC35};SERVER=localhost;PORT=1972;DATABASE=USER;UID=_system;PWD=SYS; Unicode SQLTypes=1;");
答案 1 :(得分:0)
[正如我在评论中所说,我不熟悉这个API只是在回答时查看文档]
的构造函数的文档使用SQL查询和数据库db构造QSqlQuery对象。 如果未指定db或无效,则应用程序的默认值 使用数据库。如果查询不是空字符串,它将是 执行。
这意味着您的查询在默认数据库上打开(无论这意味着什么)。
QSqlDatabase还支持默认连接的概念,即 是未命名的连接。要创建默认连接,请不要 调用addDatabase()时传递连接名称参数。
但是,你在addDatabase()中给出了一个名字参数:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
...这意味着它不是默认连接。
我猜你应该:
QSqlDatabase db = QSqlDatabase::addDatabase();
或
QSqlQuery query=QSqlQuery(db);