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 の後のカンマ (,) と 2 番目の結合 (intf_app_parm) の開始部分を削除することによって、そのステートメントを変更することを決定したことがわかります。元の PB12 Classic コードをチェックして、そこにも問題があるかどうかを確認することにしましたが、この奇妙なことはそこでは発生しません (retrieve ステートメントは正しく読み取られます)。

データウィンドウ自体は、アプリケーションのどの時点でも変更されず、SQL ステートメントも変更されません。PowerBuilder.NET の経験がある人は、これが起こるのを見たことがありますか? その場合、問題を解決するために何をしましたか (これは複数のデータ ウィンドウで発生しています)。

お時間をいただきありがとうございます!

4

1 に答える 1

1

おそらく表示されているのは、ODBC 仕様に準拠するように構築された構文です。中括弧は ODBC エスケープ シーケンスです。開発中に ODBC 接続 (DB プロファイル) を使用し、アプリケーションのネイティブ ドライバーを使用してデータベースに接続している可能性はありますか、またはその逆ですか?

SQL Server ODBC ドライバーは、SQL Server データベース エンジンで直接サポートされていない場合、ODBC 構文をオンザフライで T-SQL に変換します。

また、SQL の違いはカンマがないことではなく、一方の where 句の部分を囲む中括弧であり、もう一方の部分ではないことに注意してください。:)

*何年も後にこれを編集して、PB12.5 はSQL Server 2008以降をサポートしていないが、2000 & 2005 をサポートしていることを知りました。PB 11.5 は、新しいプロバイダーを使用する限り、SQL Server 2008 をサポートします。検索引数を 1 つしか指定できないという問題がありました。さらに追加しようとすると、列 2 に無効な構文が表示されます。これは私のキャリアで見たことがなく、PB 3 以降のすべてのバージョンを使用しています。

詳細については、次を参照してください。

Microsoft ODBC プログラマーズ リファレンス: http://msdn.microsoft.com/en-us/library/....

特にODBC SQL Grammar: http://msdn.microsoft.com/en-us/library/....

于 2011-07-30T16:50:07.750 に答える