搜了很多资料,都说是索引越界,但是问题就是我这里他不是总出问题,出问题的几率明显少于不出问题的几率,所以我很着急,不知道到底是那行代码除了错误,请达人解答:
mdiform下某一个窗体内:dbgrideh1->datasource1->adoquery1,一路绑定.
//开始
procedure kaidan;
begin
with adoquery1 do
begin
     close;sql.clear;sql.add('select name ,age'+s+',info from tabel where 1=0');open;
     //其中s是不定的字段.
     这样打开很正常;dbgrideh1显示所有字段.
end;
end;
//结束
bitbtn1.click
begin
    adoquery1.close; kaidan;//重新开单
end;
80%的情况下,dbgrideh1是正常的,能够重新显示所有字段 ,但是偶尔他就出错'list out of bound(x)'或者 'dbgrideh1 has not parent window';这时候,报错,dbgrideh1就花屏了,里面乱做一团,行线都错位了.我理解就是dbgriedh1找不到adoquery1的某些字段,
但是我实在是找不出这个代码到底哪里有问题,所以请教诸位帮忙.

解决方案 »

  1.   

    除了看到where 1=0很有意思之外,没发现其他特别的
      

  2.   

    age'+s+\
    你的这里的S变量,是从哪里进行赋值的
      

  3.   

    可以尝试修改SQL:
    'select name ,age'+s+' as XXX,info from tabel where 1=0',
    目的就是保持查询字段名称不变.
      

  4.   

    s是根据不同的情况,补充不同的字段.
    比如:
    case sex of
    1:s:=',dizhi,xihao';
    2:s:=',fushi';
    end;
    我发现问题很有可能是出在close;这个语句;
    close;sql.clear;sql.add(...);open;这里;
    感觉就是当close的时候,dbgrideh1并没有即时的反应过来,还在读这些字段,而close的字段已经关闭了,所以出错,不过问题就是出错的几率很小,10%左右,所以真的想不出如何解决,我的adoquery1采用的是批更新模式(ltbatchoptimimsitc),是不是有关呢?
      

  5.   

    一大堆内存为读错误后,出现:dbgrideh1 has no parent window.这是最后的提示.
      

  6.   

    再详细一些:
    dbgrideh1里面现有5条记录,打算作废这些记录,重新开单,
    在不对这5条记录做任何处理的情况下,直接执行kaidan,一般情况下,没有问题,出错时:
    Access violation at address 00403c16 in module 'project1.exe'.read of address ffffffd0.
    这是adoquery1应该执行到了close;这句,还没有重新open,这时出错,关闭当前窗口,一大堆Access vio...错误提示,最后提示:dbgrideh1 has no parent window.结束.
    我觉得就是尽管没有刻意的去删除目前的5条记录,一旦adoquery1 close,那么这些记录应该也自动消失,是不是这里有错误呢?
      

  7.   

    把你的SQL,SHOWMESSAGE出来,看看,那个条件1=0有什么意义吗?
      

  8.   

    你这种设计方法出现这种问题很正常,我也曾经出现过
    主要原因是s的赋值的字段个数不一样造成的,这样dataset在close和open的时候dbgridEh里有缓冲column的信息容易造成冲突
    建议改变设计方法
    1.增加一个dbgridEh2并初始设置为visible,然后s在不同值时设置DBGridEh1和DBGridEh2的visible,这样虽然麻烦点,但肯定不会弹出错
    2.在s值变化时清空绑定字段信息 dbgrideh1.Columns.Clear;然后重新设置dbgridEh1.datasource值,这样即可
      

  9.   

    因为你的dbgrideh1是一个动态的,所以重新开单时,最好先把dbgrideh1的列值清空一样,这样新的SQL才能重新加载
      

  10.   

    我试了一下,
    datasource1.dataset:=nil;
    dbgrieh1.columnus.clear;with adoquery1 do
    begin close;sql.clear;sql.add(...);open;end;datasource1:=adoquery1;
    还是有时候不行...,:(
      

  11.   

    .......
    顺序和设置有问题
    dbgridEh1.datasource:='你的datasource',//并且这句是紧跟dbgridEh1.columns.clear清除以后
    datasource.dataset可以不用设置,一直绑定就行
      

  12.   

    还是不行,问题应该是你们所说的,但是怎么解决呢?
    close;adoquery1.add('select name 姓名,age 年龄'+s+',father 父亲 from tabel1 ');open;
    突然就出错,从dbgrideh1中可以看到上面的中文名显示出来了,
    但是本来father 父亲,应该显示"父亲",,可是居然显示的是一个"父"字,然后就报错,adoquery1无法找到字段("父亲");,怎么会出这样的问题?既然open了,字段会出这样的错误吗?
     
      

  13.   

    as都没写
    adoquery1.add('select name as 姓名,age as 年龄'+s+',father as 父亲 from tabel1 ');
    最好你的s也弄成带as的
      

  14.   

    而且你还需要动态设置dbgridEh各个column的fieldName
      

  15.   

    as有用吗?我从来都没写过.sql调试没问题呀?
      

  16.   

    你的问题和你写东西的习惯有关系
    1.你需要动态设置eh的datasource
    2.动态设置eh的column的各个fieldName
    3.最好sql不要用中文,只需要动态设置各个column的title即可
    4.在更换语句前清空eh的column信息,然后重新设置eh的datasource
      

  17.   

    去掉close情况,单独做一个窗体,看看效果如何.
      

  18.   

    是不是kaidan执行后,某些地方又用到adoquery1 做了些别的操作
      

  19.   

    adoquery1 是不是有计算列代码?
      

  20.   

    我以前也遇到过,忘了怎么弄的了.我想还是动态SQL出了问题
      

  21.   

    很显然是S值的变化时出现的问题,用Close是不能清除上次的数据集,
    重新Open后数据集字段已经变化了,更原来的对应不上(或者多了几个字段,或者少了几个字段)
    所以会出现引用越界的问题如果要这样用,最好动态创建adoquery1
    每用完一次,就FreeAndNi(adoquery1);这样保证不会出现这样的问题!
      

  22.   

    更正
    FreeAndNi(adoquery1);

    FreeAndNil(adoquery1);