Иногда кажется, что даже очевидные вещи идут не так. Есть много очевидного и много того, что может определенно пойти не так при работе с компонентами SQL, и даже больше, когда они представляют собой всего лишь кольцо целой цепочки SQLQuery => Provider => ClientDataSet => DataSource => DataControl.
Сегодняшний пример такой невероятно глупый, но расточитель времени.
Как это воспроизвести:
Отбросьте TZQuery (ZeosLib) с помощью простого параметрического соединения в его SQL, например:
SELECT
pr.product_id AS product_id,
pr.model AS model,
pd.name AS name,
pr.image AS image,
pr.status AS status,
pr.date_added AS date_added,
pr.date_modified AS date_modified
FROM oc_product pr
LEFT JOIN oc_product_description pd
ON pr.product_id = pd.product_id AND pd.language_id = :language_id
WHERE
pr.status = 1
ORDER BY
pd.name
Конечно, у нас есть один параметр :language_id
.
Затем удалите связанный с ним TDataSetProvider, затем TClientDataSet, затем TDataSource и, наконец, TDBGrid, каждый из которых связан с предыдущим. Наконец, отбросьте TDBNavigator и тоже свяжите его.
Наконец, добавьте поля в TClientDataSet, подписи и т. Д.
При запуске программы мы назначаем параметр компоненту TZQuery примерно так:
qryProduct.Params.ParamByName('language_id').AsInteger := 2;
Где 2 - это жестко запрограммированное демонстрационное значение (в реальном приложении оно определяется путем запроса текущего используемого языка Windows).
Теперь запустите приложение: отлично!
Теперь нажмите «Обновить» на TDBNavigator.
Либо вы получите неприятный: «Нарушение ключа», либо совершенно пустой name
столбец в TDBGrid.
Почему?