【问题标题】:How do I connect to an Oracle cloud database within a C++ application?如何在 C++ 应用程序中连接到 Oracle 云数据库?
【发布时间】:2021-12-16 13:37:30
【问题描述】:

我有一个使用 Oracle 的云数据库,我正在尝试学习如何在 Windows 中的 c++ 应用程序中执行 SQL 命令。

这是我尝试过的。

1) 使用即时客户端 (OCCI)

  • 我已尝试关注 Oracle 发布的这些 docs
  • 我下载了instant client,解压后放到Oracle目录下
  • 我下载了即时客户端的SDK并放在同一目录下
  • 我下载了钱包文件,放到network/admin目录下
  • 我将路径变量设置为目录 Oracle/instant_client 并创建了一个名为 ORACLE_HOME 的用户变量并将其设置为同一目录
  • 创建了一个 TNS_ADMIN 用户变量并将其设置为 network/admin
  • 创建了一个空的 Visual Studio 项目并将 sdk 添加到附加的包含依赖项中,并将 sdk 添加到项目属性下的附加库目录中
  • 将 .lib 文件添加到项目属性下的附加依赖项(链接器 -> 输入)
  • 然后我写了这段代码
    Environment* env;
    Connection* conn;

    env = Environment::createEnvironment(Environment::DEFAULT);
    conn = env->createConnection ("username", "password", "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myserver111) (PORT=5521))(CONNECT_DATA = (SERVICE_NAME = bjava21)))");
    
    env->terminateConnection(conn);
    Environment::terminateEnvironment(env);
  • 成功编译、运行、构建环境,但尝试创建连接时出错

2) 使用 ODBC

  • 已下载 ODBC Oracle 驱动程序
  • 向系统 dsn 添加了新的数据源名称
  • 测试连接成功
  • 由于找不到有用且简单的文档来帮助我完成项目,因此放弃了努力

3) 使用适用于 Visual Studio 的 Oracle 开发人员工具

  • 我下载了开发者工具并将它们添加到了 Visual Studio 中
  • 使用 Server Explorer 连接到我的 Oracle 数据库
  • 能够查看我的表和数据并使用服务器资源管理器对其进行修改
  • 无法找到文档或无法添加允许我执行 SQL 查询的代码

更新

  • 我已将 ORACLE_HOME 和 TNS_ADMIN 作为环境变量删除
  • 我尝试使用 Instant Client SDK 连接到我的远程数据库,但没有成功
  • 我尝试了以下方法,但没有任何效果
createConnection("username", "password", "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myserver111) (PORT=5521))(CONNECT_DATA = (SERVICE_NAME = bjava21)))")
createConnection("username", "password", "//host:[port][/service name]")
createConnection("username", "password", "xxx_low")
createConnection("username", "password", "protocol://host:port/service_name?wallet_location=/my/dir&retry_count=N&retry_delay=N")
createConnection("username", "password", "username/password@xxx_low")
  • 我能够以多种方式连接到 SQLPlus,但不能在我的 C++ 应用程序中

调试时出错:

exe 中未处理的异常:Microsoft C++ 异常:内存位置的 oracle::occi::SQLException

完整代码

#include <occi.h>
using namespace oracle::occi;

int main() {
    Environment* env;
    Connection* conn;

    env = Environment::createEnvironment(Environment::DEFAULT);
    conn = env->createConnection("username", "password", "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myserver111) (PORT=5521))(CONNECT_DATA = (SERVICE_NAME = bjava21)))");

    env->terminateConnection(conn);
    Environment::terminateEnvironment(env);

    return 0;
}

【问题讨论】:

    标签: c++ oracle visual-studio occi


    【解决方案1】:

    一般使用 Instant Client:

    • 不要设置 ORACLE_HOME。这可能会产生副作用。
    • 您无需设置 TNS_ADMIN,因为您将解压缩的网络文件放在默认目录中。

    对于云:

    • 在应用程序中,使用 tnsnames.ora 文件中的网络别名之一(例如 xxxx_low)。您可以看到描述符包含您的硬编码描述符丢失的额外信息。

    ODBC 将完全相同。将钱包文件解压缩到默认的 network/admin 子目录后,您只需连接数据库凭据并使用 tnsnames.ora 文件中的网络别名。

    更多信息在我的博文How to connect to Oracle Autonomous Cloud Databases

    官方文档在Connect to Autonomous Database Using Oracle Database Tools

    【讨论】:

    • 它似乎不适用于我的 c++ 应用程序。我可以在 sql plus 中连接,但不能在我的代码中连接。我不确定我做错了什么,有什么建议吗?谢谢。
    • 我也不是!使用有关错误的详细信息更新您的问题,并确保问题是最新的并且与您尝试过的内容相匹配,例如删除那些环境变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2011-11-20
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多