【发布时间】:2014-10-04 21:21:26
【问题描述】:
我希望我的表具有 autoinc 字段,但使用 ClientDataSet 对其进行插入会导致“字段必须具有值”错误。似乎 Datasnap 服务器不知道它应该自己生成一个并期望一个值。 对于演示,我创建了一个只有 2 个字段的简单表: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 问题,我使用了 Bobs 博士的建议:
procedure TForm3.ClientDataSet1NewRecord(DataSet: TDataSet);
const {$J+}
ID: Integer = -1;
begin
DataSet.FieldByName('ID').AsInteger := ID;
DEC(ID) ;
end;
虽然 autoinc 计数正在倒退,但我可以忍受。但 ... 记录会添加到网格中,但不会添加到数据库中!?
那么有人可以告诉我如何处理这个 autoinc 噩梦吗?看到了一些关于使用数据集的 onreconcile 事件的建议,但手动纠正错误不适合我。我尝试为 ID 字段插入一个零值,希望 datasnap 服务器能够纠正错误,但它所做的只是让我弹出协调对话框,以便我可以纠正问题。救命!
结束;
【问题讨论】:
-
我发现从服务器检索要生成的 ID 以便在帖子中提供最简单的方法。例如 see 代表火鸟。
-
有趣的是,如果我删除 autoinc 字段,一切都会正常运行。当我尝试删除一个值时出现问题。我可以在网格中删除,但不能在数据库中删除。
标签: delphi datasnap delphi-xe6