Câu trả lời:
Mặt khác, nó:
Với chi phí:
Vì vậy, thực sự nó phụ thuộc vào những gì bạn đang làm, nhưng tôi có xu hướng thích DataReader cho đến khi tôi cần thứ gì đó chỉ được hỗ trợ bởi một bộ dữ liệu. SqlDataReader là hoàn hảo cho trường hợp truy cập dữ liệu phổ biến liên kết với lưới chỉ đọc.
Để biết thêm thông tin, xem tài liệu chính thức của Microsoft .
while (reader.Read())vòng lặp của bạn .
Câu trả lời cho điều đó có thể khá rộng.
Về cơ bản, sự khác biệt lớn đối với tôi thường ảnh hưởng đến quyết định sử dụng của tôi là với SQLDataReader, bạn đang "truyền phát" dữ liệu từ cơ sở dữ liệu. Với SQLDataAd CHƯƠNG, bạn đang trích xuất dữ liệu từ cơ sở dữ liệu vào một đối tượng có thể tự truy vấn thêm, cũng như thực hiện các thao tác CRUD trên.
Rõ ràng với một luồng dữ liệu SQLDataReader nhanh hơn NHIỀU, nhưng bạn chỉ có thể xử lý một bản ghi tại một thời điểm. Với SQLDataAd CHƯƠNG, bạn có một bộ sưu tập đầy đủ các hàng khớp với truy vấn của bạn từ cơ sở dữ liệu để làm việc với / chuyển qua mã của bạn.
CẢNH BÁO: Nếu bạn đang sử dụng SQLDataReader, LUÔN LUÔN, LUÔN LUÔN, LUÔN LUÔN đảm bảo rằng bạn viết mã phù hợp để đóng kết nối vì bạn đang giữ kết nối mở với SQLDataReader. Không làm điều này hoặc xử lý lỗi thích hợp để đóng kết nối trong trường hợp xảy ra lỗi khi xử lý kết quả sẽ CRIPPLE ứng dụng của bạn bị rò rỉ kết nối.
Xin lỗi VB của tôi, nhưng đây là số lượng mã tối thiểu bạn nên có khi sử dụng SqlDataReader:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
tương đương C #:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
Một SqlDataAd CHƯƠNG thường được sử dụng để điền vào Dataset hoặc DataTable và do đó bạn sẽ có quyền truy cập vào dữ liệu sau khi kết nối của bạn bị đóng (truy cập bị ngắt kết nối).
SqlDataReader là một con trỏ chỉ được kết nối và chuyển tiếp nhanh, thường có xu hướng nhanh hơn so với việc điền vào một Dataset / DataTable.
Hơn nữa, với SqlDataReader, bạn xử lý từng bản ghi dữ liệu của mình và không giữ bất kỳ dữ liệu nào trong bộ nhớ. Rõ ràng với DataTable hoặc Dataset, bạn có chi phí cấp phát bộ nhớ.
Nếu bạn không cần giữ dữ liệu của mình trong bộ nhớ, vì vậy chỉ để hiển thị nội dung, hãy truy cập SqlDataReader. Nếu bạn muốn xử lý dữ liệu của mình theo cách bị ngắt kết nối, hãy chọn DataAd CHƯƠNG để điền vào một Data set hoặc DataTable.
Sử dụng một SqlDataAd CHƯƠNG khi muốn điền một Data set / DataTable trong bộ nhớ từ cơ sở dữ liệu. Sau đó, bạn có thể linh hoạt đóng / tắt kết nối, chuyển dữ liệu / thiết lập xung quanh trong bộ nhớ. Sau đó, bạn có thể thao tác dữ liệu và lưu lại dữ liệu đó vào DB bằng bộ điều hợp dữ liệu, kết hợp với insertCommand / UpdateCommand.
Sử dụng SqlDataReader khi muốn truy cập dữ liệu dấu chân nhanh, bộ nhớ thấp mà không cần linh hoạt, ví dụ như truyền dữ liệu xung quanh logic nghiệp vụ của bạn. Điều này tối ưu hơn cho việc truy xuất nhanh, sử dụng bộ nhớ thấp với khối lượng dữ liệu lớn vì nó không tải tất cả dữ liệu vào bộ nhớ trong một lần - với cách tiếp cận SqlDataAd CHƯƠNG, Data set / DataTable sẽ được lấp đầy với tất cả dữ liệu vì vậy nếu có rất nhiều hàng và cột, sẽ cần rất nhiều bộ nhớ để giữ.
Hàm Fill sử dụng DataReader trong nội bộ. Nếu sự cân nhắc của bạn là "Cái nào hiệu quả hơn?", Thì việc sử dụng DataReader trong một vòng lặp chặt chẽ sẽ tạo ra một bản ghi bộ sưu tập, có khả năng sẽ tải cùng hệ thống với việc sử dụng DataAd CHƯƠNG.Fill.
(System.Data.dll, System.Data.Common.DbDataAd CHƯƠNG, FillI Internalal.)