2

希望之前有人遇到过这个问题,因为它困扰了我和同事几天。

我们成功地将项目从 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 经验的人都见过这种情况吗?如果是这样,你做了什么来解决这个问题(这发生在多个数据窗口上)。

感谢您的时间!

4

1 回答 1

1

您可能看到的是为符合 ODBC 规范而构建的语法。大括号是 ODBC 转义序列。您是否有可能在开发期间使用 ODBC 连接(数据库配置文件)并使用应用程序中的本机驱动程序连接到数据库,反之亦然?

如果 SQL Server 数据库引擎不直接支持 SQL Server ODBC 驱动程序,它将即时将任何 ODBC 语法转换为 T-SQL。

另请注意,SQL 中的区别不是缺少逗号,而是在一个而不是另一个中围绕您的 where 子句部分的花括号。:)

*多年后编辑,我刚刚了解到PB12.5 不支持SQL Server 2008及更高版本,但支持 2000 和 2005,但我的 PowerBuilder 2017 支持直接从帮助文件中连接到 SQL Server 2008、2002、2014、2016。只要您使用较新的提供程序,PB 11.5 就支持 SQL Server 2008。我们遇到了一个问题,您只能放置一个检索参数,尝试添加更多会在第 2 列上给您带来无效的语法,这是我在职业生涯中从未见过的,并且使用了 PB 3 以上的所有版本。

您可以在此处获取更多信息:

Microsoft ODBC 程序员参考: http://msdn.microsoft.com/en-us/library/....

并且专门针对 ODBC SQL 语法: http://msdn.microsoft.com/en-us/library/....

于 2011-07-30T16:50:07.750 回答