希望之前有人遇到过这个问题,因为它困扰了我和同事几天。
我们成功地将项目从 PowerBuilder 12 Classic 转换为 PowerBuilder.NET,一切运行良好,但我们遇到了 PowerBuilder.NET 如何从数据窗口读取 SQL 语法的问题。
打开数据窗口,我复制了语法并将其粘贴到 SQL Server 2008 R2 中,它完成了所有的检索。SQL如下(注意部分字段被删除以节省空间)
SELECT hl7_in.intf_app_parm_id,
hl7_in.sending_app,
hl7_in.msg_typ,
hl7_in.process_ind,
hl7_in.hl7_in_seq_no,
hl7_in.msg_evnt_typ,
hl7_in.wrng_msg_cnt,
pt.pt_middle_name,
hl7_in.resolved_ind,
hl7_in.pt_id,
hl7_in.hl7_msg_cntl_id,
hl7_in.msg_txt,
intf_app_parm.app_parm_desc,
intf_engine.engine_name
FROM {oj hl7_in LEFT OUTER JOIN pt ON hl7_in.pt_id = pt.pt_id}, {oj intf_app_parm LEFT OUTER JOIN intf_engine ON intf_app_parm.intf_engine_id = intf_engine.intf_engine_id}
WHERE ( hl7_in.intf_app_parm_id = intf_app_parm.intf_app_parm_id ) and
( ( intf_app_parm.direction_ind = 'I' ) )
但是,当代码在运行时执行时,我得到一个 SQL 错误(即使 SQL 工作)
SQLSTATE = 42000
Microsoft SQL Native Client
The multi-part identifier "intf_app_parm.intf_engine_id" could not be found
在试图找出导致错误的原因之后(因为上述 SQL 上的两个连接都可以正常工作),我决定我们应该通过调试器检查数据窗口。好吧,这就是我们所做的,我们找到了原因(请参阅下面的 SQL):
SELECT hl7_in.intf_app_parm_id,
hl7_in.sending_app,
hl7_in.msg_typ,
hl7_in.process_ind,
hl7_in.hl7_in_seq_no,
hl7_in.msg_evnt_typ,
hl7_in.wrng_msg_cnt,
pt.pt_middle_name,
hl7_in.resolved_ind,
hl7_in.pt_id,
hl7_in.hl7_msg_cntl_id,
hl7_in.msg_txt,
intf_app_parm.app_parm_desc,
intf_engine.engine_name
FROM hl7_in LEFT OUTER JOIN pt ON hl7_in.pt_id = pt.pt_id
LEFT OUTER JOIN intf_engine ON intf_app_parm.intf_engine_id = intf_engine.intf_engine_id
WHERE ( hl7_in.intf_app_parm_id = intf_app_parm.intf_app_parm_id ) and
( ( intf_app_parm.direction_ind = 'I' ) )
如果您查看 FROM 语句,您将看到 PowerBuilder 决定通过删除 pt.pt_id 之后的逗号 (,) 以及第二个连接 (intf_app_parm) 的开头部分来修改该语句。我们决定检查原始的 PB12 Classic 代码,看看那里是否也存在问题,但是那里没有发生这种奇怪的事情(检索语句被正确读取)。
数据窗口本身在应用过程中的任何时候都不会被修改,SQL 语句也不会被修改。任何有过 PowerBuilder.NET 经验的人都见过这种情况吗?如果是这样,你做了什么来解决这个问题(这发生在多个数据窗口上)。
感谢您的时间!