OCI接口编程出现连接错误,连接字符串解析错误问题

kmkjwjf 2011-10-11 07:34:10
是采用Tuxedo进行编程,在tpsvrinit函数中加入和ORACLE连接的操作部分,其函数内容如下:

OCIInitialize(OCI_DEFAULT|OCI_OBJECT,(dvoid *)0,0,0,0);
OCIEnvInit(&tpcenv, OCI_DEFAULT, 0, (dvoid **)0);
OCIHandleAlloc((dvoid *)tpcenv, (dvoid **)&tpcsrv, OCI_HTYPE_SERVER, 0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)tpcenv, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)tpcenv, (dvoid **)&tpcsvc, OCI_HTYPE_SVCCTX, 0 , (dvoid **)0);
for (;;) {
rval = OCIServerAttach(tpcsrv, errhp, (text *)0, 0,OCI_DEFAULT);
if (rval == OCI_SUCCESS || rval == OCI_SUCCESS_WITH_INFO)
break;
OCIERROR(errhp, rval);
sleep(1);
}

由于在执行OCIServerAttach函数时出错,因此不断的在sqlnet.log中出现如下错误:

Fatal NI connect error 12545, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=beq)(PROGRAM=/opt/oracle/bin/oracle)(ARGV0=oracletpccraw80)(ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))')(DETACH=NO))(CONNECT_DATA=(CID=(PROGRAM=tpccfmlw)(HOST=node122)(USER=oracle))))

原因应该是设置连接的数据库sid和hostname错误了。实际上我需要连接的数据库的hostname是128.5.30.111,SID是tpccraw80。

而我写的tnsnames.ora中的内容是按照正确格式设置的:

tpcc =
(DESCRIPTION =
(ADDRESS = (PROTOCOL= TCP)(Host= 128.5.30.111)(Port= 1521))
(SDU=14600)
(CONNECT_DATA = (SERVICE_NAME = tpccraw80))
)


想问各位大侠,如何修改tnsnames.ora或者是OCI调用使我的程序能正确的连接到Oracle数据库?
...全文
253 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaajj 2011-10-12
  • 打赏
  • 举报
回复
oci连接数据库要告诉程序连接哪个数据库,一般的调用方法都是从tnsnames.ora中根据tnsname去获取要连接的数据库信息
luyun2011 2011-10-12
  • 打赏
  • 举报
回复
不一定是连接数据库sid和hostname错误,我觉得就是tnsnames.ora的问题,tnsnames.ora有时很严格的,多一个空格都会无法解析,比如你的tpcc前面多一个空格,就可能导致连不上数据库
kmkjwjf 2011-10-12
  • 打赏
  • 举报
回复
谢谢你的提醒,我是在Linux主机上,ubb配置文件我是配置了的,但是没有你所说的那一行。

但是我通过更改OCI代码也已经解决了这个问题,具体的更改就是把上述代码中的
OCIServerAttach(tpcsrv, errhp, (text *)0, 0,OCI_DEFAULT);
更改为
OCIServerAttach(tpcsrv, errhp, "tpcc",sizeof("tpcc"),OCI_DEFAULT);//tnsnames.ora中要连接的数据库的别名
yixilan 2011-10-12
  • 打赏
  • 举报
回复
我记得好像还得配置一个ubb文件吧。
服务启动的时候,一般是通过ubbconfig文件里的数据库配置信息来连接数据库的吧:
OPENINFO="Oracle_XA:Oracle_XA+SqlNet=tpccraw80+Acc=P/username/password+SesTm=120+MaxCur=5+LogDir=."
好象是这个。
另外,你用于访问数据库的用户,应该得赋一个事务处理的权限吧:
grant select on DBA_PENDING_TRANSACTIONS to username;
yixilan 2011-10-12
  • 打赏
  • 举报
回复
楼主,你的Tuxedo服务端代码是写在Windows主机还是Linux主机上的?
yixilan 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kmkjwjf 的回复:]
谢谢你的提醒,我是在Linux主机上,ubb配置文件我是配置了的,但是没有你所说的那一行。
[/Quote]
咱俩用的模式可能是不一样的。
你看我的ubb里:
*GROUPS
DEFAULT:
GROUP1 LMID=SITE1 GRPNO=1
OPENINFO="Oracle_XA:Oracle_XA+SqlNet=实例名
+Acc=P/user/psd+SesTm=120+MaxCur=80+LogDir=./log"
yixilan 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fuwenhai 的回复:]
不一定是连接数据库sid和hostname错误,我觉得就是tnsnames.ora的问题,tnsnames.ora有时很严格的,多一个空格都会无法解析,比如你的tpcc前面多一个空格,就可能导致连不上数据库
[/Quote]
通过楼主现在的现象判断,不是tnsnames.ora的问题。
因为他改完代码之后,就好用了。
如果是tnsnames.ora的问题,改完代码也不会好用。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