正在使用SqlCommand.Cancel取消查询

本文关键字:Cancel 取消 查询 SqlCommand | 更新日期: 2023-09-27 18:19:28

我正在尝试创建一种方法,通过使用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");
    }

正在使用SqlCommand.Cancel取消查询

cancelQuery变量在填充数据表之后,在退出函数之前设置为true。因此,没有什么可以取消的,因为在执行命令并从读取器读取数据之后,数据表已经被填充。