为什么此代码第二次不起作用单击按钮

时间:2020-07-31 10:12:19

标签: delphi

我为按钮单击事件编写此代码。第一次单击按钮时,一切正常,但是第二次单击按钮时,则会引发错误。有什么问题吗?

procedure TfrmMain.Button1Click(Sender: TObject);
var
  B : Boolean;
begin
  DM.tblTemp.DisableControls;
  B:= DM.tblTemp.Locate('FoodName', DM.tblAsli.FieldByName('FoodName').AsString,[]) ;
  if  B then
  begin
    DM.tblTemp.Edit;
    DM.tblTemp.FieldByName('Number').AsInteger:=  DM.tblTemp.FieldByName('Number').AsInteger + 1;
    DM.tblTemp.Post;
  end
  else
  begin
    DM.tblTemp.insert;
    DM.tblTemp.FieldByName('FoodName').AsString := DM.tblAsli.FieldByName('FoodName').AsString;
    DM.tblTemp.FieldByName('UnitPrice').AsInteger := DM.tblAsli.FieldByName('FoodPrice').AsInteger;
    DM.tblTemp.FieldByName('Number').AsInteger := 1;
    DM.tblTemp.Post;
  end;
  TotalPrice:= TotalPrice + DM.tblTemp.FieldByName('TotalPrice').AsInteger;
  DM.tblTemp.EnableControls;
end;

错误是

无法找到行进行更新。某些值可能已更改 自上次阅读以来

DM是数据有害的 tmbTbl是ADOTable

1 个答案:

答案 0 :(得分:1)

很遗憾,您还没有说您正在使用哪个DBMS(例如Sql Server或MS Access, 也不会告诉我们该表的列类型和索引的完整列表(如果有的话)。

对q的最可能答案是第一次将变量B设置为False。 因为对tblTemp.Locate的调用未能找到有问题的食物名称,所以执行了Insert分支,并且食物的数据为 已添加到表中,但是第二次执行Edit分支并发生错误, 尽管您还没有确切地说。我的猜测是致电.Post,因为 错误消息是位于DBMS提供程序和您的应用程序之间的ADO层, 尝试将更改发布到表但无法识别要更新的表行时发出。 正如我在评论中提到的那样,解决此问题的方法通常是在表中添加主键索引,而我从您的最新评论中得知,这对您而言已经成功了。为了将来的读者记录和受益,如果可以在连接字符串中确认正在使用的DBMS和正在使用的Ole驱动程序,将会很有帮助。

首先,我已经使用MS Sql Server和MS Access上的表测试了您的代码,但没有 这两个数据库都出错。

首先有一个明显的问号:“ tblTemp.Locate如何成功,但是ADO无法 确定发布更新的正确记录?”答案是tblTemp.Locate在 与标识相关行以发布更新不同。