Tôi đã cố gắng làm tiêu đề càng cụ thể càng tốt. Về cơ bản những gì tôi đã chạy bên trong một chủ đề nền bây giờ là một số mã trông giống như:Cách thực hiện truy vấn SQL đối với hoạt động DataTable có thể bị hủy
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();
Trường hợp truy vấn là một chuỗi đại diện cho truy vấn tốn thời gian và conn là đối tượng kết nối.
Vấn đề của tôi bây giờ là tôi cần nút dừng. Tôi đã nhận ra rằng việc giết người làm nền sẽ vô giá trị vì tôi vẫn muốn giữ kết quả còn lại sau khi truy vấn bị hủy bỏ. Thêm vào đó, nó sẽ không thể kiểm tra trạng thái bị hủy cho đến sau truy vấn.
Những gì tôi đã đi lên với cho đến nay:
Tôi đã cố gắng để khái niệm làm thế nào để xử lý việc này một cách hiệu quả mà không cần dùng quá lớn của một hit hiệu suất.
Ý tưởng của tôi là sử dụng SqlDataReader để đọc dữ liệu từ mảnh truy vấn tại một thời điểm để tôi có "vòng lặp" để kiểm tra cờ tôi có thể đặt từ GUI qua nút. Vấn đề là xa như tôi biết tôi không thể sử dụng phương thức Load() của một datatable và vẫn có thể hủy bỏ sqlcommand. Nếu tôi sai, xin vui lòng cho tôi biết vì điều đó sẽ làm cho việc hủy bỏ dễ dàng hơn một chút.
Trong ánh sáng của những gì tôi phát hiện ra tôi đến việc thực hiện tôi chỉ có thể hủy bỏ giữa truy vấn SqlCommand nếu tôi đã làm một cái gì đó giống như dưới đây (pseudo-code):
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
}
Tuy nhiên, nó dường như với tôi điều này sẽ rất hiệu quả và có thể tốn kém. Đây có phải là cách duy nhất để giết một sqlcommand trong tiến trình mà hoàn toàn cần phải được trong một datatable? Bất kỳ trợ giúp sẽ được đánh giá cao!
một câu hỏi rất phong nha! – Adi
Giết chủ đề không bao giờ là một ý tưởng hay. Bạn đã thử 'cmd.Cancel();'? –
Tại sao bạn nghĩ sử dụng DataReader sẽ tốn kém? – Habib