使用特定主机名 :port 处的 olog() 连接到 Oracle

标签 c oracle-call-interface

我正在编写的 C 程序尝试使用 olog() 连接到 Oracle 数据库:

olog(&lda, (ub1 *)hda, dbparam_keys[DbUser].value, -1,
        dbparam_keys[DbPassword].value, -1, NULL, -1, (ub4)OCI_LM_DEF);

此操作失败并显示 ORA-12545 ,因为我既没有指定服务器的主机名,也没有指定端口号。我不知道,因为我不知道该怎么做......

与客户端捆绑在一起的“演示”似乎假定有一个有效的tnsnames.ora——该文件对于 OCI API 是强制的,或者可以是客户端程序,知道必要的值,自行将它们指定给库(例如使用 OCIAttrSet())?

最佳答案

很可能存在更好的方法,但以下方法有效。连接说明符——传递给olog()的第三个字符串——通常指在tnsnames.ora中找到的条目。但是,它也可以是整个条目,而不是这样的快捷方式,这就是我在本例中想要的。

因此,我使用 tnsnames.ora 中通常使用的完整语法来描述代码中的服务器。然后,我将文本作为连接说明符传递给 olog():

bzero(&lda, sizeof(lda));
bzero(&hda, sizeof(hda));

connlen = snprintf(buf, sizeof buf,
    "(DESCRIPTION =\n"
    "   (ADDRESS_LIST =\n"
    "       (ADDRESS =\n"
    "           (PROTOCOL = TCP)\n"
    "           (HOST = %s)\n"
    "           (PORT = %s)\n"
    "       )\n"
    "   )\n"
    "   (CONNECT_DATA =\n"
    "       (SID = %s)\n"
    "   )\n"
    ")",
    dbparam_keys[DbHostName].value,
    dbparam_keys[DbServerPortNumber].value,
    dbparam_keys[DbServerOrServiceName].value);

if (connlen >= sizeof buf)
    errx(EX_SOFTWARE, "Internal error: buffer not big enough: "
        "need %zd, have %zd bytes", connlen, sizeof buf);
if (verbose)
    warnx("Connecting to %.*s", connlen, buf);

if (olog(&lda, (ub1 *)hda,
    dbparam_keys[DbUser].value, -1,
    dbparam_keys[DbPassword].value, -1,
    buf, connlen,
    OCI_LM_DEF)) {
    errx(EX_NOPERM, "Logging into Oracle failed: %s",
        oraerr(&lda, buf, sizeof(buf)));
}

关于使用特定主机名 :port 处的 olog() 连接到 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48715018/

相关文章:

c++ - 如何使 DirectBuffer 次级声音?

c - Do While 循环总是在第一次循环后退出

windows - 如何使用 MinGW 在 Windows 上构建 Qt QOCI(Oracle 数据库驱动程序)?

mysql - 使用 OCI、MySQL 和 LabView 构建 DLL 一直失败

使用 Oracle Instant 客户端 10.2.0.4 使用 PDO-OCI 驱动程序编译 PHP 5.4

php - THE 过程入口点 OCIstmtgetNextresult 无法位于动态链接库 oci.dll 中

c - 时间复杂度?

c# - 具有显式(手动)字段布局的 C 结构/union ?

c - 是否应该为所有整数类型提供函数变体?

php - 如何设置 OCI 以从 PHP 连接到 Oracle?