PowerBuilder.NET неправильно читает синтаксис SQL Datawindow

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

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

Спасибо за ваше время!


person Christopher MacKinnon    schedule 11.07.2011    source источник
comment
Мы также используем PowerBuilder 12.1 Build 6639.   -  person Christopher MacKinnon    schedule 11.07.2011
comment
Использует ли DataWindow графический выбор? Если нет, то это первое, что я бы попробовал.   -  person Hugh Brackett    schedule 11.07.2011
comment
Да, мы. Я попытался преобразовать окно данных в Syntax Design, и когда он был настроен таким образом, он работал нормально, но почти все столбцы в окне данных отсутствуют.   -  person Christopher MacKinnon    schedule 11.07.2011
comment
Что произойдет, если вы создадите новое окно данных в PB.Net и сделаете то же самое соединение в графическом редакторе запросов?   -  person Hugh Brackett    schedule 12.07.2011
comment
Когда вы говорите, что столбцы... отсутствуют, вы имеете в виду столбцы в пользовательском интерфейсе или столбцы в наборе данных? Если столбцы пользовательского интерфейса отсутствуют, возможно, вы могли бы создать новое хранилище данных с синтаксисом SQL, а затем отредактировать синтаксис хранилища данных (т. е. изменить источник) исходного хранилища данных, заменив часть таблицы () частью из нового хранилища данных.   -  person Terry    schedule 13.07.2011
comment
Я думаю, он имеет в виду, что при преобразовании запроса в графику большая часть столбцов удаляется. Я видел это много раз.   -  person Hugh Brackett    schedule 15.07.2011


Ответы (1)


Скорее всего, вы видите синтаксис, созданный в соответствии со спецификацией ODBC. Фигурные скобки представляют собой управляющую последовательность 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/ms714177%28VS.85%29.aspx

И специально для грамматики SQL ODBC: http://msdn.microsoft.com/en-us/library/ms709391%28VS.85%29.aspx

person Rich Bianco    schedule 30.07.2011