用DBGrid为无索引表添加记录时出现的奇怪问题!是D5的BUG吗?(100分)

  • 主题发起人 主题发起人 coolqiang
  • 开始时间 开始时间
C

coolqiang

Unregistered / Unconfirmed
GUEST, unregistred user!
一个简单的数据库程序,用了Table、DataSource和DBGrid,随便打开一个数据库表,添加
一个Button,为其事件添加如下代码:
table1.insert;
table1.FieldByName('No').AsString := '0003';
table1.post;

结果发现DBGrid中新增的这一条记录不是在增加的一栏,而是档住了原来位置的记录,
但当程序再次运行后,能看到新增的记录,也没有档住原来的。我试过用table1.refresh,
但系统提示无索引表无法刷新。该怎么解决这个问题呢?
如果是有索引的表,一切都很正常。
 
动态建立一个内存索引吧。
 
用Append试试
 
CJF:如何动态建立内存索引?
vickowang:试过Append,一样效果!
 
ApplyUpdates呢?
 
engleking:ApplyUpdates怎么用?好像Table控件没有此方法啊!
 
动态建立索引,用indexfield试试
 
哪位高手快帮我搞定这个无索引表啊!
我又遇到一个它引起的问题,设置了Table1的Filter属性后,Filtered设为True,这时也
需要刷新Table1,但它无法刷新,提示出错,跟上面其实是一回事,都是刷新的问题。
 
coolqiang,我来了,
把你的table的indexFieldName设置为任意一列,然后就可以刷新了。
你选不出来,可以手工输入进去,试一试
 
试过了,提示的错误是:'Table does not support this operation because it is not
uniquely indexed.'!该怎么办?
 
将表的active 设为false 再设为true
 
zwk6608:表的active设为false,那我还怎么添加记录啊?
 
不要用Insert,用Append。这可能是DBGrid的一个BUG。

为表加一个自动增长的索引,在字段对象中将这个字段的visible设为False;

如果你用DBGRID来输入数据点击TDBNavigtor的INSERT时INSERT会在当前DBGRID的显示记录集的倒数第二条位置上插入数据,让你产生了少输一条的以为。以是两条一模一样的记录产生了。

在DBNavigtor的Action事件中写:
  if Button = nbInsert then
begin
DataSet.Append;
Abort;
end;


 

table1.insert;
table1.FieldByName('No').AsString := '0003';
table1.post;
table1.active:=false;
table1.cctive:=true;

这样表后重新打开,数据会被刷新。
 
blue_morning:你的方法我没试,因为如果能改动数据库表的话我就不用这么麻烦了,指
定一个索引字段就什么问题都没有了。
zwk6608:试过了,好像可以,等我再仔细研究研究!
 
[red]如果table1的資料很大的話,close,open會出現什么結果?
好象用query1也同樣出現此問題,就是有索引也一樣.我想大家都遇到過吧?
怎么解決呢?[/red]
 
如果数据量大的话,用
table1.close;
talbe1.open;
不太好,系统会很慢,最好还是在表中给某个字段加个索引.
 
[red]加了索引,query還是出現此問題那怎么解決?[/red]
 
table1.insert;
table1.FieldByName('No').AsString := '0003';
table1.post
Table1.Filtered:=false;
table1.active:=false;
table1.active:=true
 
caoliu:你加的这行代码
Table1.Filtered:=false;
好像很多余啊!

 
后退
顶部