Tôi đang thấy nhiều mẩu tin khác nhau của câu trả lời đúng ở đây, nhưng hãy để tôi tập hợp tất cả lại với nhau và giải thích một vài điều.
Trước hết, AcceptChanges
chỉ nên được sử dụng để đánh dấu toàn bộ giao dịch trên bảng là đã được xác thực và cam kết. Điều đó có nghĩa là nếu bạn đang sử dụng DataTable làm Nguồn dữ liệu để liên kết, ví dụ: máy chủ SQL, thì việc gọi AcceptChanges
theo cách thủ công sẽ đảm bảo rằng các thay đổi không bao giờ được lưu vào máy chủ SQL .
Điều làm cho vấn đề này trở nên khó hiểu hơn là thực sự có hai trường hợp trong đó ngoại lệ được ném ra và chúng ta phải ngăn chặn cả hai trường hợp đó.
1. Sửa đổi Bộ sưu tập của IEnumerable
Chúng tôi không thể thêm hoặc xóa một chỉ mục vào tập hợp đang được liệt kê vì làm như vậy có thể ảnh hưởng đến việc lập chỉ mục nội bộ của điều tra viên. Có hai cách để giải quyết vấn đề này: hoặc lập chỉ mục của riêng bạn trong vòng lặp for, hoặc sử dụng một tập hợp riêng biệt (không được sửa đổi) cho việc liệt kê.
2. Cố gắng đọc một mục đã xóa
Vì Bảng dữ liệu là bộ sưu tập giao dịch , các mục nhập có thể được đánh dấu để xóa nhưng vẫn xuất hiện trong bảng liệt kê. Có nghĩa là nếu bạn yêu cầu một mục đã xóa cho cột "name"
thì nó sẽ ném ra một ngoại lệ. Có nghĩa là chúng ta phải kiểm tra xem liệu dr.RowState != DataRowState.Deleted
trước khi truy vấn một cột.
Để tất cả chúng cùng nhau
Chúng tôi có thể lộn xộn và thực hiện tất cả những việc đó theo cách thủ công hoặc chúng tôi có thể để DataTable thực hiện tất cả công việc cho chúng tôi và làm cho câu lệnh trông giống như một lệnh gọi SQL bằng cách thực hiện như sau:
string name = "Joe";
foreach(DataRow dr in dtPerson.Select($"name='{name}'"))
dr.Delete();
Bằng cách gọi Select
hàm của DataTable , truy vấn của chúng tôi sẽ tự động tránh các mục nhập đã bị xóa trong DataTable. Và vì Select
hàm trả về một mảng so khớp, nên tập hợp chúng ta đang liệt kê sẽ không bị sửa đổi khi chúng ta gọi dr.Delete()
. Tôi cũng đã thêm gia vị cho biểu thức Chọn với nội suy chuỗi để cho phép lựa chọn biến mà không làm cho mã bị nhiễu.
[ii]
thành[i]
, tuy nhiên :-)