adotable插入数据出错!详细内容请进(100分)

  • 主题发起人 majorsoft
  • 开始时间
M

majorsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
用adotable不能修改数据??
procedure TForm1.editBtnClick(Sender: TObject);
begin
adotable1.Close;
adotable1.Open;
adotable1.last;

while adotable1.RecNo>7 do //从最后一条记录开始修改到第7条
begin
adotable1.Edit;
adotable1.Prior;
if adotable1.CanModify then
begin
adotable1.FieldByName('zd_id').Value:=
adotable1.FieldByName('zd_id').Value +1;
adotable1.Post;
end
else
showmessage('不在编辑或插入模式');
end;
adotable,Dbgrid,的readonly都是false
 
1、adotable1.RecNo是否准确有待考证。建议不要使用。除非是桌面型数据库。至少在BDE下它是不准的。
2、下面两句话反过来写。
adotable1.Edit;
adotable1.Prior;
但是好像没有AdoTable1.Next什么的呀!
 
adotable1.Edit;
adotable1.FieldByName('zd_id').Value:=
adotable1.FieldByName('zd_id').Value +1;
adotable1.Post;
 
'zd_id'是否為自動增量字段?是的話是不能進行修改
 
sql server 数据库
to hjw: zd_id为int型 不是自動增量字段
to all:
用单步调试的时候,执行到
adotable1.FieldByName('zd_id').Value:=
出错 出错提示为"记录集不在编辑或插入模式",
我想不是其他的问题
 
已经调试出来了:
可能是 adotable1.Prior;改变了它的属性的原因。
为什么这一句会通过呢?if adotable1.CanModify then,请各位高手指点:
procedure TForm1.editBtnClick(Sender: TObject);
begin
adotable1.Close;
adotable1.Open;
adotable1.last;

while adotable1.RecNo>7 do ////从最后一条记录开始修改到第7条的下一条
begin
adotable1.Edit;
if adotable1.CanModify then
begin
adotable1.FieldByName('zd_id').AsInteger :=
adotable1.FieldByName('zd_id').value+1;
adotable1.post;
end
else
showmessage('不在编辑或插入模式');
adotable1.Prior;
end;
adotable1.Refresh;
end;
 
去掉这个 adotable1.Prior;,
或者放到Edit 前面。
if adotable1.State in[dsBrowse, dsInsert] then
begin
adotable1.FieldByName('zd_id').AsInteger :=
adotable1.FieldByName('zd_id').value+1;
adotable1.post;
end;
 
adotable1.Prior应该放到Edit前面。它会修改数据表的状态。
举个很简单的例子:
adotable1.Open;
adotable1.First;
adotable1.Edit;
adotable1.FieldByName('name').AsString:='zong';
adotable1.Post;
是完全正确的。但是
adotable1.Open;
adotable1.edit;
adotable1.first;
adotable1.FieldByName('name').AsString:='zong';
adotable1.Post;
就会得到当前数据表不在编辑或插入状态。昨天晚上没有仔细给你看,抱歉。
 
对不起错了,

应该是这样,if adotable1.State in[dsEdit, dsInsert] then
 
to majorsoft:
问题出在你的那句.adotable1.prior;
adotable1.edit;
adotable1.prior;
你先调用edit,使其进入编辑模式,但再调用prior的时候,记录指针
已经移动了.而adotable1记录指针的移动相当于进行了一次post调用。
数据表已回复原来的非编辑模式。
而adotable1.canmodify 是用来判断用户是否可以进行插入、编辑、删除的。
而并非只判断修改的,当然就可以执行通过。
 
问题已经解决得差不多了,谢谢各位!…!
原因:
1. 先调用edit,使其进入编辑模式,但再调用prior的时候,记录指针
已经移动了.而adotable1记录指针的移动相当于进行了一次post调用。
数据表已回复原来的非编辑模式。(引用pcc_mmz1)

2. 建议使用if adotable1.State in [dsEdit, dsInsert] then
而不要用 if adotable1.canmodify then 我个人认为它是指是否允许用户插入、修改、删除。。
而并不是指它的状态是否在编辑状态 (bigroute)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
600
import
I
I
回复
0
查看
745
import
I
I
回复
0
查看
631
import
I
顶部