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

时间:2018-02-09 22:26:09

标签: c oci

我正在编写的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())?

1 个答案:

答案 0 :(得分:1)

可能存在更好的方式,但以下工作。 connection-specifier - 传递给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)));
}