EDatabaseError的错误提示为‘操作必须是一个可更新的查询'是由什么引起的?(100分)

  • 主题发起人 主题发起人 eyangyj
  • 开始时间 开始时间
E

eyangyj

Unregistered / Unconfirmed
GUEST, unregistred user!
D5+ADO+Access2000的环境,数据使用ADOTable,在使用DBAware类控件时一切正常,但一旦执
行我自变的Insert、Append或Edit后的Post后,就出现此异常,跟踪定位到Post语句,但仔细
检查了所有属性,并反复检查了State和CanModify属性,均无问题,不知哪位给予指点,帮我
解决此问题?
 
游标类型不对.
 
把你的代码贴上来看看。
 
procedure TfrmPEAD.bbToNextClick(Sender: TObject);
Var
nextStep: Integer;
LocateSuccess: Boolean;
SearchOptions: TLocateOptions;
begin
{首先处理好当前及下一阶段的阶段序号}
If ( CInStep>=1 ) And ( CInStep<5 ) Then Begin
nextStep := CInStep+1;
End Else If ( CInStep=5 ) Then Begin
nextStep := 7;
End Else Begin {不可没有下一阶段转移直接退出}
ShowMessage('当前投资项目没有下一阶段可转,无法再处理!');
Exit;
End;
Screen.Cursor := crHourGlass;
With dmMTG.tPrjNext Do
Try
DisableControls;
Active := False;
{替换有效的对应于当前项目阶段的下一阶段的数据库表}
TableName:='tbItem'+Trim(IntToStr(nextStep));
Active := True;
{在下一阶段数据表内查询是否已存在当前项目信息内容}
SearchOptions := [loPartialKey];
LocateSuccess := Locate('编码;主名称',
VarArrayOf([dmMTG.tPrjInfo.FieldByName( '编码' ).AsString,
dmMTG.tPrjInfo.FieldByName('主名称').AsString]),
SearchOptions);
If LocateSuccess=True Then Edit
Else Append;
Append;
{填写需要转移到下一阶段的投资项目数据}
FieldByName('编码').AsString :=dmMTG.tPrjInfo.FieldByName('编码').AsString;
FieldByName('主名称').AsString :=dmMTG.tPrjInfo.FieldByName('主名称').AsString;
FieldByName('子名称').AsString :=dmMTG.tPrjInfo.FieldByName('子名称').AsString;
Post;
Finally
Close; {正确与否均关闭数据表}
EnableControls;
End; {End of dmMTG.tPrjNext}
Screen.Cursor := crDefault;
end;
 
这种情况是因为系统返回单向只读游标。
所以你要查的是你的sql语句和游标设置,必需符合可更新条件。
 
procedure TfrmPEAD.bbToNextClick(Sender: TObject);
Var
nextStep: Integer;
LocateSuccess: Boolean;
SearchOptions: TLocateOptions;
begin
{首先处理好当前及下一阶段的阶段序号}
If ( CInStep>=1 ) And ( CInStep<5 ) Then Begin
nextStep := CInStep+1;
End Else If ( CInStep=5 ) Then Begin
nextStep := 7;
End Else Begin {不可没有下一阶段转移直接退出}
ShowMessage('当前投资项目没有下一阶段可转,无法再处理!');
Exit;
End;
Screen.Cursor := crHourGlass;
With dmMTG.tPrjNext Do
Try
DisableControls;
Active := False;
{替换有效的对应于当前项目阶段的下一阶段的数据库表}
TableName:='tbItem'+Trim(IntToStr(nextStep));
Active := True;
{在下一阶段数据表内查询是否已存在当前项目信息内容}
SearchOptions := [loPartialKey];
LocateSuccess := Locate('编码;主名称',
VarArrayOf([dmMTG.tPrjInfo.FieldByName( '编码' ).AsString,
dmMTG.tPrjInfo.FieldByName('主名称').AsString]),
SearchOptions);
If LocateSuccess=True Then Edit //LoacateSuccess已经是布尔型了,为什么还要等于True?
Else Append;
Append; //这里为何还要加一个Append?
{填写需要转移到下一阶段的投资项目数据}
FieldByName('编码').AsString :=dmMTG.tPrjInfo.FieldByName('编码').AsString;
FieldByName('主名称').AsString :=dmMTG.tPrjInfo.FieldByName('主名称').AsString;
FieldByName('子名称').AsString :=dmMTG.tPrjInfo.FieldByName('子名称').AsString;
Post;
Finally
Close; {正确与否均关闭数据表}
EnableControls;
End; {End of dmMTG.tPrjNext}
Screen.Cursor := crDefault;
end;

 
append是自动POST吧??
所以只有在EDIT状态下POST才有用
改一下
if DataSetState = dsEdit then post;
 
后退
顶部