我正在尝试使用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");
}
答案 0 :(得分:0)
cancelQuery变量设置为true,并且在退出函数之前紧密地设置。因此,在执行命令并从读取器读取数据后,已经无法取消数据表。