C 程序退出并出现错误 ORA-12162 : TNS:net service name is incorrectly specified

标签 c oracle redhat oracle12c tnsnames

我正在远程 Red-Hat 服务器上工作,正在开发一个 C 应用程序来将数据插入到远程 Oracle 数据库中。所以首先我在服务器上安装了 OCI 即时客户端 rpm 并尝试编译一个示例程序。经过某些链接后我可以编译它。但当我要运行它时。它退出并给出错误消息

ORA-12162: TNS:net 服务名称指定不正确

我使用的示例代码来自博客(如果您需要澄清事情,请参阅此代码。我在这篇文章中仅引用了几段内容) René Nyffenegger's collection of things on the web René Nyffenegger on Oracle

(如果您需要澄清一些事情,请参阅此代码。我在这篇文章中仅引用了几段内容)

在代码中,我添加了一些打印来检查错误,它似乎卡在了 OCIServerAttach() 函数中 r 给出了 -1 的打印值

r=OCIServerAttach(srv, err,  dbname, strlen(dbname), (ub4) OCI_DEFAULT);
printf("r value %d",r);

if (r != OCI_SUCCESS) {
checkerr(err, r);
goto clean_up;
}

还有一点是,在编译过程中会给出一个警告,说某个库没有被包含。但已创建可执行文件。这是我在编译过程中得到的信息。

[laksithe@loancust ~]$ gcc -L$ORACLE_HOME/lib/ -L$ORACLE_HOME/rdbms/lib/ -o oci_test oci_test.o -L/usr/lib/oracle/12.1/client64/lib  -lclntsh   `cat $ORACLE_HOME/lib/sysliblist`
cat: /lib/sysliblist: No such file or directory

通过网络,我发现通过创建包含连接详细信息的 tnsnames.ora 文件,我可以解决问题。但即使它对我也不起作用。这是该博客的链接 blog

这个错误已经过去一周了,但我还是没有解决它。有人可以帮助我吗?

我使用的连接字符串格式是abc.ghi.com:1521/JKLMN

最佳答案

我的建议是完全绕过 tnsnames。 Oracle 始终允许您输入直接连接详细信息,但 EZConnect 使这变得更加容易。

格式化连接字符串时,不要列出 TNS 名称,而是使用以下格式的实际连接属性:

servername:port/service name

例如

MyOracle.MyCompany.Com:1521/SalesReporting

您的连接字符串可能还需要 direct=true,但老实说我不确定。

我喜欢 tnsnames 的想法,但它是一把双刃剑。当它起作用时,那就太棒了。如果没有,你就想扔东西。有了 EZConnect,它总是有效。

顺便说一句,如果你不知道上面三项的属性,请找到一台通过 tnsnames 连接的机器:

tnsping <your TNS-named database>

关于C 程序退出并出现错误 ORA-12162 : TNS:net service name is incorrectly specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219948/

相关文章:

c++ - 在 32 位 Linux 上编译代码时出现未声明错误 'gtk_window_set_keep_above'

c - Tiva C TM4C123GXL 接口(interface)库

c++ - Gstreamer H264 管道滞后

c - 为什么这个C函数需​​要一个指向指针的指针作为参数?

lisp - CentOS 7 上的 Common Lisp

linux - 在 redhat linux 上安装 docker - 出现 'container-selinux' 和 'selinux-policy' 问题

c - 没有填充的OpenSSL RSA加密无法正确加密

java - 如果条件与 SQL 不匹配,则根据列生成更多行

oracle - 使用 Toad from Oracle 从多个查询中提取报告

sql - 用单个 IN 或 ANY 运算符替换多个 OR 运算符