我为按钮单击事件编写此代码。第一次单击按钮时,一切正常,但是第二次单击按钮时,则会引发错误。有什么问题吗?
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无法找到行进行更新。某些值可能已更改 自上次阅读以来
答案 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在 与标识相关行以发布更新不同。