【问题标题】:Oracle OCI C++ libraryOracle OCI C++ 库
【发布时间】:2013-11-26 09:22:00
【问题描述】:

我正在尝试将应用程序从 Solaris 移植到 Linux。

在 Solaris 上,我使用 Sun Studio C++ 编译器,在 Linux 上,我使用 Intel C++ 编译器。

现在,我在连接到 oracle 数据库时遇到以下问题:

 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 中,并且连接细节是正确的。事实上,当我对这些值进行硬编码时,一切正常:

 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 是定义为 std::string 的 typedef。 COUT 和 ENDL 也是 std::cout 和 std::endl 的类型定义。

我在这里缺少什么? http://docs.oracle.com/cd/B28359_01/appdev.111/b28390/reference014.htm#CHEEGFAI

【问题讨论】:

  • 检查字符串中的空格和不可打印的字符。

标签: c++ database linux oracle std


【解决方案1】:

似乎字符串 dbName 格式不正确。也许它的末尾有换行符。 尝试删除它:

dbName.erase(std::remove(dbName.begin(), dbName.end(), '\n'), dbName.end());

【讨论】:

  • 这很接近,但我不能使用擦除,因为变量是一个常量字符串 &。我进行了更改以在将最后一个字符传递给此方法之前将其删除。
  • 如果我能提供帮助,我很高兴! (:
【解决方案2】:

dbname 也可以是“roydb.world”或类似的名称

  • 首先检查您的环境变量ORACLE_HOMETNS_ADMIN
  • 然后检查来自tnsping 的输出
  • 然后检查您是否可以使用sqlplus 进行连接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-03
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多