Ошибка DataSetProvider? - PullRequest
       7

Ошибка DataSetProvider?

0 голосов
/ 01 ноября 2011

У меня есть 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.

Я некоторое время искал помощи по этому вопросу, но, похоже, ничего не помогло.

1 Ответ

1 голос
/ 22 ноября 2011

Я предполагаю, что вы используете поле autoinc в вашей БД. Недавно я обнаружил, что можно сохранить новые строки без применения значения к ключевому полю. В клиентском наборе данных и настраиваемом наборе данных вы должны удалить требуемый флаг для вашего ключевого поля и удалить флаг InUpdate для провайдера набора данных. Я думаю, что это решит вашу проблему.

см. Следующую ссылку http://www.drbob42.com/examines/examinC0.htm

...