搜了很多资料,都说是索引越界,但是问题就是我这里他不是总出问题,出问题的几率明显少于不出问题的几率,所以我很着急,不知道到底是那行代码除了错误,请达人解答:
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的某些字段,
但是我实在是找不出这个代码到底哪里有问题,所以请教诸位帮忙.
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的某些字段,
但是我实在是找不出这个代码到底哪里有问题,所以请教诸位帮忙.
解决方案 »
- 请教各位,在delphi中如何查看上一次SQL语句执行情况?
- 取指定窗口标题栏上的文字
- 难题,如何让EDIT粘住DBGRIDEH的Column
- 求简易算法
- delphi+SQL2000数据库 开发库存管理系统
- 关于小票打印机纸张设置的问题
- 模糊查找控件
- activexform在客户端浏览时,为什么不能下载?
- fastreport中barcode导出pdf的问题
- wly033(代码机器),flying_fish(飞鱼),scycgyj(阿郎)进来看看!
- gsm610转pcm后有杂音,什么原因?
- 用idhttp.get或idhttp.post向服务器提交10个url,如何实现不等待返回直接提交下一个url?
你的这里的S变量,是从哪里进行赋值的
'select name ,age'+s+' as XXX,info from tabel where 1=0',
目的就是保持查询字段名称不变.
比如:
case sex of
1:s:=',dizhi,xihao';
2:s:=',fushi';
end;
我发现问题很有可能是出在close;这个语句;
close;sql.clear;sql.add(...);open;这里;
感觉就是当close的时候,dbgrideh1并没有即时的反应过来,还在读这些字段,而close的字段已经关闭了,所以出错,不过问题就是出错的几率很小,10%左右,所以真的想不出如何解决,我的adoquery1采用的是批更新模式(ltbatchoptimimsitc),是不是有关呢?
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,那么这些记录应该也自动消失,是不是这里有错误呢?
主要原因是s的赋值的字段个数不一样造成的,这样dataset在close和open的时候dbgridEh里有缓冲column的信息容易造成冲突
建议改变设计方法
1.增加一个dbgridEh2并初始设置为visible,然后s在不同值时设置DBGridEh1和DBGridEh2的visible,这样虽然麻烦点,但肯定不会弹出错
2.在s值变化时清空绑定字段信息 dbgrideh1.Columns.Clear;然后重新设置dbgridEh1.datasource值,这样即可
datasource1.dataset:=nil;
dbgrieh1.columnus.clear;with adoquery1 do
begin close;sql.clear;sql.add(...);open;end;datasource1:=adoquery1;
还是有时候不行...,:(
顺序和设置有问题
dbgridEh1.datasource:='你的datasource',//并且这句是紧跟dbgridEh1.columns.clear清除以后
datasource.dataset可以不用设置,一直绑定就行
close;adoquery1.add('select name 姓名,age 年龄'+s+',father 父亲 from tabel1 ');open;
突然就出错,从dbgrideh1中可以看到上面的中文名显示出来了,
但是本来father 父亲,应该显示"父亲",,可是居然显示的是一个"父"字,然后就报错,adoquery1无法找到字段("父亲");,怎么会出这样的问题?既然open了,字段会出这样的错误吗?
adoquery1.add('select name as 姓名,age as 年龄'+s+',father as 父亲 from tabel1 ');
最好你的s也弄成带as的
1.你需要动态设置eh的datasource
2.动态设置eh的column的各个fieldName
3.最好sql不要用中文,只需要动态设置各个column的title即可
4.在更换语句前清空eh的column信息,然后重新设置eh的datasource
重新Open后数据集字段已经变化了,更原来的对应不上(或者多了几个字段,或者少了几个字段)
所以会出现引用越界的问题如果要这样用,最好动态创建adoquery1
每用完一次,就FreeAndNi(adoquery1);这样保证不会出现这样的问题!
FreeAndNi(adoquery1);
为
FreeAndNil(adoquery1);