【发布时间】:2020-08-01 03:08:49
【问题描述】:
我为按钮单击事件编写此代码。我第一次单击按钮时,一切正常,但是当第二次单击按钮时,它会引发错误。有什么问题?
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 是数据 madual tmbTbl 是 ADOTable
【问题讨论】:
-
虽然大多数人可能都猜到了,但您确实应该说明
tblTemp(和DM)的类型。不需要猜测 Q 中的类型。此外,您应该包括错误消息和引发异常的行的行号。 -
好吧,你仍然没有说异常发生在哪一行,所以-1。如果我怀疑它在 .Post 行上,这通常意味着它是 ADO 层,它找不到要更新的行,这通常可以通过向表中添加主键来解决。
-
@KenWhite:不确定是不是骗子——我无法使用 Sql Server OLE DB 提供程序或 Microsoft.ACE.OLEDB.16.0 来重现错误。不过,如果 OP 没有提供必要的细节......
-
@MartynA:骗子提到了连接字符串中的必要更改。除非发帖人能提供更多细节来证明另一个人不是骗子,否则我觉得这很像。如果发布者编辑问题以提供足够的详细信息以使欺骗不正确,则可以重新打开问题。
-
@KenWhite:鉴于OP最新评论添加pk,我已经投票重新开q了。
标签: delphi