【问题标题】:Why this code do not work in second time click button为什么此代码在第二次单击按钮中不起作用
【发布时间】: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


【解决方案1】:

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

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

Fwiw,我已经使用 MS Sql Server 和 MS Access 上的表测试了您的代码,但没有得到 任一数据库出错。

顺便说一句,有一个明显的q,“怎么tblTemp.Locate成功了,但是ADO却无法 确定发布更新的正确记录?”答案是 tblTemp.Locate 在 一种不同于识别相关行以发布更新的方式。

【讨论】:

  • 正如我所说,如果您能接受这个答案(通过点击左侧的“勾号”图标),那就太好了。
猜你喜欢
  • 2013-06-13
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多