请教一个ado高级问题(好像是内存溢出)高手进
1楼: 小弟正开发一套基于sybase软件的扩展模块,用的是adoquery进行带参数的插入操作,所进行操作的表大概有四十个字段,我用一个adoquery从平面文件中取出数据(loadfromfile),另一个adoquery进行插入,付参值方法是adoquery2.Parameters.ParamByName(‘s_dddd‘).value := adoquery1.fieldbyname(‘s_dddd‘).asstring; 程序工作正常,但两天后突然出现
project project1.exe raised exception class eaecessviolation with
message ‘access violation at address 021de81e. write of address
00184000‘.process stopped.
我估计是因表字段太多造成,因为在做只有三个参数的更新时,可以执行成功.请高手帮助解决.
字串7
2楼: 能否试验一下直接用Insert语句然后adoquery.execsql; 字串4
3楼: 可以,而且是ado2.8字串7
4楼: 可以insert成功字串5
5楼: 这个未必是ado引起的吧.最好在你的程序里面可能出错的地方多加try,并将错误信息写在一个文本文件里面.
出错了查查文本log看看是哪里出的问题. 字串3 6楼: 用adoquery2.fieldbyname(‘s_dddd‘).value := adoquery1.fieldbyname(‘s_dddd‘).value试试,
你的那个写法不太好,可能会导致错误
ps:应该是两天后的文件里面的数据引起错误,还是程序里面写的有问题
建议你找出错的文件,拿来单步调试,这样才能找到根源 字串3
7楼: 单步调试过,在onediterr也添加了报错信息,victor_zh的方法我也试过,但是报参数错误。
project project1.exe raised exception class eoleexception with message
‘Parameter object is improperly defined.Inconsistent or incomplete information was provided‘. process stopped. 字串9 8楼: 不是数据引起错误,我以前好像看到过相似问题:
“v2.7或更低版本的ADO,Delphi中执行以下带参数的SQL会出错:“select * (select * from t where f=:p) a”,2.8的就没有问题。查找出这个问题费了很多周折。先是一个很复杂的SQL总报错,然后简化为上述的还是报错,怀疑跟ADO版本有关,发现主文件版本2.70的有问题,2.71的就没问题,想直接替换ADO的支持文件(Program Files\Common Files\System\ado),结果替换成功了,再试时发现文件又被恢复成老版本了,最后在去掉shell后在命令行中替换文件成功,操作系统真是一个巨大的病毒。直接升级到ADO2.8也可以。
其实开发人员、用户、客服人员都一样,发现有问题时都是想者升级软件到高版本,不明白是什么原因,也许问题就解决了。不明白的事情太多,但未知不能阻止程序员去解决问题,许多时候解决问题都是不需要也不知道道理的,只有说有效果比有道理重要。
所述问题确认是ADO处理参数问题后,我们换成基于Zeos的代码来处理参数把参数值直接插入到SQL中形成完整字符串,这样也方便调试、优化SQL,同时解决另一个更复杂的SQL在ADO2.8中执行时导致MSVCRT.dll出现Access Violatioin错的问题。
“ 字串2 9楼: 每个ADOQuery连接不同的ADOConnection 字串1 10楼: 如果用多个ADOConnection 且不是很多余吗?用一个DataModule 有什么不好的呢? 字串1 11楼: 有时,两个ADOQuery共用一个ADOConnection可能会发生潜在的冲突,导致内存溢出。我没更好的决办法,只好再加一个ADOConnection,或者是ADOConnection.Active=false;
ADOConnection.Active:=true;重新激活数据库连接也可以。如果各位有什么更好的办法,希望能指点一下。 字串5
12楼: 我采用过adoquery的字符串连接,不通过adoconnection,还是不行. 字串5
13楼: 1.如 xy780308 说的; 2.adoquery2.Parameters.ParamByName(‘s_dddd‘).dataType:=ftString; adoquery2.Parameters.ParamByName(‘s_dddd‘).value:=adoquery1.fieldbyname(‘s_dddd‘).asstring; adoquery2.ExecSQL; 字串8 14楼: 请问masks:指定数据类型可避免内存溢出吗?以前遇到过类似的吗? 字串1 15楼: 数据类型最好保持一致,这样出错的几率要小一些。 确定adoquery2和adoquery1的‘s_dddd‘字段类型都是字符型吗? 高版本的ADO似乎都比较稳定的,Delphi 6对ADO的支持也比较成熟了, 多从自己的程序找原因吧 字串3 16楼: 有可能是nill字段引起,大家有没有这方面建议 字串2 17楼: 用ado 我从来是直接 用语句 ,坚决不用 Parameters.ParamByName 的 。 就连 2m大的流 我都用语句(for sql server) 字串6 18楼: 用存储过程吗?SysBase支持吗?用存储过程很方便的,更新都很简单字串6
19楼: 由于工作原因,我接触到一个做MIS的程序员,那时他再做电厂的MIS,数据库也是用SyBase,他告诉我,SyBase用ADO不稳定,连接时间超过一天后就会出问题,后来他改用BDE 字串8
20楼: 请问hfghfghfg,怎么用语句 字串8 21楼: 大家谁知道null的字段怎么付参,是否要先判断?isnull(adoquery1.fieldbyname(‘s_dddd‘).asstring) adoquery2.Parameters.ParamByName(‘s_dddd‘).value := adoquery1.fieldbyname(‘s_dddd‘).asstring;是空值会出错,怎么解决 字串8 22楼: if ADOQuery1.FieldByName(‘‘).IsNull then 字串4 23楼: xuance:能写的明白吗? adoquery2.Parameters.ParamByName(‘s_dddd‘).value := adoquery1.fieldbyname(‘s_dddd‘).value adoquey1的s_dddd字段是null我是否要这样写 if ADOQuery1.FieldByName(‘‘).IsNull then adoquery2.Parameters.ParamByName(‘s_dddd‘).value=‘‘ else adoquery2.Parameters.ParamByName(‘s_dddd‘).value := adoquery1.fieldbyname(‘s_dddd‘).value 字串3 24楼: 但是null在数据库中并不是‘‘啊 字串3 25楼: adoquery2.Parameters.ParamByName(‘s_stallid‘).value :=‘‘也提示‘access violation 但 adoquery2.Parameters.ParamByName(‘s_stallid‘).value :=‘1‘可成功字串9