当前位置:编程学习 > C#/ASP.NET >>

C# 中如何立即停止SQL 语句的执行

我在C#的后台线程中执行一个Sql语句,此语句需要很长一段时间才能有结果(数据库巨大),那么在这段时间内如果要立即停止执行程序里该怎么做???

我虽然可以把这个线程abort终止,但却发现SQL语句继续执行,需要很长一段时间才能真正停止。
请教大家:如何立即停止SQL语句的执行??

问题补充:
如何cancel 或者kill 一个查询数据库的线程(Thread)? 我的现状: 要从数据库中查询数据.界面上有 run 和 cancel按钮. click the run button, It will send a SQL query to the databASE to get data. 如果时间太长,user 可以按cancel按钮,取消查询. 问题出在cancel功能上,就是怎么能杀死或者取消这个查询thread? 我的实验结果: 1. 用backgroundworker的话,由于这不是循环或者迭代操作,因此无法检查cancel属性,导致不能取消查询操作; 2. 在run 按钮的脚本里建立新的单独的线程的话, 点击run后,无法点击cancel 按钮. 3. command.cancel()方法也试过了, 不起作用. 看网上有人说不好使. 请问如何解决无法点击的问题? 如何取消这个查询的thread? 或者上面的思路不对,哪位大虾有好的方法? 已经拖了好长时间了, 不能再拖了. 多些各位 --------------------编程问答-------------------- 大虾们,速度围观。 --------------------编程问答-------------------- 只能帮顶 没弄过这个. --------------------编程问答-------------------- ado.net有个transfer类,百度下事务,可以利用里面的回滚方法达到你的要求 --------------------编程问答-------------------- 速度拔电源!! --------------------编程问答--------------------
引用 3 楼 strife 的回复:
ado.net有个transfer类,百度下事务,可以利用里面的回滚方法达到你的要求


我用的系统不是B/S结构的,不是对网页处理的。

是C/S结构的。你说的这个方法行不通。

不知道DB2有没有什么接口,可以让我停止查询操作。 --------------------编程问答-------------------- 用timer控制,执行方法前初始化为0,超过一定时间自定义执行别的操作。 --------------------编程问答--------------------
引用 5 楼 dlijian 的回复:
引用 3 楼 strife 的回复:ado.net有个transfer类,百度下事务,可以利用里面的回滚方法达到你的要求

我用的系统不是B/S结构的,不是对网页处理的。

是C/S结构的。你说的这个方法行不通。

不知道DB2有没有什么接口,可以让我停止查询操作。

真悲哀,B/S,C/S跟你提的这个数据库问题没有一点点关系。
真是难为你了。 --------------------编程问答-------------------- 没人来解决,还得靠自己了。
想想别的办法 --------------------编程问答-------------------- 重启数据库。
程序是没办法停止的。。。
你用命令重启数据库吧。 --------------------编程问答-------------------- 发令枪响了。人跑了。。。他不跑完或者受伤。或者别人告诉他要停下来。貌似自己不会停。。。
这数据库类似这个吧。 --------------------编程问答--------------------
引用 5 楼 dlijian 的回复:
引用 3 楼 strife 的回复:ado.net有个transfer类,百度下事务,可以利用里面的回滚方法达到你的要求

我用的系统不是B/S结构的,不是对网页处理的。

是C/S结构的。你说的这个方法行不通。

不知道DB2有没有什么接口,可以让我停止查询操作。

ado.net有b/s  c/s之分么?
http://bbs.csdn.net/topics/350102707 --------------------编程问答-------------------- 这个有难度。

引用 10 楼 lye2000000_super 的回复:
发令枪响了。人跑了。。。他不跑完或者受伤。或者别人告诉他要停下来。貌似自己不会停。。。
这数据库类似这个吧。
--------------------编程问答-------------------- 你的这个问题很奇怪了:“我虽然可以把这个线程abort终止,但却发现SQL语句继续执行,需要很长一段时间才能真正停止。”
线程被终止了,怎么可能还会执行SQL语句?
另外你又问:“问题出在cancel功能上,就是怎么能杀死或者取消这个查询thread?”
前面说了终止线程没有用,为啥又要杀死或取消这个thread? --------------------编程问答--------------------
引用 4 楼 mabaolin 的回复:
速度拔电源!!
  +1 --------------------编程问答--------------------
引用 9 楼 lye2000000_super 的回复:
重启数据库。
程序是没办法停止的。。。
你用命令重启数据库吧。


