Прерывание адаптации данных?

#.net #sql #vb.net #multithreading

#.net #sql #vb.net #многопоточность

Вопрос:

У меня возникает ситуация, когда я открываю диалоговое окно, содержащее сообщение «Пожалуйста, подождите», запускаю SQL-запрос, затем заменяю сообщение «Пожалуйста, подождите» на DataGridView, содержащий собранные результаты.

Код, который я использую для этого, в основном:

     Dim X As New Data.SqlClient.SqlCommand
    X.CommandText = "SELECT some_data FROM someTable"
    Dim XAdapter As New System.Data.SqlClient.SqlDataAdapter(X)
    Dim XSet As New DataSet
    XAdapter.Fill(XSet, "MyTable")

    Me.someDataGridView.DataSource = XSet.Tables("MyTable").DefaultView
  

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

На данный момент это диалоговое окно может принимать некоторую произвольную строку SQL и отображать результаты (используя SqlDataAdapter) без какого-либо дополнительного кода.

Как я могу сделать этот процесс прерываемым, сохраняя при этом простоту доступа к адаптеру SqlDataAdapter?

Ответ №1:

Как я могу сделать этот процесс прерываемым, сохраняя при этом простоту доступа к адаптеру SqlDataAdapter?

Согласно документации, вы должны иметь возможность вызывать Close базовый SqlConnection экземпляр. В документации говорится, что это приведет к завершению и откату любых ожидающих транзакций. Кроме того, вместо использования a SqlDataAdapter (который, к сожалению, не имеет асинхронных Fill методов), которые вы могли бы использовать SqlCommand.BeginExecuteReader , и как только это будет сделано, вы сможете заполнить a DataTable , вызвав перегрузку DataTable.Load , которая принимает IDataReader . Если вы хотите прервать ожидающую выполнения команду, просто вызовите Close .

Комментарии:

1. Не подумал о том, чтобы просто вызвать Close. Все компоненты транзакции являются локальными для метода. Спасибо за понимание.