gpt4 book ai didi

sql - TADOQuery - 编辑模式插入新记录而不是编辑

转载 作者:行者123 更新时间:2023-12-03 09:27:24 30 4
gpt4 key购买 nike

我对 TADOQuery 的行为感到困惑,我们就打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模式。

我在这里做错了什么?

最佳答案

我认为记录这种行为的评论是离题的。什么文档 不要明确(可能是因为作者从未想到这一点)是这种行为不能保证是确定性的。

TDataSet.Edit 的内部结构几十年来几乎没有改变。这是西雅图版本:

procedure TDataSet.Edit;
begin
if not (State in [dsEdit, dsInsert]) then
if FRecordCount = 0 then Insert else
begin
CheckBrowseMode;
CheckCanModify;
DoBeforeEdit;
CheckParentState;
CheckOperation(InternalEdit, FOnEditError);
GetCalcFields(ActiveBuffer);
SetState(dsEdit);
DataEvent(deRecordChange, 0);
DoAfterEdit;
end;
end;

现在,请注意 if .. then ..取决于 FRecordCount 的值,在 TDataSet 代码中的不同点,它被诸如 SetBufferCount 的代码强制具有给定的假定值(不同的 1、0 或其他值)。和 那个行为未记录 完全 .因此,经过反射(reflection),我认为 Jerry 可能认为尝试编辑不存在的记录应该被视为错误条件是正确的,而不是通过无声地调用 Insert 而不管它是否记录在案。

关于sql - TADOQuery - 编辑模式插入新记录而不是编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62105643/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com