的DataSnap和AUTOINC场(DataSnap and the autoinc field)

2019-10-20 16:27发布

我想我的表有AUTOINC场,但使用ClientDataSet的原因“字段值必须是”错误就可以做一个插件。 这似乎DataSnap服务器不知道它应该产生一个本身并预期值。 在演示中,我创建一个简单的表仅具有2个字段:ID(AUTOINC)和日期(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事件,但手动更正错误的一些建议是不适合我。 我试图插入的ID字段希望DataSnap服务器会纠正错误零值,但它是所有闪光我调和对话,所以我可以解决此问题。 救命 !

结束;

Answer 1:

你不是说你用你的DataSetProvider连接到SQLite数据库是什么样的数据集。 我想这不是一个FireDac数据集,因为它们在sqlite的表正确处理AUTOINC列。

因此,假如你使用一些其他类型的,我想你可能忽略的勘误一节的意义

http://edn.embarcadero.com/article/20847

文章已在注释中,在那里说已经提到:

“对于那些不图他们的自动递增领域TAutoIncField的DBMS,你需要删除源数据集TField.ProviderFlags.pfInUpdate标志允许的DataSnap解决记录到数据库中。你真的做同样的事情是的DataSnap通过这样TAutoIncFields自动完成“。

这适用于sqlite的。 还有一点,你需要做的是检查你的源数据集的列类型(我的意思是,一个喂养你的DataSetProvider),在运行时,如果你的源数据集字段不是持久的。

SQLite的,源数据集字段类型应该是ftLargeInt,不ftAutoInc,因为在SQLite数据库的AUTOINC列大小是64位,而不是32位(这是ftAutoinc假设)。 为了避免这个问题的最简单方法是在你的源数据集创建持久的中tfields并确保ID列一个是在访问SQLite数据库和您的ClientDataSet双方你DBX表型ftLargeInt。

顺便说一句#2,你不需要2周的ApplyUpdates在Button1Click,但除此之外,你的代码似乎罚款。



文章来源: DataSnap and the autoinc field