紧急求助!用insert into 表1 select * from 表2后,表1居然无法置为Edit和Insert状态,老提示说另一个用户在用!(200分)

  • 主题发起人 主题发起人 coolqiang
  • 开始时间 开始时间
C

coolqiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的Access数据库,BDE:
具体错误信息如下:
[red]Could't perform the edit becase another user changed the record[/red]

而且这样过后,即便将程序改为简单的对此表Edit,都一样出错;但如果用EmptyTable将
表清空之后再Insert和Edit,却又OK。这个问题困扰了我好几天了,手头的项目因此被停
住了,这是我做的第一个数据库的项目啊!老板又频繁地询问进度,我都实在不好意思再
拖了,本来想这个星期能完成,谁知遇到这样的怪问题。拜托各位高手,一定要帮帮忙
啊!
 
你在INSERT完成后POST了吗?
 
Table1.Refresh;
 
你insert数据后有没有post,以及有没有commit?你是用的同一个表,还是另外一个表,能否将
源码贴上来?
 
对,你把代码弄上来吧。要不大家怎么帮你查啊?
Refresh?有用吗?如果不POST,REFRESH也没用啊;另一方面,如果POST了,不RESRESH也
行啊……
 
coonlee,zhangkan:你们指的insert是insert into 表1 select * from 表2这里的吗?
还是后面置为Edit或Insert状态这里的?如果是后面的,程序到这里就出错了,后面的
post、refresh根本没机会执行啊!
 
代码如下,为方便阅读,略作简化,但关键代码没变,请大家指点!
//清空temp表
with tblTemp do
begin
Active := False;
EmptyTable;
end;

//从表1获取和temp相关的字段
with qryTemp do
begin
Close;
SQL.Clear;
SQL.Add('insert into temp select *from 表1');
ExecSQL;
end;

//检查temp每条记录,根据结果填写Memo字段
with tblTemp do
begin
Active := True;
First;

while not eof do
begin
......... //检查
Edit;
FieldByName('Memo').AsString := 'xxx';
Post;
Next;
end;

Active := False;
end;

 
这个。。。是用独占方式打开数据库的???操作这步的时候还在进行其他操作吗??
要保证数据库的指针已经是指向当前记录。
 
我也遇到过这样的问题,关注
 
是独占方式,如果我将数据库清空,手动添加几条记录,然后将上面的代码前两段注释掉,
运行是没问题的。应该是前面的程序有影响。
 
那么请问,你后面那个TABLE打开之后,你能不能看到你刚才Insert的资料?
首先,你清空表,有没有commit?好像这个不用commit,但你要确认你表的当前状态,是修改还
是浏览.
接着,你用一个query插入数据,你有没有commit,若你没有,这还是在另一个事条,所以你必须
commit;
最后,你修改数据,你可以用断点查看当前状态是什么.
修改一下,如下:
if DataBase.InTransaction then DataBase.Commit;
DataBase.StartTransaction;
try
with tblTemp do
begin
Active := False;
EmptyTable;
end;
DataBase.Commit;
except
DataBase.rollback;
end;
//从表1获取和temp相关的字段

if DataBase.InTransaction then DataBase.Commit;
DataBase.StartTransaction;
try
with qryTemp do
begin
Close;
SQL.Clear;
SQL.Add('insert into temp select *from 表1');
ExecSQL;
end;
DataBase.Commit;
except
DataBase.rollback;
end;

//检查temp每条记录,根据结果填写Memo字段
with tblTemp do
begin
Active := True;
First;

while not eof do
begin
......... //检查
Edit;
FieldByName('Memo').AsString := 'xxx';
Post;
Next;
end;

Active := False;
end;
这下子,应该没问题了.上面的事务处理只是让你程序能够运行,你还需要优化,只用一个事务
处理就行.实际上,你应该就用一个Query来处理不是更好,你同时用到了TQuery和TTable,另外,
你有没有设TDataBase,有几个?上面的Table和TQuery是不是设的同一个DataBase?
 
那大概就是指针还停留在某处了。。。没有转到你要的这条记录来,所以无法进行inster
 
zhangkan:后面那个Table打开后能看到记录,你说的方法我没用过,等我试试!
skylove:不会吧?我都First了,还没有转过来?如果我不用程序,用DBNavigator,先
随便定位到一个记录,在点击Edit或Insert按钮,也是一样!所以应该不是你说的那样!
 
呵呵,问题终于解决了!
因为用的数据库是直接从别的软件里复制过来的,曾经有几个小问题也是因它而起。这次
本来已经怀疑到数据库,并作了尝试,将有问题的表重新建了一个,但没有解决。后来,
万般无奈之下,将整个数据库重建,这些问题居然全部解决了!?
感谢大家的热心帮助!
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
881
DelphiTeacher的专栏
D
D
回复
0
查看
850
DelphiTeacher的专栏
D
D
回复
0
查看
800
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部