Как выполнить SQL-запрос к операции DataTable, которую можно отменить

Я постарался сделать название как можно более конкретным. По сути, то, что я сейчас запускаю внутри потока backgroundworker, представляет собой некоторый код, который выглядит как:

 SqlConnection conn = new SqlConnection(connstring);
                    SqlCommand cmd = new SqlCommand(query, conn);
                    conn.Open();
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    sda.Fill(Results);
                    conn.Close();
                    sda.Dispose();

Где query — это строка, представляющая большой, трудоемкий запрос, а conn — объект соединения.

Моя проблема сейчас в том, что мне нужна кнопка остановки. Я пришел к выводу, что убивать фонового работника было бы бесполезно, потому что я все еще хочу сохранить результаты, оставшиеся после отмены запроса. Кроме того, он не сможет проверить состояние отмены до тех пор, пока не будет выполнен запрос.

Что я придумал на данный момент:

Я пытался осмыслить, как эффективно справиться с этим, не слишком сильно снижая производительность.

Моя идея состояла в том, чтобы использовать SqlDataReader для чтения данных из части запроса за раз, чтобы у меня был «цикл» для проверки флага, который я мог установить из графического интерфейса с помощью кнопки. Насколько я знаю, проблема в том, что я не могу использовать метод Load ()для таблицы данных и при этом иметь возможность отменить команду sql. Если я ошибаюсь, пожалуйста, дайте мне знать, потому что это облегчит отмену.

В свете того, что я обнаружил, я пришел к выводу, что смогу отменить запрос sqlcommand mid -только в том случае, если сделаю что-то вроде приведенного ниже кода (псевдо -):

while(reader.Read())
{
 //check flag status
 //if it is set to 'kill' fire off the kill thread

 //otherwise populate the datatable with what was read
}

Однако мне кажется, что это было бы крайне неэффективно и, возможно, дорого. Это единственный способ убить выполняемую команду sql, которая абсолютно необходима в таблице данных? Любая помощь будет оценена по достоинству!

10
задан David W 28 June 2012 в 07:07
поделиться