2015-12-11 15 views
0

我正在一个远程红帽服务器上工作,在那里我正在开发一个c应用程序来将数据插入远程oracle数据库。所以首先我在服务器上安装了OCI即时客户端rpm,并尝试编译一个示例程序。在某些联系之后,我可以编译它。但是当我要运行它时。它退出给了一个错误说C程序退出给出错误ORA-12162:TNS:网络服务名称被错误地指定

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

我使用的示例代码是从博客(请参见该代码的情况下,你需要澄清things.where我只引述几件这个帖子) René Nyffenegger's collection of things on the web René Nyffenegger on Oracle

(请参见该代码的情况下,你需要澄清things.where我只引述几件这篇文章),我加了一些打印来检查错误

在代码和它似乎就像它卡在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; 
} 

印刷walue另一点是,在编译过程中它给出了一个警告说一定libry不包括。但是创建了exicutable文件。这是我在编辑过程中得到的按摩。

[[email protected] ~]$ 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

回答

1

我的建议是完全绕过的tnsnames。 Oracle一直允许您提供直接连接的详细信息,但EZConnect使这更容易。

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

servername:port/service name 

对于实例

MyOracle.MyCompany.Com:1521/SalesReporting 

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

我喜欢tnsnames的想法,但它是一把双刃剑。当它起作用时,它很棒。如果没有,你想扔东西。借助EZConnect,它始终可以工作。

顺便说一句,如果你不知道上述三个项目的属性,发现通过TNSNAMES连接机:

tnsping <your TNS-named database> 
+0

这是我使用的连接字符串完全相同的方式。但它的工作原理是一样的。对不起,我没有提及它。它不断给出相同的错误。 – Laksith

+0

我应该如何将中间字符串中的direct = true?你能澄清一下吗 – Laksith

+1

如果你做'$ ORACLE_HOME/bin/sqlplus userid:[email protected]:1521/JKLMN'它可以正常工作吗?这只是一个测试,看你的连接字符串是否工作。 – Hambone

相关问题