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

时间:2014-06-06 11:52:41

标签: c++ qt intersystems-cache

这是我尝试从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的示例表中获取数据时,此行为会重现。我做错了什么?

感谢您的帮助。

2 个答案:

答案 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只是在回答时查看文档]

QSqlQuery

的构造函数的文档
  

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

这意味着您的查询在默认数据库上打开(无论这意味着什么)。

查看QSqlDatabase documentation

  

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

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

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

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

我猜你应该:

QSqlDatabase db = QSqlDatabase::addDatabase();

QSqlQuery query=QSqlQuery(db);