如何通过ODBC从系统间缓存db获取数据

How to get data from intersystems cache db through ODBC?

本文关键字:缓存 db 获取 数据 系统 何通过 ODBC      更新时间:2023-10-16

这是我如何尝试从数据库获取数据:

#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,但我真的知道表中有一个数据。当我试图从缓存数据库的样例表中获取数据时,这种行为会重现。我做错了什么?

谢谢你的帮助。

问题是连接配置错误:

 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;");

[正如我在评论中所说的,我不熟悉这个API,只是在我回答时查看文档]

QSqlQuery构造函数的文档

使用SQL查询和数据库db构造一个QSqlQuery对象。如果没有指定db,或者是无效的,应用程序的默认值使用数据库。如果query不是空字符串,它将是空字符串执行。

这意味着你的查询是在默认数据库(不管这意味着什么)上打开的。

查看QSqlDatabase文档:

QSqlDatabase还支持默认连接的概念是未命名的连接。要创建默认连接,请不要在调用addDatabase()时传递连接名参数。

但是,您在addDatabase()中给出了一个名称参数:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

…这意味着它不是默认连接。

我猜你应该:

QSqlDatabase db = QSqlDatabase::addDatabase();

QSqlQuery query=QSqlQuery(db);