• 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

一个有难度的问题,高分求助

tigi 2005-04-22 09:22:42
我在给客户做一个接口程序,由于两个系统都是ORACLE的数据库,但字符集不同,因此,我在一台电脑上安装了ora73和ora8i两个客户端程序。分别连接两台服务器。连接73的实例名为SERVER_HIS,连接8i的实例名为yks_test

程序处理如下:
1、在主应用上脚本如下:
string ls_logpass,ls_logid,ls_servername
string ls_logpass_yb,ls_logid_yb,ls_servername_yb
string ls_patient_id,LS_YB,ls_id
//连接HIS服务器
ls_logpass = ProfileString('insur.ini', "DATABASE","LogPassword", "")
ls_logid = ProfileString('insur.ini', "DATABASE","logid", "")
ls_servername = ProfileString('insur.ini', "DATABASE","servername", "")
SQLCA.DBMS = "O73 ORACLE 7.3"
SQLCA.LogPass = ls_logpass
SQLCA.ServerName = ls_servername
SQLCA.LogId = ls_logid
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
connect ;
if sqlca.sqlcode = -1 then
return
end if
//连接医保服务器
gtrans_yb = create Transaction
ls_logpass_yb = ProfileString('insur.ini', "DATABASE_YB","LogPassword", "")
ls_logid_yb = ProfileString('insur.ini', "DATABASE_YB","logid", "")
ls_servername_yb = ProfileString('insur.ini', "DATABASE_YB","servername", "")
gtrans_yb.DBMS = "O84 Oracle8/8i (8.x.4+)"
gtrans_yb.LogPass = ls_logpass_yb
gtrans_yb.ServerName = ls_servername_yb
gtrans_yb.LogId = ls_logid_yb
gtrans_yb.AutoCommit = False
gtrans_yb.DBParm = ""
connect using gtrans_yb;
if gtrans_yb.sqlcode = -1 then
return
end if
open(w_main)
在w_main的OPEN事件中的程序如下:
datastore lds_GetInsurPatient
string ls_charge_type,ls_patient_id,ls_yb_zyh,ls_ordered_by
long ll_patient,ll_i,ll_row
int li_visit_id
string ls_item_class,ls_item_code,ls_item_spec,ls_units,ls_his_item_name,ls_djh
dec ld_je,ld_sl,ld_dj,ld_zfje
long ll_djh,ll_item_no
datetime ldt_bill_date_time
int li_temp
string ls_xmbm,ls_czmlb,ls_ybxmdm,ls_ybxmmc,ls_dept,ls_dept_code,ls_tjtzbz
li_temp = 0
dw_1.settransobject(gtrans_yb)
//得到在院医保病人
ls_charge_type = ProfileString('insur.ini', "APP","CHARGE_TYPE", "")
lds_GetInsurPatient = create datastore
lds_GetInsurPatient.dataobject = 'd_get_insur_patient'
lds_GetInsurPatient.settransobject(sqlca)
lds_GetInsurPatient.retrieve(ls_charge_type)
//通过循环取每个医保病人
ll_patient = lds_GetInsurPatient.rowcount()
for ll_i = 1 to ll_patient
ls_patient_id = lds_GetInsurPatient.getitemstring(ll_i,'patient_id')
IF LS_PATIENT_ID ='D50000' THEN
MESSAGEBOX("","ABC")
END IF
li_visit_id = lds_GetInsurPatient.getitemnumber(ll_i,'visit_id')
ls_dept = lds_GetInsurPatient.getitemstring(ll_i,'dept_admission_to')
//到对照表去医保科室
select yb_code into :ls_dept_code from insurance.hisdept_vs_ybdept where his_dept_code =:ls_dept;
if sqlca.sqlcode = 100 then
ls_dept_code = '12'
end if
//到医保库中取病人信息,判断是否为本医保病人
SELECT zyh into :ls_yb_zyh from sys_yw_brjbxx where zyh=:ls_patient_id using gtrans_yb;
// ll_row = DW_1.retrieve(ls_patient_id)
//如果是本医保病人,则进行数据导入
if sqlca.sqlcode = 0 then
//取医保单据号
Select maxdjh into :ls_djh from sys_dm_maxdjh where djdm= '04' using gtrans_yb;
.............

