OCCI с ошибкой C ++: TNS: net неверно указано имя службы - PullRequest
1 голос
/ 27 апреля 2020

Я создал простую программу на C ++ для соединения Oracle OCCI с экземпляром OracleDB.

Вот код:

#include <iostream>
#include <string>
#include <occi.h>

//  Connection information
const std::string userName = "admin";
const std::string password = "password";

const std::string connectString = "(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.190)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORCLCDB)))";                    

//  Connection enviroment
oracle::occi::Environment *env = oracle::occi::Environment::createEnvironment();


int main() {

int succes;

oracle::occi::Connection *conn = env->createConnection(userName, password, connectString);
succes = 0;

std::string id;
std::cin >> id;

std::string anw = "SELECT * FROM BESTAND WHERE ID=";

std::string cnw = anw + id;

oracle::occi::Statement *stmt = conn -> createStatement(cnw);

oracle::occi::ResultSet *rs = stmt -> executeQuery();

while (rs -> next()) {

std::string b = rs -> getString(2);

std::cout << b << std::endl;

}



stmt -> closeResultSet(rs);
conn -> terminateStatement(stmt);
env -> terminateConnection(conn);

oracle::occi::Environment::terminateEnvironment(env);

}

Я использую g ++ на CentOS-8 для compl ie программа, и программа компилируется без проблем, но когда я выполняю Программу, я получаю эту ошибку:

terminate called after throwing an instance of 'oracle::occi::SQLException'
what():  ORA-12162: TNS:net service name is incorrectly specified

У кого-нибудь есть идея, как я могу решить эту проблему.

1 Ответ

0 голосов
/ 27 апреля 2020

Является ли "ORCLCDB" SERVICE_NAME или ORACLE_SID? Имена сервисов, как правило, полностью соответствуют домену. Вы можете попробовать это (пробелы в порядке):

(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.190)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SID = ORCLCDB)))

Или дважды проверьте имя службы в статусе прослушивателя TNS, чтобы убедиться, что вы получили правильное значение. Команда «lsnrctl status» на сервере базы данных должна вернуть список активных служб; используйте один со статусом «ГОТОВ».

...