【发布时间】:2020-05-30 16:42:54
【问题描述】:
我对@987654322@ 的行为感到困惑,我们就叫Q。当我使用Q.Edit,填充一些字段,然后Post,它最终实际上插入了一条新记录。
代码很简单,从对象中读取ID:
Q.SQL.Text := 'select * from SomeTable where ID = :id';
Q.Parameters.ParamValues['id'] := MyObject.ID;
Q.Open;
try
Q.Edit;
try
Q['SomeField']:= MyObject.SomeField;
finally
Q.Post;
end;
finally
Q.Close;
end;
令我惊讶的是,它决定插入一条新记录,而不是更新预期的记录。单步执行代码,紧跟在Q.Edit之后,查询实际上是Insert模式。
我在这里做错了什么?
【问题讨论】:
-
这是自然行为,它是documented。 "如果数据集为空,Edit 调用 Insert。 否则 Edit"
-
嗯,我认为这是一个有用的问答,因为行为,无论是否记录在案,都不直观、不直观或令人难忘。
-
你总是可以在尝试编辑之前检查 EOF,我在这里没有看到问题,这都是记录在案的行为......
-
正如 MartynA 所说,无论是否记录在案,这仍然是一种奇怪的行为。在我意识到数据集是空的之前,我花了 20 分钟在我的桌子上敲打我的头,试图弄清楚为什么它是插入而不是编辑。一旦我发现它是空的,我很快就找到了原因(一个函数“添加”返回了我的对象,它有一个“ID”参数,虽然提供了,但我从未在该函数中分配它)。
-
您的代码有缺陷,避免该缺陷(通过检查 EOF)并且不需要 headbanging...