在上面这段程序中,当我执行
SELECT zyh into :ls_yb_zyh from sys_yw_brjbxx where zyh=:ls_patient_id using gtrans_yb;
时,取不出数据来,而我在sql下直接写这条语句是正确的,请问这是怎么回事啊?
是不是和两个客户端有关?
...全文
156 点赞 收藏 17
写回复
17 条回复
tigi 2005年05月13日
看来CSDN真的是不行了。。。。。。。


我把这个问题提交到SYBASE和ORACLE的技术支持中了。希望大家关注。
回复 点赞
lzheng2001 2005年05月12日
首先得从代码分析,没问题才会考虑其它的! 我就知道如果:ls_patient_id的值正确,及slqcode返回正0的话,代码应该没问题! 如果你已经测试过,应该早说出来,究竟这两个值是否正常? 如果你说是orccle版本问题,那就是吧,我没环境测试! 反正我用过多个事务连接数据不同的服务器也没出现过问题.
回复 点赞
hbdkfk 2005年05月12日
我才刚来csdn,我感觉就pb论坛来说,这里算是最好的,虽然……,呵呵
你说不来这里,那我们有问题该去哪问,没有吧,那就还在这吧,纯属凑热闹:)
回复 点赞
tigi 2005年05月12日
对不起,这是笔误,我取的就是trans_yb.sqlcode。
至少我在跟踪的时候看到的是trans_yb.sqlcode的值。
如果你做的话,你是不会感受到这个问题的特别。
如果你这么说的话,讨论问题就没有意义了。我之所以这么做,是为了让大家认识到这个问题。解决问题肯定需要花时间下工夫的。否则,就不会发现问题了。我说过问题我已经通过其他途径解决了,现在只是想把这个问题给弄明白,所以我一直在做测试,也一直在和ORACLE公司的工程师测试。估计问题可能出在ORACEL客户端安装多版本,不兼容的问题。你考虑过这个层面吗?
回复 点赞
lzheng2001 2005年05月12日
看了一下,你的sqlca.sqlcode = 0 应该没错的,但应该在
SELECT zyh into :ls_yb_zyh from sys_yw_brjbxx where zyh=:ls_patient_id using gtrans_yb;
后 判断 gtrans_yb.sqlcode 是否正常!
回复 点赞
lzheng2001 2005年05月12日
相信没有人会专门为这个问题而去安装设置oracle吧! 装好也要花半天时间了.

只想问一下楼主程序执行到以下语句时,ls_patient_id的值是多少? sqlca.sqlcode返回的值又是多少?
错了! 应该是gtrans_yb.sqlcode返回的值是多少?你的程序明显在sqlca.sqlcode这里写错了,先改过来再说吧!这里可能有重要的信息sqlerrtext给你分析的,慢慢测试吧
SELECT zyh into :ls_yb_zyh from sys_yw_brjbxx where zyh=:ls_patient_id using gtrans_yb;
//如果是本医保病人,则进行数据导入
if sqlca.sqlcode = 0 then
//取医保单据号
Select maxdjh into :ls_djh from sys_dm_maxdjh where djdm= '04' using gtrans_yb;

回复 点赞
tigi 2005年05月12日
lzheng2001(1加1=0) :这个问题不难的话,你来测试一下,解释给大家听啊。

我觉得问题不在难与不难,能给我和大家一个解释,并且解释的有道理,我想,大家会感激并佩服你的。

对吧?我希望用你的解释来说话。难和不难是相对的对吧?

如果你做过测试,那好,你也把你的测试情况给大家讲讲吧。

