2011-07-11 5 views
2

J'espère que quelqu'un a déjà rencontré ce problème, car il a bloqué un collègue et moi pendant quelques jours.PowerBuilder.NET ne lit pas la syntaxe SQL de Datawindow correctement

Nous avons converti avec succès notre projet de PowerBuilder 12 Classic à PowerBuilder.NET et les choses tournent décemment, mais nous éprouvons un problème avec la façon dont PowerBuilder.NET lit la syntaxe SQL à partir d'une Datawindow.

En ouvrant la fenêtre de données, j'ai copié la syntaxe et l'ai collée dans SQL Server 2008 R2, et tout a été récupéré. Le SQL est inférieur (notez que certains champs sont supprimés pour économiser l'espace)

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'))  

Mais, lorsque le code est exécuté lors de l'exécution, je reçois une erreur SQL (même si le SQL fonctionne)

SQLSTATE = 42000 
Microsoft SQL Native Client 
The multi-part identifier "intf_app_parm.intf_engine_id" could not be found 

Après avoir essayé de comprendre ce qui causait l'erreur (puisque les deux jointures sur le SQL ci-dessus fonctionnent bien), j'ai décidé que nous devions extraire la fenêtre de données via le débogueur. Eh bien, c'est ce que nous avons fait, et nous avons compris pourquoi (S'il vous plaît voir le ci-dessous 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')) 

Si vous jetez un oeil à la FROM, vous verrez que PowerBuilder a décidé de modifier cette déclaration en supprimant la virgule (,) après pt.pt_id ainsi que la partie début de la seconde jointure (intf_app_parm). Nous avons décidé de vérifier le code original PB12 Classic pour voir si c'était un problème là aussi, mais cette chose étrange ne se produit pas là (l'instruction retrieve est lue correctement).

La fenêtre de données elle-même n'est modifiée à aucun moment de l'application, et l'instruction SQL n'est pas non plus modifiée. Quelqu'un qui a déjà eu l'expérience avec PowerBuilder.NET verra-t-il cela arriver? Si oui, qu'avez-vous fait pour résoudre le problème (cela se produit sur plus d'une fenêtre de données).

Nous vous remercions de votre temps!

+0

Nous utilisons également PowerBuilder 12.1 Construire 6639 –

+0

Le DataWindow en utilisant un choix graphique? Sinon c'est la première chose que j'essaierais. –

+0

Oui, nous sommes. J'ai essayé de convertir la fenêtre de données à Syntax Design, et quand il a été configuré comme ça, ça marche, mais presque toutes les colonnes de la fenêtre de données sont manquantes. –

Répondre

1

Ce que vous voyez probablement est une syntaxe construite pour se conformer à la spécification ODBC. Les accolades sont une séquence d'échappement ODBC. Est-il possible que vous utilisiez une connexion ODBC pendant le développement (DB Profile) et que vous vous connectiez à la base de données en utilisant un pilote natif dans l'application, ou vice-versa?

Le pilote ODBC SQL Server convertira à la volée toute syntaxe ODBC dans T-SQL, si elle n'est pas directement prise en charge par le moteur de base de données SQL Server.

Notez également que la différence dans SQL n'est pas la virgule qui manque, ce sont les accolades qui entourent les parties de votre clause where dans l'une et pas dans l'autre. :)

* Modification de cette nombreuses années plus tard, je viens d'apprendre que PB12.5 ne prend pas en chargeSQL Server 2008 et en 2000, mais soutient & 2005, mais mon PowerBuilder 2017 prend en charge la connexion à SQL Server 2008, 2002, 2014 , 2016 prise directement à partir des fichiers d'aide. PB 11.5 prend en charge SQL Server 2008 tant que vous utilisez le fournisseur plus récent. Nous avons eu un problème où vous ne pouviez mettre qu'un argument de récupération, en essayant d'ajouter plus vous donne une syntaxe invalide sur la colonne 2 que je n'ai pas vu dans ma carrière et que j'ai utilisé toutes les versions de PB 3.

Vous pouvez obtenir plus d'informations ici:

Microsoft ODBC Programmer Référence: http://msdn.microsoft.com/en-us/library/....

Et spécifiquement pour ODBC SQL Grammaire: http://msdn.microsoft.com/en-us/library/....

Questions connexes