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

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

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

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

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

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

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

Создал простой оператор SQL с объединением таблиц и поместил его в TSСвойство QLDataset.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, вы увидите его.не включил оператор соединения таблицы.

====

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

1 Ответ

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

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

...