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