PowerBuilder.NET неправильно читает синтаксис SQL окна данных - PullRequest
2 голосов
/ 11 июля 2011

Надеюсь, кто-то сталкивался с этим вопросом раньше, так как он поставил в тупик коллегу и меня на несколько дней.

Мы успешно преобразовали наш проект из 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, когда-либо видел это? Если да, что вы сделали, чтобы решить проблему (это происходит в нескольких окнах данных).

Спасибо, что уделили время!

1 Ответ

1 голос
/ 30 июля 2011

Вероятно, вы видите синтаксис, созданный для соответствия спецификации ODBC. Скобки - это escape-последовательность ODBC. Возможно ли, что вы используете соединение ODBC во время разработки (профиль БД) и подключаетесь к базе данных, используя собственный драйвер в приложении, или наоборот?

Драйвер ODBC для SQL Server на лету преобразует любой синтаксис ODBC в T-SQL, если он не поддерживается напрямую ядром базы данных SQL Server.

Также обратите внимание, что разница в 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 Grammar: http://msdn.microsoft.com/en-us/library/....

...