ACCESS数据库由ODBC连接转为ADO联接后出现的表锁定问题(100分)

玩命

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一套考试程序,使用DELPHI6.0+ACCESS2000开发,工作于一个由20多台工作站
组成的无盘工作站中,工作时20多台微机一同进行操作,原先用ODBC连接,成功运行。
后经多个网友指出ODBC不如ADO,现进行了几天的大改动,将程序由ODBC转为ADO。
结果程序运行后速度有了提高。但频繁出现“表锁定”一类的错误。难道ADO不如
ODBC???后来修改了locktype,也不行。
 
系统提示:“不能更新:当前被锁定”

???这是个很复杂的问题吗??怎么没人回答??
怎么我问的问题总没人回答??
 
呵,你能把ACCESS文件给我吗?
我没有发现该情况!
邮箱:mc@bj99.net
 
可以给你,不过我认为不是数据库的问题,因为ODBC连接时很正常!!!
 
怎么会是这样! 先跟踪一下锁定的是哪些表? 再把相关打开、提交数据的那部分代码贴出来看看
 
其中form1.table2就是原先用ODBC连接时的表,后来换成了ADOtable,现在是
ADOquery程序运行还有错,主要是二台以上的微机同时按下“1”“2”“3”时
出现“不能更新:当前被锁定”,回车后,程序仍能继续执行。但在考试时就麻烦了,
考试的人不停的找监考人员。。。

procedure TForm3.Edit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
myk:=key;
case myk of

37: //按下4
begin
if application.MessageBox('如果您真要交卷,请按下确定;否则请与管理员联系!','系统警告',MB_yesno+MB_Iconstop)=idyes then
begin
form1.Table2.Requery;
form4.showmodal;
form3.Close;
end;
end;

12://按下5
begin
if strtoint(label1.Caption)>1 then
begin
label1.Caption:=inttostr(strtoint(label1.Caption)-1);
edit1.Text:=copy(form1.Table2.Fields[7].asstring,((strtoint(label1.Caption)-1)*5+1),3);
end;
end;

39://按下6
begin
if strtoint(label1.Caption)<100 then begin
label1.Caption:=inttostr(strtoint(label1.Caption)+1);
edit1.Text:=copy(form1.Table2.Fields[7].asstring,((strtoint(label1.Caption)-1)*5+1),3);
end;
end;

35://按下1
begin
form1.Table2.edit;
form1.Table2.Fields[7].asstring:=copy(form1.Table2.Fields[7].asstring,1,(strtoint(label1.Caption)*5-1))+'A'+copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5+1),500);
form1.Table2.Post;

if strtoint(label1.Caption)<100 then
begin
label1.Caption:=inttostr(strtoint(label1.Caption)+1);
edit1.Text:=copy(form1.Table2.Fields[7].asstring,((strtoint(label1.Caption)-1)*5+1),3);
end else
begin
form1.Table3.Locate('题号',inttostr(strtoint(edit1.text)),[loCaseInsensitive]);
if copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5),1)='X' then
edit2.text:='' else
edit2.text:=copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5),1);
end;
end;

40: //按下2
begin
form1.Table2.edit;
form1.Table2.Fields[7].asstring:=copy(form1.Table2.Fields[7].asstring,1,(strtoint(label1.Caption)*5-1))+'B'+copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5+1),500);
form1.Table2.Post;
if strtoint(label1.Caption)<100 then
begin
label1.Caption:=inttostr(strtoint(label1.Caption)+1);
edit1.Text:=copy(form1.Table2.Fields[7].asstring,((strtoint(label1.Caption)-1)*5+1),3);
end else
begin
form1.Table3.Locate('题号',inttostr(strtoint(edit1.text)),[loCaseInsensitive]);
if copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5),1)='X' then
edit2.text:='' else
edit2.text:=copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5),1);
end;
end;

34://按下3
begin
form1.Table2.edit;
form1.Table2.Fields[7].asstring:=copy(form1.Table2.Fields[7].asstring,1,(strtoint(label1.Caption)*5-1))+'C'+copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5+1),500);
form1.Table2.Post;
if strtoint(label1.Caption)<100 then
begin
label1.Caption:=inttostr(strtoint(label1.Caption)+1);
edit1.Text:=copy(form1.Table2.Fields[7].asstring,((strtoint(label1.Caption)-1)*5+1),3);
end else
begin
form1.Table3.Locate('题号',inttostr(strtoint(edit1.text)),[loCaseInsensitive]);
if copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5),1)='X' then
edit2.text:='' else
edit2.text:=copy(form1.Table2.Fields[7].asstring,(strtoint(label1.Caption)*5),1);
end;
end;


end;

end;
 
在执行form1.Table2.Post后,Table2的瞬间锁有没有立即被释放?如没有就需要强行释放它。
另外还要关注的是:在对 form1.Table2的记录实施定位(或移位)时,数据瞬间锁有没有立即被释放?
 
to smallbs :
您好:请问如何释放??急!!再有几天搞不定,就要拿出几天的时间改回ODBC方式了。
你说的释放问题为什么在ODBC方式中,没有问题?
 
这样的用法在ODBC方式中也是存在数据锁的,我一般不这么用,所以只能提出参考建议,就是在table2.post后
用table2.Refresh刷新一下,另外还要注意掌握 定位(或移位)Table2的记录与table2.post的间隔时间,
我一般使用SELECT * FROM TABLE2取记录,用UPDATE table2 set ..和 INSERT INTO TABLE2..加入数据,
这样做没有烦恼。
 
to smallbs:

老凶!你真行!加上table2.Refresh果然解决问题!!!
谢谢。区区100分笑纳!!
不过我还不是很理解。以后慢慢理解吧。
 
顶部