Я хотел бы, чтобы в моей таблице было поле autoinc, но вставка в него с использованием ClientDataSet вызывает ошибку «поле должно иметь значение». Кажется, что сервер Datasnap не знает, что он должен генерировать его сам, и ожидает значение. Для демонстрации я создал простую таблицу всего с двумя полями: ID (autoinc) и DATE (varchar). База данных - SQLite.
procedure TForm3.Button1Click(Sender: TObject);
begin
ClientDataSet1.Insert;
ClientDataSet1.FieldByName('DATE').Value:= DateUtils.DateOf(PlannerCalendar1.Date);
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
if ClientDataSet1.ApplyUpdates(0) = 0 then
ClientDataSet1.Refresh;
Чтобы решить проблему autoinc, я использовал предложение доктора Боба:
procedure TForm3.ClientDataSet1NewRecord(DataSet: TDataSet);
const {$J+}
ID: Integer = -1;
begin
DataSet.FieldByName('ID').AsInteger := ID;
DEC(ID) ;
end;
Хотя счетчик autoinc идет назад, я могу с этим смириться. Но... Записи добавляются в сетку, но не в базу данных!?
Так может кто-нибудь, пожалуйста, просветите меня, как справиться с этим кошмаром autoinc? Видел некоторые предложения по использованию события onreconcile набора данных, но исправление ошибки вручную не для меня. Я попытался вставить нулевое значение для поля идентификатора, надеясь, что сервер datasnap исправит ошибку, но все, что он делает, это показывает мне диалоговое окно согласования, чтобы я мог исправить проблему. Помощь !
конец;