Thậm chí nếu bạn có thể kế thừa từ SqlDataReader nó sẽ không quan trọng anyway bởi vì bạn không thể làm cho SqlCommand tạo một thể hiện của lớp dẫn xuất của bạn.
Triển khai IDataReader trong trình bao bọc thực sự không khó chút nào khi bạn chỉ trì hoãn SqlDataReader cơ bản. Đó chỉ là một chút thời gian nhưng không phải là xấu.
Nhưng tôi tò mò, là tài nguyên bạn muốn xử lý kết nối? Nếu vậy có một thành viên CloseConnection của CommandBehavior enum đảm bảo kết nối sẽ bị đóng khi trình đọc dữ liệu bị đóng.
var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
...
reader.Close(); // also closes connection
Lưu ý rằng Đóng/Xử lý giống nhau trên SqlDataReader.
Cuối cùng, đây là một đề xuất cuối cùng đã phục vụ tôi tốt trong quá khứ. Lưu ý rằng trong ví dụ lỏng lẻo sau đây, bạn sở hữu SqlDataReader từ đầu đến cuối ngay cả khi bạn "đang sinh" trở lại người gọi tại mỗi bản ghi.
private static IEnumerable<IDataRecord> GetResults(this SqlCommand command) {
using (var myTicket = new MyTicket())
using (var reader = command.ExecuteReader()) {
while (reader.Read()) {
yield return reader;
}
}
// the two resources in the using blocks above will be
// disposed when the foreach loop below exits
}
...
foreach (var record in myCommand.GetResults()) {
Console.WriteLine(record.GetString(0));
}
// when the foreach loop above completes, the compiler-generated
// iterator is disposed, allowing the using blocks inside the
// above method to clean up the reader/myTicket objects
Ý của bạn là gì không thể kế thừa? Nó là một lớp niêm phong? Bạn sẽ xây dựng trên các giao diện? Bạn không phải thực hiện chúng? Ngoài ra, tại sao bạn không muốn? –
SqlDataReader không được niêm phong vì vậy nó có thể kế thừa, nhưng các nhà xây dựng của nó là riêng tư, do đó bạn không thể đáp ứng được hàm tạo cơ sở khi bạn kế thừa từ nó - tôi chỉ cần nitpicking chi tiết nhưng bạn vẫn đúng. –
Ngoài nhận xét của tôi về câu trả lời của silky, tôi không thể không tự hỏi ... những gì bạn có thể cần phải đóng gói với một 'SqlDataReader'? Tôi thực sự hy vọng nó không phải là một 'SqlCommand' hoặc' SqlConnection' ... – Aaronaught