Подключение к Oracle с помощью olog() на определенном имени хоста: порт

C-программа, которую я пишу, пытается подключиться к базе данных Oracle с olog():

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

Это не с ORA-12545 потому что я нигде не указываю ни имя хоста сервера, ни номер порта. Я не, потому что я не знаю, как это сделать...

"Демонстрации" в комплекте с клиентом предполагают действительный tnsnames.ora - имеет ли этот файл обязательный для API OCI, или может клиентская программа, которая знает необходимые значения, укажите их в библиотеке (например, с OCIAttrSet()) все само собой?

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)));
}
Другие вопросы по тегам