我用的是TADOConnection,TADOQuery控件,数据库是SQL Server,其中TADOQuery执行的是一个存储过程,时间有时候比较长,希望用户能够中断正在执行的存储过程,不知道怎么做,请教各位

解决方案 »

  1.   

    1.新建一个线程用来触发存储过程的执行,而主线程中,如果用户按下取消键,则又一个ADOQUERY会设置"指示表"的字段为停止工作.
    2.在存储过程中不断检测继续运行指示表的指示字段,发现此字段指示出停止工作,则回滚事务
    (需要的话).
      

  2.   

    这样好象不行吧,因为我的存储过程是在另外一个服务器中提取数据,有时候数据量比较大时,时间就较长,因而需要有可中止功能。但此提取数据是一个SELECT语句或一个较复杂的SELECT语句,当中是没办法检查提示表的,也就无法自己中止工作。应该是外力中止工作,就好象查询分析器中的停止功能(红色方形按钮)一样。
    不知道是不是我没理解你的意思?
    希望再帮忙想想,不甚感谢!
      

  3.   

    可不可以用事务的方式呢.用一个循环.
    WHILE 没有按CANCER
     THEN 继续你的存储过程
    ELSE
      XXX
      

  4.   

    查了半天,TADOQUERY找不到中止功能,查SQL SERVER 2000帮助,找到个KILL线程,但不知怎么用,更不知能不能解决我这个问题
    HELP...
      

  5.   

    可以用这个杀死这个数据库上的进程:
    select  spid  from  MASTER..sysprocesses where dbid=db_id('YDSQ')
    如果结果大于0则有进程连到YDSQ
    kill 这个spid(smallint类型的),也就是把数据库终止了.
      

  6.   

    如果这样,是不是整个连接都断了
    还有没有更好的办法,最好是保持连接,只是中止指定的TADOQUERY
    不管怎样,先谢了
      

  7.   

    just right here waiting....
      

  8.   

    楼主不是用的SQL 中的存储过程么.那你就先在SQL中建立一个临时表.里边只要一个字段并且高为Not NULL .然后在你的存储过程中想办法让它执行一个Insert null 语句.也就是说给它一个空值.这样程序执行到这儿时肯定就会出错.你的存储过程就中止了.而Insert null 语句就放在你的界面上的中止按钮上.在定存储过程时先把Insert null 高为正常值也就是说可以正常执行的语句(非NULL值).
     楼主可以试试.
      

  9.   

    OH. 好像错了.插入NULL 值是一个非致命错误.存储过程不会中止.应该这样定一个语句:
      select * from AnotExitTable 
    也就是说查询一个不存在的表.这样就是一个致命错误,存储过程肯定会中止.
      

  10.   

    特别感谢GoldShield(金盾),可我还是想不出怎么可能实现
    例如我的存储过程中只有一个查询语句:
    BEGIN
      SELECT A.FIELD1,A.FIELD2,B.FIELD2,C.FIELD2
      INTO TABLE3
      FROM DB2.dbo.TABLE1 A
      LEFT JOIN DB2.dbo.TABLE2 B
      ON A.FIELD1=B.FIELD1
      LEFT JOIN DB2.dbo.TABLE3 C
      ON A.FIELD1=C.FIELD1
    END
    当数据量较大时,执行时间就很长,所以需要有中止功能。
    按照你说的做法,只能在另外一个存储过程让它出错退出,但这样能让上面的存储过程退出吗?如果真能退出,可能该连接全部都会断开,也不是我想要的。
    麻烦再想想...
    其他高手们举举手吧...
      

  11.   

    那你就从优化查询着手吧.
    按A.FIELD1,A.FIELD2,B.FIELD2,C.FIELD2 这几个字段排序.
      

  12.   

    复 GoldShield(金盾) 
    非常感谢您的热情帮助!
    排序只是优化查询,提高效率,但有时候总是有限的。
    而现在我的实际情况是源表数据库不是我们的数据库,而是第三方数据库,不是我能控制得了的。
    又说回来,就算是我能控制得了的,也有数据量超大,而用户不想等待的时候。
    总之,这中止查询或者中止存储过程的执行都是较必要的。
      

  13.   

    据我所知好像可以通过回滚事务来对你的存储过程里面的事务进行回滚!
    就是说你的存储过程必须使用某个事务!在末尾处没有对事务究竟是回滚还是提交事务的代码!而在程序里面用按钮点击的时候用连接控件执行T-SQL语句进行回滚或者提交事务!
      

  14.   

    复:hanker9608(xiong)
    程序中断开数据库的连接不是我想要的,因为该连接还有其它地方要用,如果断开,其它地方还要重新连接,有可能出现意想不到的问题。
    昨天我试了断开该控件的连接,但会出错,而且存储过程也没有中断。
    我还是没什么办法解决这个问题。
    ...