Я пытаюсь перенести приложение из Solaris в Linux.
В Solaris я использовал компилятор Sun Studio C++, а в Linux я использовал компилятор Intel C++.
Теперь я сталкиваюсь со следующей проблемой при подключении к базе данных оракула:
OCIDBConnection::OCIDBConnection(
Environment& _env, const STRING& dbName, const STRING& user, const STRING& password)
: env(_env)
{
COUT<<"username "<<user<<ENDL;
COUT<<"password "<<password<<ENDL;
COUT<<"dbname "<<dbName<<ENDL;
conn = env.createConnection(user, password, dbName);
}
Выход выводится следующим образом:
username roymustang9
password roymustang9
dbname roydb
[2013-11-12 15:39:23]>>FATAL<<: Login failed.
И при печати SQLException я нахожу:
ORA-12154: TNS:could not resolve the connect identifier specified
который является смешным, поскольку имя существует в tnanames.ora, а сведения о подключении являются правильными. Infact, когда я жестко задаю значения, он проходит через штраф:
OCIDBConnection::OCIDBConnection(
Environment& _env, const STRING& dbName, const STRING& user, const STRING& password)
: env(_env)
{
COUT<<"username "<<user<<ENDL;
COUT<<"password "<<password<<ENDL;
COUT<<"dbname "<<dbName<<ENDL;
conn = env.createConnection("roymustang9", "roymustang9", "roydb");
}
STRING - это typedef, определяемый как std :: string. COUT и ENDL являются typedefs std :: cout и std :: endl.
Что мне здесь не хватает? http://docs.oracle.com/cd/B28359_01/appdev.111/b28390/reference014.htm#CHEEGFAI
Кажется, что строка dbName неверна. Возможно, в конце она имеет символ новой строки. Попробуйте удалить его:
dbName.erase(std::remove(dbName.begin(), dbName.end(), '\n'), dbName.end());
Имя dbname также может быть "roydb.world" или что-то в этом роде
ORACLE_HOME
и TNS_ADMIN
tnsping
sqlplus