Как избежать получения этой ошибки «столбец, не имеющий значения NULL, нельзя обновить до NULL» при использовании отношения ADO Master-Detail? - PullRequest
0 голосов
/ 08 февраля 2011

Я пытаюсь создать форму Master-Detail, используя TADODataSet, TDBText для главной таблицы и TDBGrid для таблицы подробностей (что-то более простое для формы заказов, например, для основной таблицы, включает заголовок заказа, а таблица сведений содержит элементы заказа)* Главный первичный ключ - это столбец Идентичность (поле автоинкремента)

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

как обойти эту проблему?

Я соединяю мастер-таблицу с таблицей сведений, используя следующие свойства: оба набора данных имеют расположение курсора: клиент

Таблица сведений:

  • Источник данных: источник данных главной таблицы
  • Основные записи: Id (первичный ключ главной таблицы)
  • IndexFieldNames: OrderId (поле в таблице сведений, указывающее, какой мастерзапись относится к этой подробной записи)
  • Тип блокировки: BatchOptimistic

Пожалуйста, помогите мне

Заранее спасибо Язан Аль-Лахам

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Ну

Вы должны сделать что-то подобное (псевдокод):

1 - начать транзакцию
2 - основная запись сообщения
3 - получить идентификатор, вставленный в мастер
4 - передать основной идентификатор в набор данных деталей
5 - запись подробностей записи
6 - Если это сработало, совершите транзакцию. В противном случае откат транзакции.

0 голосов
/ 10 февраля 2011

Еще одно замечание: CTP нового SQL Server с кодовым названием «Denali» принесет особенность SEQUENCES, работающую практически рядом с работой генератора firebird. Так что это задание станет НАМНОГО проще:

Когда вы получаете команду от GUI, чтобы начать вставку, получите идентификатор из последовательности Используйте его, чтобы заполнить поле PK основной записи Опубликовать основную запись Пока у вас есть подробные записи для вставки Заполнить запись детали Опубликовать подробную запись Подтвердить транзакцию

Очень хорошо ...

...