ClientDataset.RefreshRecord больше не работает в Delphi XE для объединенных таблиц - есть ли обходные пути?

TClientDataset.RefreshRecord больше не создает часть SQL для объединения таблиц при попытке обновить запись в ClientDataset, подключенном к набору данных с объединенной таблицей в операторе SQL.

В результате вызов этого метода приводит к ошибке SQL «недопустимые имена столбцов» для каждого поля, не входящего в основную таблицу.

Это не было проблемой в Delphi 2010 и ранее.

Ошибка возникает с компонентами DBX4 или BDE, подключенными к TClientDataset, поэтому весьма вероятно, что проблема связана с изменениями кода TClientDataset.

Чтобы воспроизвести эту проблему:

Создайте новое приложение в Delphi XE только с одной формой и поместите в него необходимые компоненты базы данных (TSQLMonitor, TSQLConnection, TSQLQuery, TDatasetProvider, TClientDataset, TDatasource и TDBGrid) и свяжите их друг с другом.

Создал простой оператор SQL с объединением таблиц и поместил его в свойство TSQLDataset.SQL.

Оператор SQL включал всего два поля - ключевое поле основной таблицы и поле из объединенной таблицы - например, в псевдокоде:

Select 
  MainTable.IntegerKeyField
  , JoinedTable.JoinField
FROM MainTable
LEFT OUTER JOIN JoinedTable ON MainTable.LookupFieldID = JoinedTable.JoinKeyField

Добавьте оба этих поля как постоянные поля как в TSQLQuery, так и в TClientDataset с флагом поставщика для ключевого поля, включая pfInKey (RefreshRecord не будет работать, если он не знает, какое поле является ключевым, поэтому постоянные поля являются обязательными).

Добавьте в форму две кнопки - одна просто открывает набор клиентских данных, а вторая вызывает clientdataset.refreshrecord;

Запустите приложение, нажмите кнопку, чтобы открыть набор данных, и данные отобразятся в сетке.

Нажмите кнопку «Обновить запись», и вы получите ошибку SQL «недопустимое имя столбца» для объединенного поля.

Закройте приложение, откройте журнал SQLMonitor и в операторе SQL записи обновления, сгенерированном Delphi, вы увидите, что он не включил оператор соединения таблицы.

====

Я был бы очень признателен за любые идеи, как это исправить.


person Gary    schedule 11.06.2011    source источник


Ответы (1)


Попробуйте использовать view в базе данных для реализации требуемого соединения. Тогда компонент delphi может просто выбирать из view_name, а не обрабатывать соединение самостоятельно.

person Sam    schedule 05.07.2011
comment
Это потенциально может быть обходным путем, но потребует разрешения базы данных для создания представлений. Я надеюсь, что в код Delphi можно будет внести исправление, которое избавит от необходимости прибегать к представлениям. - person Gary; 05.07.2011