Как получить информацию из поля, для которого свойство Required установлено в значение false? - PullRequest
2 голосов
/ 27 января 2012

В моем программном обеспечении есть следующая структура DBX:

TSQLDataSet -> TDataSetProvider -> TClientDataSet

В одном из полей моего TClientDataSet свойство Required установлено в значение false, поскольку это поле автоматически увеличивается на основе триггеров и генераторов в базе данных (Firebird).

Однако после настройки как TSQLDataSet, так и TClientDataSet с этим полем не требуется, я получаю очень странные результаты, когда пытаюсь прочитать это поле из моего TClientDataSet. Я подозреваю, что мне может потребоваться сделать что-то дополнительное, чтобы заставить мой TClientDataSet получить значение этого поля в этом состоянии.

Что мне здесь не хватает?

Заранее спасибо.

EDIT

Файл справки для свойства Required говорит кое-что об этом, но я не совсем понял, чего он от меня хочет.

Описание

Указывает, является ли непустое значение для поля требуется.

Используйте Требуется, чтобы узнать, требует ли поле значение или поле может быть пустым

Если поле создается с помощью редактора полей, это свойство устанавливается на основе базовой таблицы. Приложения, для которых для параметра Required установлено значение true для полей, которые должны иметь значения (например, пароль или часть номер), но для которого базовая таблица не требует поле, должно написать обработчик события OnValidate для принудительного применения свойства.

Когда свойство Required отражает свойство базового таблица базы данных, попытка публикации применить нулевое значение вызывает исключение быть воспитанным. Приложения, которые устанавливают для свойства Required значение true, когда базовая таблица не требует поля, должна поднять Исключение EDatabaseError для нулевых значений в событии OnValidate обработчик для достижения того же результата.

РЕДАКТИРОВАТЬ 2

Забыл упомянуть: между TDataSetProvider и TClientDataSet существует слой DataSnap (соединение TClientDataSet выполняется с драйвером DataSnap).

РЕДАКТИРОВАТЬ 3

Я создал небольшой тестовый набор с этой настройкой DataSnap, и он отлично работал. Проект старый, грязный, и я предполагаю, что либо у меня настроен какой-то неясный вариант, который меня кусает, либо я наткнулся на ошибку DataSnap.

Ответы [ 2 ]

0 голосов
/ 30 января 2012

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

Эту проблему сложно было отладить и этот вопрос вводил в заблуждение.Спасибо всем, кто помог мне отладить это.

0 голосов
/ 27 января 2012

Haole, вы пробовали TClientDataset.RefreshRecord после вставки?Или даже TClientDataset.Refresh?Имея генераторы, вы можете даже получить генератор заранее (перед вызовом ApplyUpdates) в запросе типа select gen_id(generator,1) from RDB$Database (он из памяти, здесь нет Firebird для тестирования) и заранее заполнить поле PK.

РЕДАКТИРОВАТЬ: кажется, что это heisenbug.Я бы попытался удалить компоненты и заново настроить их с нуля (что означает: после удаления, сохранения и закрытия Delphi).

Или, что еще лучше, создайте пустой проект с необходимой конфигурацией запроса и попробуйте просмотреть эти данные в TDBGrid.Если эта проблема все еще возникает, возможно, в вашей установке FB поврежден какой-либо компонент (или даже установка Delphi)

...