使用SqlCommand.Cancel取消查询

时间:2015-10-28 03:36:29

标签: c# sql sql-server database

我正在尝试使用SqlCommand.Cancel创建一种取消对SQL Server数据库(使用ADO.net)的查询的方法。正如在SqlCommand.Cancel上的其他文章中所解释的那样,我运行一个线程来管理SqlCommand的取消。每当我想触发取消时,我都会将cancelQuery变量设置为true,但每当我触发查询取消时,都不会发生任何事情(也不会抛出异常)并继续查询。

我在这里做错了什么吗?

    public void FillDataSet(string statement, string name, DataSet d)
    {
        trackFillThread = new Thread(() => CancelQuery());
        trackFillThread.Start();
        trackFillThread.IsBackground = true;

        LoadData(statement, name, d);            
    }

    void LoadData(string statement, string name, DataSet d)
    {
        connectionString = string.Format("data source={0};initial catalog={1};uid={2};pwd={3};Connection Timeout=80", dataSource, catalog, uid, pwd);

        DataTable dt = new DataTable();
        dt.TableName = name;
        Debug.Log(name);

        using (SqlConnection oConn = new SqlConnection(connectionString))
        {
            oConn.Open();
            cmd = new SqlCommand(statement, oConn);
            cmd.CommandTimeout = 120;

            try
            {
                Debug.Log("Start Query");
                System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
                d.Tables.Add(dt);
                //cancelQuery = true;
            }
            catch //(System.Exception e)
            {
                Debug.Log("Load Data Exception");
                return;
            }
        } 
    }

    void CancelQuery()
    {
        while (true)
        {
            if (cancelQuery)
            {
                cancelQuery = false;

                if (cmd != null)
                {
                    Debug.Log("Cancel");
                    cmd.Cancel();
                }

                break;
            }
        }

        System.Data.SqlClient.SqlConnection.ClearAllPools();
        Debug.Log("CancelQuery Thread Ends");
    }

1 个答案:

答案 0 :(得分:0)

在填充数据表之后,

cancelQuery变量设置为true,并且在退出函数之前紧密地设置。因此,在执行命令并从读取器读取数据后,已经无法取消数据表。