当前位置:主页>delphi7/进销存和数据库> 文章内容

请教一个ado高级问题(好像是内存溢出)高手进

发布时间:2010-01-24 | QQ免费站
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