不是delphi疯了就是我疯了,关于adoquery的Post
一个简单的数据录入问题:
先在窗口放置几个Edit,然后:
myADOQuery.Close;
myADOQuery.SQL.Clear;
myADOQuery.SQL.Add('select id,xm,xb,whcd,kscj from tbM where 1<>1');
myADOQuery.Open;
myADOQuery.edit;
myADOQuery.FieldByName('id').AsInteger:=IntToStr(Editid.text);
myADOQuery.FieldByName('xm').Asstring:=Editxm.text;
myADOQuery.FieldByName('xb').Asstring:=Editxb.text;
myADOQuery.FieldByName('whcd').Asstring:=Editwhcd.text;
myADOQuery.FieldByName('kscj').AsInteger:=IntToStr(Editkscj.text);
try
myADOQuery.post;
showmessage('保存成功!');
except
showmessage('保存错误!');
end;
以前一直是这样做录入,没什么问题
最近却发现不可思议的问题:
当采用二层设计时,数据录入量大时(如每秒种1-3条录入),会发现记录丢失的情况,大约是每二、三千条丢失5-10条情况,并且中间没有任何提示错误。
使用的环境是:服务器win2003,客户端winxp sp2,mdac版本2.8
现在是客户已经录了10多万条数据,大约丢失了好几百条记录,中间却不知丢失了那些记录,又是一篇一篇的查。
将myADOQuery的locktype改为ltBatchOptimistic,使用UpdateBatch(arAll)更新后,丢失的记录减少到个位数,但还是有问题。
问题根源:
1、post有问题?
2、mdac版本?
3、用户的电脑操作系统?
4、病毒?
[解决办法]
没遇到过 帮顶 最好挂上事物
[解决办法]
我一直用这种模式 ltBatchOptimistic,没发现这种问题
[解决办法]
那有没有试过用execsql.即组装sql语句,而不用insert
[解决办法]
沒遇到過這種問題,還是多測試些數據吧
我個人用adoquey處理數據時,都很少用post,直接用updatebatch
[解决办法]
建议采用TadoDataset作为数据录入的控件,而不用TAdoquery,尽管两者很相近。
[解决办法]
事务的处理,并不在于数据的多少,事务出现的本质就是为了解决数据延迟或异步操作的,所以,对于数据库的操作,最好还是加上事务,不要偷这个懒,如果不加上,就算你不用Delphi,而用C++或其他任何编程语言,都会出现数据丢失的情况。