【问题标题】:Cross database query engine for Oracle database using Qt使用 Qt 的 Oracle 数据库的跨数据库查询引擎
【发布时间】:2011-05-03 18:56:50
【问题描述】:

我正在开发一个 Qt 应用程序,我想同时从 2 个不同数据库中的表中查询数据。我使用 Oracle 作为数据库,但我的雇主希望我在不建立两个数据库之间的数据库链接的情况下实现这一目标。所以我想到了使用Qt sql模块对象开发一个跨数据库查询引擎。但它不应该像 sql 解析器那样复杂。我只想从两个数据库中的表中查询数据并将它们显示在 1 个视图中,并使用通用界面进行这些查询。但据我所知,Qt sql 模块只能从 1 个数据库中查询。如果有人以前做过这种编程或对此有想法的人,非常感谢您的建议。非常感谢。

【问题讨论】:

  • 不同的Oracle数据库?在不同的物理主机上,还是在不同的 Oracle 实例上? Oracle's dblink functionality 比自己动手设置更好。
  • 是的,两个数据库在同一个物理主机上,也就是说我说的是2个实例。我的雇主不希望我使用 dblink 的原因是某些用户没有权限查看这些实例中的所有表,所以如果我使用 dblink 进行查询并且权限较少的用户使用我的应用程序,他们将能够进行不受欢迎的查询。
  • 数据库不是实例——一个实例可以容纳多个数据库。可能是授予对另一个数据库的访问权限(基于我希望的角色)的问题,不需要 dblink 但真正的问题似乎是授予
  • 这样想。此应用程序的用户将使用 TNS 别名登录。所以每个别名都有不同的权限。我正在使用这些别名连接到称为 ATS 和 SER 的 2 个数据库模式。我想查询这两种模式中的表。到目前为止,我已经创建了 2 个 QSqlDatabase 对象并使用 TNS 别名连接到每个模式。但是为了进行跨数据库查询,我每次都必须手动进行,这是一项非常繁忙的任务。所以我想开发一个通用接口(可能是API)并调用一些方法来进行这些查询
  • 不需要两次登录,只需从 SER 访问 ATS 架构,反之亦然。

标签: database oracle qt cross-platform


【解决方案1】:

前段时间我通过使用QSqlDatabase 打开多个数据库连接做了类似的事情。

因此,受官方文档的启发,您可以尝试以下方法:

 //Open database 1:
 QSqlDatabase db1 = QSqlDatabase::addDatabase("QOCI","db1");
 db.setHostName("acidalia");
 db.setDatabaseName("tns1");
 db.setUserName("mojito");
 db.setPassword("J0a1m8");
 bool ok = db.open();

 ..
 //Open database 2:
 QSqlDatabase db2 = QSqlDatabase::addDatabase("QOCI","db1");
 ..
 db.setDatabaseName("tns2");
 ..

现在数据库已打开,您可以在查询中使用它们。根据文档记下 db 变量的范围:

 {
     QSqlDatabase db = QSqlDatabase::database("db1");
     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 }

 {
     QSqlDatabase db = QSqlDatabase::database("db2");
     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 }

 //Clean up
 QSqlDatabase::removeDatabase("db1"); 
 QSqlDatabase::removeDatabase("db2"); 

请参阅removeDatabase 进行清理

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多