我正在使用远程Red Hat服务器,并且正在开发一个c应用程序以将数据插入到远程oracle数据库中。因此,首先我在服务器上安装了OCI Instant Client rpm,并尝试编译示例程序。某些链接后,我可以编译它。但是然后当我要运行它时。退出,提示错误

ORA-12162: TNS:net service name is incorrectly specified

我使用的示例代码来自博客(如果您需要澄清这些内容,请参考此代码。在本文中,我仅引用了几篇文章) 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>

10-06 03:00