正在使用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");
}
cancelQuery变量在填充数据表之后,在退出函数之前设置为true。因此,没有什么可以取消的,因为在执行命令并从读取器读取数据之后,数据表已经被填充。