Как избежать получения этой ошибки. Ненулевой столбец не может быть обновлен до нуля при использовании отношения ADO Master-Detail?

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

Главный первичный ключ - это столбец идентификаторов (поле автоинкремента)

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

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

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

Таблица деталей:

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

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

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


person Yazan Al-lahham    schedule 08.02.2011    source источник
comment
Что плохого в том, чтобы сначала опубликовать запись главной таблицы? Или это не работает?   -  person Sertac Akyuz    schedule 08.02.2011


Ответы (2)


Что ж,

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

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

person Rafael Colucci    schedule 08.02.2011
comment
Еще одно хорошее решение, которое я часто использую, — не использовать столбец Id в качестве идентификатора. Вместо этого используйте уникальный идентификатор. Таким образом, вы можете предварительно создать главный идентификатор и использовать его в наборе данных. - person Rafael Colucci; 08.02.2011
comment
Остерегайтесь (большого) потраченного впустую пространства, фрагментации и неэффективности индекса, если ваш уникальный идентификатор pK также является ключом индекса кластеризации. Кимберли Трипп ссылка объясняет это намного лучше меня. - person Fabricio Araujo; 09.02.2011

Просто примечание: CTP нового кодового имени SQL Server «Denali» принесет функцию SEQUENCES, работающую намного ближе к тому, где работает генератор firebird. Так эта задача станет НАМНОГО проще:

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

Очень мило...

person Fabricio Araujo    schedule 10.02.2011