如何刷新TQuery表?(80分)

  • 主题发起人 主题发起人 李长柱
  • 开始时间 开始时间

李长柱

Unregistered / Unconfirmed
GUEST, unregistred user!
使用TQuery可以从数据库中查询到所需要的数据,
我需要定时对TQuery表进行刷新,
在执行TQuery的Refresh方法时,会出现
Table does not support this operation
because it is not uniquely.
的错误,
我不想用Close和Open方法进行刷新,
有没有更好的方法呢?
 
一个Query打开过一次后,再次打开时速度很快,
要Refresh一个Query时好像只能用Close和Open。
不过好像先Prepare一下速度更快。
 
重新執行一次SQL語句吧!做成函數, 定時調用.
 
用QUERY.OPEN
即可速度极快
 
agree with slash
 
使用TQuery的Close和Open方法有一定的弊端,假如我们在浏览过程中进行刷新,
数据不会停留在原来的记录上,而是到首记录上,若想回到原来的记录上
(不受刷新的影响),只能用TBookMark,若刷新时间很短,
则会出现数据显示的跳动现象,看起来很不舒服。
而使用Refresh方法则从感觉上就好多了,但TQuery的Refresh方法不好用。
难道TQuery只有Close和Open方法吗?
 
用BookMark+close,open的速度应该是很快的,也许你的数据量比较大。
我在小数据量的数据库上实验几乎感觉不到跳动。因为表不是你独占的
所以不能用Refresh。
 
tquery是可以使用refresh的,但我觉得你的出错信息很奇怪,你的程序有什么特别
的地方比如库结构,等。说的更详细些,或贴一些Source.
 
在单用户环境用refresh的确没问题,可如果在多用户环境下我还是建议不
用Refresh除非你确定你的事务处理的确没有问题,也就是各个用户的隔离
级别选择适当。如果事务处理没问题就不会出现refresh出错。但用BookMark
在任何情况下都可正常运行。
 
TQuery的结果是通过SQL语句查询出来的,与Table不同。
所以它的Refresh是没有意义的,只能重查一遍,这样也会很快的。
要使记录不受刷新的影响,只能用TBookMark。没别的好法子。
什么事情都不是十全十美的吗!
 
看来,除了TBookMark+Close+Open,再没有别的好方法了,
但对于SQL Server数据库,若没有建立主索引,既使是采用Table构件对表
进行Refresh时,仍然会出现
Table does not support this operation
because it is not uniquely
的错误,而对于有主索引的数据库,执行Refresh方法时就不会出错。
因此,我们可以设想若对TQuery建立主索引,执行Refresh时也许就不会出错了,
而事实上,TQuery根本不存在主索引,是这样吧?
 
Bookmark技术可能会定位错误,按照我的经验,Bookmark技术好象
仅仅是记录这个记录的相对位移,很容易指飞了,特别是bookmark指向最后
一条记录,而这条记录又被删除了以后。还会出异常错误。
我发现这个问题后改用Locate语句,反正定位就可以了,速度也还可以,
在上千条记录中定位几乎不花时间,而且按照约束不会定飞了。
至于Refresh,只要使用网络版本的大型数据库,就不要指望使用Refresh
操作,还是老老实实使用close/open好了。
 
bookmark 的确会出现DICK所说的问题。locate可能也会出错,特别是事先指向的记录被删除后。
Refresh用不得,将就一点吧。
 
To Dick:

Tbook方法我是这样用的:

var Tb:TBookMark;
begin
with Query1 do begin
Tb:=GetBookMark;
Close; Open;
Try
GotoBookMark(Tb);
except
Last;
end;
end;
end;
使用Try可防止在记录末尾时产生的错误,
但我不清楚Locate的具体用法?
 
query。prepare;
query。close;
query。sql。add(。。)
。。
query。execsql;
query。unprepare;
经典的使用格式:)
 
多人接受答案了。
 
后退
顶部