SqlDataAdapter와 함께 사용하면 DataTable RowChanged 이벤트를 처리하고 예외를 throw하거나 InvalidOperationException을 throw하는 데이터 어댑터의 연결을 닫을 수 있습니다.
다음 예제 (
source)에서 살펴 보자 :
private BackgroundWorker worker;
private DataTable table;
private void button2_Click(object sender, EventArgs e)
{
if (worker != null)
{
worker.CancelAsync();
}
}
private void button1_Click(object sender, EventArgs e)
{
this.worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(this.table.Rows.Count.ToString());
}
[System.Diagnostics.DebuggerStepThrough]
void worker_DoWork(object sender, DoWorkEventArgs e)
{
this.table = new DataTable();
using (SqlConnection connection= new SqlConnection())
using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM table", connection))
{
table.RowChanged += new DataRowChangeEventHandler(table_RowChanged);
da.Fill(table);
}
}
[System.Diagnostics.DebuggerStepThrough]
void table_RowChanged(object sender, DataRowChangeEventArgs e)
{
if (worker.CancellationPending)
{
throw new ApplicationException("Canceled"); // throw a spanner in the works
}
Thread.Sleep(5); // Just slow things down for testing
}
는 수천 개의 행을 채우기 위해 밀리 초 걸립니다. 이보다 조건을 쿼리 자체에 넣을 수 있습니다. –
@DheerajRoy 설명 할 수 있습니까? 나는 메타 데이터를 포함한 모든 것을 반환하는 데 오랜 시간이 걸리는 쿼리를 가지고있다. "조건을 쿼리에 넣는"방법은 무엇입니까? – CoderBrien
SqlDataAdapter를 통해 DataTable RowChanged를 조사해야한다고 생각합니다. –