先谢谢你了。解释的合理的话,本人愿出高分来感谢你。怎么样?
回复 点赞
tigi 2005年05月12日
哈哈,大家如果有环境的话可以搭建一个环境,一个数据库服务器安装的是ORACLE7.3,另一个数据库服务器安装oracle8.1.6其中oracle7.3的服务器的字符集是american_america.we8iso8859P1,ORACLE8.1.6的数据库字符集为american_america.us7ascii。
此时,你再找一台工作站作为客户端,在这个工作站上安装两个客户端程序一个是ORACLE7.3的,另一个是ORACLE8.1.6的。并且修改注册表中的字符集。ORACLE7.3的字符集配置为american_america.we8iso8859P1,ORACLE8.1.6的配置为:american_america.us7ascii。然后通过ORACLE7.3和ORACLE8.1.6分别建立实例,连接到两个数据库。此时,你可以通过PL/SQL进行测试,两个通过两个连接串可以连接到两个数据库上去,且字符集都是正确的。你用PB9,来写我的这个例子,你就会发现类似的问题了。我通过DEBUG进行了跟踪,sqlcode的返回值的确是0。语句是没有问题的。

后来本人经过再次测试,将ORACLE7.3的数据库换为ORACLE8I或以上的版本,就不存在这个问题了。同样的语句,同样的程序。只是数据库版本不同。

这个又有没有人能够解释呢?

本人虽然不是PB和ORACLE的高手,但也很自信,毕竟用了PB和ORACLE已经有7年的时间了。但真的为了这个问题而感到困惑。

我也有了其他的解决方案,但是无法保证同时对两个数据库操作的完整性。所以希望那些有经验的程序员给点建议。或者是帮住我查出来问题的所在。谢谢。
回复 点赞
wangxichen 2005年05月09日
检查一下事务是否存在问题,
SQLCA.LogPass = ls_logpass
SQLCA.ServerName = ls_servername
SQLCA.LogId = ls_logid
后变量赋值是否存在问题,或是没有赋值。

分成几段检查,用messagebox试试是否执行到最后了,中间的变量是否正确
回复 点赞
tigi 2005年05月09日
可悲啊。。。。。

这个问题居然没人能够正确解答。。。CSDN的悲哀啊。

分还要照样给。。。。。。

大家以后不要上CSDN了。

没有有本事的人啊。。。。。。。。。。
回复 点赞
princelily 2005年05月09日
朋友,你提到的“在上面这段程序中,当我执行
SELECT zyh into :ls_yb_zyh from sys_yw_brjbxx where zyh=:ls_patient_id using gtrans_yb;
时,取不出数据来,而我在sql下直接写这条语句是正确的,请问这是怎么回事啊?”
说明问题可能出现连接你自定义的事务处理对象上。
由于做数据库软件就是要和数据库后台打交道,正常连接数据库是第一步,在程序中得不到结果,又不是语法错误,就要培养用PB中的Debug功能,单不走调试。这样能看出通过事务处理对象的函数sqlcode的返回值来判断是否连接上数据库了。而且还能看到你是否得到你想要得到的值。这都不能由我们代替,需要你自己实践。如果是技术上的问题,我们能帮你的肯定不会保留的。说的不对望见谅!
回复 点赞
kingu 2005年05月09日
我也是来学习的!
回复 点赞
lzheng2001 2005年05月09日
晕! 楼主还是学一下如何分析解决问题的方法吧. 这个问题本来就不难
回复 点赞
j9dai 2005年05月09日
俺来学习的
回复 点赞
冷箫轻笛 2005年04月23日
楼上正解
回复 点赞
lzheng2001 2005年04月22日
1.检查sqlcode及sqlerrtext的返回值
如果语句已经正确执行,证明是:ls_patient_id 这个变量的值有问题
回复 点赞
flyarm 2005年04月22日
PB7以上是允许多个数据库事务连接。
先检查SQL执行是否有错误,获取SQL语句执行后gtrans_yb的SQLERRCODE的值。
从获取的值再去判断是什么原因。
若没有错误,试试在sys_yw_brjbxx表前加上所属的Oracle用户: 用户.表名。同时要赋权限。
回复 点赞
发动态
发帖子
PowerBuilder
创建于2007-09-28

597

社区成员

6.6w+

社区内容

PowerBuilder 相关问题讨论
社区公告
暂无公告