2009-07-04 42 views
47

Tôi chỉ thấy chủ đề này: Datatable vs Dataset nhưng nó không giải quyết được sự nghi ngờ của tôi .. Hãy để tôi giải thích rõ hơn, tôi đã kết nối với cơ sở dữ liệu và cần hiển thị kết quả trong GridView. (Tôi đã sử dụng RecordSet khi tôi làm việc với VB6 trong khi trước đây và DataSet là khá giống với nó để dễ dàng hơn để sử dụng DataSet.) Sau đó, một chàng trai nói với tôi DataSet không phải là phương pháp tốt nhất để làm ..Điều gì tốt hơn: DataSet hoặc DataReader?

Vì vậy, sao tôi nên 'học' DataReader hoặc tiếp tục sử dụng DataSet? Bảng dữ liệu ? Ưu/nhược điểm là gì?

Trả lời

67

Tùy theo nhu cầu của bạn. Một trong những điểm khác biệt quan trọng nhất là một DataReader sẽ giữ lại một kết nối mở với cơ sở dữ liệu của bạn cho đến khi bạn hoàn thành nó trong khi một DataSet sẽ là một đối tượng trong bộ nhớ. Nếu bạn liên kết một điều khiển với một DataReader thì nó vẫn mở. Ngoài ra, một DataReader là một cách tiếp cận duy nhất về phía trước để đọc dữ liệu mà không thể thao tác được. Với một DataSet bạn có thể di chuyển qua lại và thao tác dữ liệu như bạn thấy phù hợp.

Một số tính năng bổ sung: DataSets có thể được tuần tự hóa và được thể hiện bằng XML và do đó, dễ dàng chuyển qua các cấp khác. DataReaders không thể được tuần tự hóa. Mặt khác, nếu bạn có một số lượng lớn hàng để đọc từ cơ sở dữ liệu mà bạn chuyển sang một số quy trình cho quy tắc kinh doanh, thì DataReader có thể có ý nghĩa hơn là tải một Tập dữ liệu với tất cả các hàng, chiếm dụng bộ nhớ và có thể ảnh hưởng đến khả năng mở rộng.

Đây là liên kết có ít ngày nhưng vẫn hữu ích: Contrasting the ADO.NET DataReader and DataSet.

+0

Liên kết bị hỏng. Vui lòng sửa hoặc xóa nó. –

4

Các nhu cầu khác nhau, các giải pháp khác nhau.

Như bạn đã nói, tập dữ liệu gần giống nhất với VB6 Recordset. Tức là, kéo xuống dữ liệu bạn cần, vượt qua nó xung quanh, làm với nó những gì bạn sẽ. Oh, và sau đó cuối cùng thoát khỏi nó khi bạn đang thực hiện.

Datareader bị hạn chế hơn, nhưng nó mang lại hiệu suất tốt hơn cho MUCH khi tất cả những gì bạn cần là đọc qua dữ liệu một lần. Ví dụ: nếu bạn đang tự điền vào lưới - tức là kéo dữ liệu, hãy chạy qua nó, cho mỗi hàng điền vào lưới, sau đó vứt dữ liệu - trình quản lý dữ liệu tốt hơn nhiều so với tập dữ liệu. Mặt khác, thậm chí không thử sử dụng bộ dữ liệu nếu bạn có ý định cập nhật dữ liệu ...

Vì vậy, có, hãy tìm hiểu - nhưng chỉ sử dụng khi thích hợp. Dataset cung cấp cho bạn sự linh hoạt hơn nhiều.

+0

