【问题标题】:Connecting to Oracle with olog() at specific hostname:port在特定主机名:端口使用 olog() 连接到 Oracle
【发布时间】:2018-02-09 22:26:08
【问题描述】:

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

【问题讨论】:

    标签: c oracle-call-interface


    【解决方案1】:

    可能存在更好的方法,但以下方法有效。连接说明符——传递给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)));
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-03
      相关资源
      最近更新 更多