300分求解:如何中断一个查询?(300分)

  • 主题发起人 主题发起人 snake
  • 开始时间 开始时间
S

snake

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库为informix,在线程里跑一个后台查询,如何中断这个查询呢?象informix、
SQL server等大数据库的sql 工具都提供中断一个查询的功能,如何在程序中实现?
 
也想听听
 
可不可以将查询功能封装到一个线程中,然后如果不想查了,那么强行中断线程。
 
对啊,线程可以随时中断、挂起。很方便的。
 
我来抛砖引玉吧,把一个查询放在线程里是可以的,但是控制的了线程却控制不了
查询,强行中断线程后,已提交的查询并没有因此而中止,这样一来下一个查询就
提交不成,因为第一个query根本不能close。而且放在线程什么suspend,resume,
terminate都是自欺欺人,没用。问了一下informix公司的人,说有两个函数:
SQLFreeStmt和SQLCancel,我查到这两个函数在winnt/system32/odbc.hlp里提到,
但在delphi里怎么引用?
 
snake,查metacube里异步查询如何中断的,明天跟你谈,我的想法是用execope把他dll里的export 函数列出来。看那个是可以得函数。
你要分点分给我。我太少了。
 
说白了就是异步执行的技术,好像只有ODBC支持而BDE不支持,在ODBC.hlp提到各种函数
怎么用,但函数众多,要写个查询要写很多语句,后来装了一个ODBCExpress,里面就有
一个ExecAsnyc的属性,所带的帮助和demo都说明这个属性设成true以后查询会在后台进
行,而且可以随时中断。哎。。。。我一把他设成true以后一打开查询后delphi就退出
,有时候就说堆栈溢出。其死我了,自带的demo也一样。谁帮帮我?
 
BDE的设置对Sybase和MSSQL server有异步执行SQL语句的方法,
但是tquery并没有提供类似ODBC的中断查询的方法,因此设置了也没用,反而更糟糕。

而且这种设置也只对Sybase和MSSQL server有效,不具有通用性,所以没什么意义。

ODBC是使用ExecAsnyc来指定异步查询的,应该正确,
至于odbcexpress把delphi搞歇了,那就是另一回事了,不了解。
 
BDE中断查询非常简单,创建TBDECallback,注册一个callback过程,
callback类型有很多,用于中断长query的是cbCANCELQRY类型,
query时候会每隔一段时间调用一下这个callback过程,返回cbrABORT退出query,
返回cbrCONTINUE 继续查询。
 
Callback功能是BDE提供的,只能对“严重”依赖BDE的数据库操作有效,
例如BatchMove以及某些local SQL,而对Server端查询是无效的,
时间再长callback也不会被调用,因此不能中断查询。
 
我用odbc的sqlgetinfo函数所返回的函数也说我的informix驱动程序不支持异步查询功能,
但他自带的SQL Editor就可以实现,看了一下TBDECallback函数,参数很多,拜托pipi给出
一个具体点的例子。
 
我有利用TBDECallback中断查询的例子,如果需要可以贴在这里,或者mail给你。
但我已经说了,只在localsql/batchmove中有用,我在MSSQL中试验,毫无反应,
我看imformix也差不多,还是不要试验了。

MS sql server的sql工具也支持中断查询,我看是内部特殊方法,不通用,
因此delphi的查询机制没有把这一功能抽象进来。
 
听高手们讨论!
 
温柔一刀说得对,BDE对中断查询是有局限的。
记得深度历险中有过相关控件,封装了ODBC的有关函数,有源码,
应该可以通过ODBC来解决问题,可以去查查。
 
我试了一下ODBCExpress+SQL Server 7.0,中断很成功,一换上informix就堆栈溢出,
我看见informix里也有象ODBC里的SQLCancel之类的函数,到底是谁封装谁?
温柔一刀,可以发个例子给我学习一下吗?
 
You can try to get the answer in the API of Database(such as Informix).
 
后退
顶部