Cảm ơn AviD và Ahmad Mageed cho những câu trả lời nhanh .. Sẽ làm cho tôi suy nghĩ (n 'tìm hiểu) rất nhiều về nó! :) – Daniel

0

Để trả lời câu hỏi thứ hai của bạn - Có, bạn nên tìm hiểu về DataReaders. Nếu có gì, bạn hiểu cách sử dụng chúng.

Tôi nghĩ rằng bạn tốt hơn trong tình huống này bằng cách sử dụng DataSets - vì bạn đang thực hiện ràng buộc dữ liệu và tất cả (tôi đang nghĩ về chu kỳ CPU so với nỗ lực của con người).

Vì cái nào sẽ mang lại hiệu suất tốt hơn. Nó phụ thuộc rất nhiều vào hoàn cảnh của bạn. Ví dụ: nếu bạn đang chỉnh sửa dữ liệu bạn đang ràng buộc và theo dõi các thay đổi thì bạn sẽ tốt hơn với DataSets

187

Về cơ bản: "tốt hơn: thùng hoặc vòi?"

A DataSet là nhóm ở đây; nó cho phép bạn mang theo một bộ dữ liệu bị ngắt kết nối và làm việc với nó - nhưng bạn sẽ phải chịu chi phí mang thùng (tốt nhất là giữ nó theo kích thước bạn cảm thấy thoải mái).

Trình đọc dữ liệu là ống: nó cung cấp quyền truy cập một chiều/chỉ một lần vào dữ liệu khi nó bay qua bạn; bạn không cần phải mang theo tất cả các nước có sẵn cùng một lúc, nhưng nó cần phải được kết nối với vòi/cơ sở dữ liệu.

Và giống như cách bạn có thể đổ đầy xô bằng vòi, bạn có thể điền vào DataSet bằng trình đọc dữ liệu.

Điểm Tôi đang cố gắng để làm là họ làm những việc khác nhau ...

Cá nhân tôi không sử dụng DataSet rất thường xuyên - nhưng một số người yêu mến họ. Tuy nhiên, tôi sử dụng trình đọc dữ liệu để truy cập BLOB, v.v.

+46

Đẹp tương tự ở đó. – cjk

+0

@Marc, Tương tự tốt. Khi bạn không làm việc với BLOB, bạn sử dụng loại truy cập dữ liệu nào? – Ash

+1

@Ash - Nói chung LINQ-to-SQL, 'SqlBulkCopy' hoặc' IDataReader'. * rất * hiếm khi, 'DataTable'. Khoảng hai lần (bao giờ) trong thực tế. –

12

Hơn nữa để Marc's điểm: bạn có thể sử dụng Tập dữ liệu không có cơ sở dữ liệu nào cả.

Bạn có thể điền từ tệp XML hoặc chỉ từ một chương trình. Điền nó với các hàng từ một cơ sở dữ liệu, sau đó quay lại và viết nó ra một cơ sở dữ liệu khác.

Số liệu là một biểu diễn hoàn toàn trong bộ nhớ của một lược đồ quan hệ. Có hay không bạn đã từng sử dụng nó với một cơ sở dữ liệu quan hệ thực sự tùy thuộc vào bạn.

+4

Chỉ cần cho bản ghi, điều này cũng đúng với người đọc dữ liệu - xem "CsvReader", "DataTableReader" vv Và để đẩy nó trở lại cơ sở dữ liệu, SqlBulkCopy (ví dụ) sẽ làm việc với DataTable hoặc IDataReader. –

0

DataReader

DataReader được sử dụng để đọc dữ liệu từ cơ sở dữ liệu và nó là một đọc và chuyển tiếp chỉ kiến ​​trúc hướng kết nối trong khi tải dữ liệu từ cơ sở dữ liệu. DataReader sẽ tìm nạp dữ liệu rất nhanh khi so sánh với tập dữ liệu. Nói chung chúng ta sẽ sử dụng đối tượng ExecuteReader để liên kết dữ liệu với bộ dữ liệu.

Để ràng buộc dữ liệu DataReader để GridView chúng ta cần phải viết mã như như hình dưới đây:

using(SqlConnection conn = new SqlConnection("Data Source=abc;Integrated Security=true;Initial Catalog=Test")) { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("Select UserName, First Name,LastName,Location FROM Users", conn); 
      SqlDataReader sdr = cmd.ExecuteReader(); 
      gvUserInfo.DataSource = sdr; 
      gvUserInfo.DataBind(); 
      conn.Close(); 

DataSet

DataSet là một kiến ​​trúc định hướng bị ngắt kết nối đó có nghĩa là không có nhu cầu các kết nối hoạt động trong khi làm việc với các tập dữ liệu và nó là một tập hợp các DataTables và các mối quan hệ giữa các bảng. Nó được sử dụng để giữ nhiều bảng với dữ liệu. Bạn có thể chọn các bảng biểu mẫu dữ liệu, tạo các khung nhìn dựa trên bảng và hỏi các hàng con trên các quan hệ. Ngoài ra, DataSet cung cấp cho bạn các tính năng phong phú như lưu dữ liệu dưới dạng XML và tải dữ liệu XML.

SqlConnection conn = new SqlConnection("Data Source=abc;Integrated Security=true;Initial Catalog=Test"); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("Select UserName, First Name,LastName,Location FROM Users", conn); 
    SqlDataAdapter sda = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    gvUserInfo.DataSource = ds; 
    gvUserInfo.DataBind(); 
Các vấn đề liên quan