用命令重启数据库这种情况行不通,
我这个机能只是系统中的一部分,我只需要对我这部分机能的查询进行中止,不能影响全局对数据的访问。
--------------------编程问答-------------------- 即然你在.NET里已经发出了执行命令,当这个SQL事任还没有结束前,你是没法在.NET里对再发出命令叫停的。发了执行命令后这个事任就属性数据库管理的范围了,你要停就只有直接操作数据库,比如停止数据库服务。。 --------------------编程问答--------------------
引用 14 楼 yyaccp1227 的回复:
引用 4 楼 mabaolin 的回复:速度拔电源!!  +1


最直接,效率最高 --------------------编程问答-------------------- mss倒是有个停止按钮,具体怎么实现的不知道 --------------------编程问答--------------------  用timer控制 是否可以? 围观。~~~ --------------------编程问答-------------------- 能设置数据库 操作的超时时间吗? --------------------编程问答-------------------- 这是个好问题。

sqlserver 企业管理器为什么可以停止 sql 语句的执行?

它是怎么做到的?

望大牛解释 --------------------编程问答-------------------- 使用标识量可以有的之前我写过一个Demo

      //取消
        private void btnreset_Click(object sender, EventArgs e)
        {
            ReadCardSign = false;
        }
        //查询
        private void btnselect_Click(object sender, EventArgs e)
        {
            Count = 0;
            ReadCardSign = true;
            textbox = this.textBox1;
            listbox = this.listBox1;
            label = label2;
            Thread thread = new Thread(Start);
            thread.IsBackground = true;
            thread.Start();
        }
        public static bool ReadCardSign
        {
            get
            {
                return readCardSign;
            }
            set
            {
                readCardSign = value;
            }
        }
        

        private static void Start()
        {
            string Connstr = "Data Source=.;database=xxx;uid=sa;pwd=xxx;";
            string Sql =textbox.Text;
            dbBase.DBFactory factory = new DBFactory(Connstr, DbProviderType.SqlServer);
            DataTable dt = new DataTable();
            IDataReader dr = factory.ExecuteDataReder(Sql, null);
            List<string> list=new List<string>();
            Label lbl=new Label();
            ListBox lbx = new ListBox();
            while (dr.Read())
            {
                if (ReadCardSign)
                {
                    list.Add(dr[0].ToString());
                    Count++;
                    lbl.Text = Count.ToString();
                    IsInvoke(label, lbl);
                }
                else
                {
                    break;
                }
            }
            lbx.DataSource = list;
            IsInvoke(listbox, lbx);
        }
--------------------编程问答-------------------- 貌似 C# 里面没有直接停止某一个sql 语句执行的方法吧。

只能在 sql server 里面用命令 停止 某一个sql 语句的执行。 --------------------编程问答-------------------- 这个真不知道,只能友情帮顶 --------------------编程问答-------------------- 这个是我之前的Demo,不知道对你是否有用
http://download.csdn.net/detail/xingchen1008/5099610 --------------------编程问答-------------------- SqlCommand.Cancel方法,应该可以达到你的目的 --------------------编程问答-------------------- 有个东西叫SQL Profiler... ...

引用 21 楼 huwei001982 的回复:
这是个好问题。

sqlserver 企业管理器为什么可以停止 sql 语句的执行?

它是怎么做到的?

望大牛解释
--------------------编程问答-------------------- --------------------编程问答-------------------- 如果是“一个SQL语句”,那么发到数据库就是数据库操作的事了,客户端已经没有办法改变(楼主研究下“事务”,这是唯一可行的办法,和B/S,C/S没关系!)
如果是多个语句逐个执行(发往数据库),那么可以在每个语句之间检查是否有取消命令(比如全局变量、信号量、事件等),决定是否中止。 --------------------编程问答-------------------- 速拔电源 --------------------编程问答--------------------
引用 21 楼 huwei001982 的回复:
这是个好问题。

sqlserver 企业管理器为什么可以停止 sql 语句的执行?

它是怎么做到的?

望大牛解释

使用sqlserver企业管理器的时候怎么操作才能停? --------------------编程问答-------------------- 24樓和26樓回復的比較靠譜。
24樓是單個功能的循環運行終止。
26樓是Sql語句長時間執行後的終止,我沒有驗證。不知是否是樓主要的效果。 --------------------编程问答-------------------- 看看能不能掉用db2的Cancel方法。 --------------------编程问答-------------------- fghf --------------------编程问答-------------------- 还不如想想如何优化那个sql语句呢。你终止执行可以找到替代的这个语句的方法?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,