Как получить данные из межсистемного кэша БД через 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;");
2

Другие решения

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

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

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

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

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

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

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

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

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

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

QSqlDatabase db = QSqlDatabase::addDatabase();

или же

QSqlQuery query=QSqlQuery(db);
0

По вопросам рекламы [email protected]