У меня есть DBGrid-> DataSource-> ClientDataSet-> DataSetProvider-> CustomDataSet.
(в конце я использую собственный настраиваемый набор данных, поскольку у нас нет прямого соединенияна базу данных ... у нас есть указатель на определенный тип, который мы можем изменить в любое время.)
В любом случае, набор данных и клиентский набор данных работают отлично.Недавно я столкнулся с проблемой.
У меня есть первичный ключ с именем ID
в базе данных.Когда я делаю несколько НОВЫХ вставок, я обрабатываю это, вызывая ClientDataSet->Append()
, а затем устанавливаю значение идентификатора каждой новой строки равным обратному номеру последней строки + 1.
(IE: если в настоящее время есть 935 строк, новаяидентификатор строки будет -936)
Таким образом, я исправляю ошибку нарушения ключа, которая возникает, если идентификатор не установлен, поскольку это первичный ключ, а идентификатор БД вставляется при сохранении.
Теперь, где моя проблема:
У меня уже есть пустая строка в базе данных.
У меня установлен уникальный ключ в самой БД, поэтому он не может принимать две строки, содержащие одинаковые данные(поэтому не может быть две пустые строки и т. д.).
У меня уже есть 935 строк в БД, а строка 935 пуста.
Я вставляю 3 новые строки и нажимаю сохранить.
Для каждой я получаю сообщение об ошибке в обратном вызове OnUpdateError, говорящем "Дубликат Роу ".
Это означает, что у меня есть строки 936, 937 и 938 в ClientDataSet, но нет моего CustomDataSet или БД, поскольку ничего не было сохранено, поскольку они содержат ошибки.
Если я удаляю строку 937, все на стороне пользовательского интерфейса выглядит нормально.
Если я снова сохраню данные, строки, которые возвращаются мне по ошибке (и которые хранятся в файле DataXML)это строки 936 и 938.
Разве DataSetProvider не должен был обновиться после удаления строки 937 из ClientDataSet?Я знаю, что строка 938 ошибочна ... но ее больше не существует.
Если стереть 937, то 938 станет 937.
Я некоторое время искал помощи по этому вопросу, но, похоже, ничего не помогло.