Как получить данные из межсистемного кэша БД через ODBC?

Вот как я пытаюсь получить данные из БД:

#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() всегда ложно, но я действительно знаю, что в таблице есть данные. Такое поведение воспроизводят в том случае, когда я пытаюсь получить данные из примеров таблиц Cache DB. Что я сделал не так?

Спасибо за вашу помощь.

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

[как я сказал в комментариях, я не знаком с этим API. Просто просматриваю документацию, когда отвечаю]

документация для конструктора QSqlQuery

Создает объект QSqlQuery, используя запрос SQL и базу данных db. Если db не указан или недействителен, используется база данных приложения по умолчанию. Если запрос не является пустой строкой, он будет выполнен.

Это означает, что ваш запрос открыт в базе данных по умолчанию (что бы это ни значило).

Глядя на документацию QSqlDatabase:

QSqlDatabase также поддерживает концепцию соединения по умолчанию, которое является неназванным соединением. Чтобы создать соединение по умолчанию, не передавайте аргумент имени соединения при вызове addDatabase().

однако, вы даете аргумент имени в вашей addDatabase ():

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

... это означает, что это не соединение по умолчанию.

Я думаю, что вы должны либо:

QSqlDatabase db = QSqlDatabase::addDatabase();

или же

QSqlQuery query=QSqlQuery(db);
Другие вопросы по тегам