Подключение к 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)));
}