2009-09-05 32 views
20

Tôi đã nghĩ rằng SQLDataReader sẽ không hoạt động nếu không có kết nối với SQLServer.DataReader hoạt động như thế nào?

Tôi đã thử nghiệm trường hợp này. Tôi thực hiện ExecuteReader sau đó dừng dịch vụ SQLServer và cố gắng lặp qua DataReader. Những gì tôi mong đợi là một ngoại lệ, nhưng nó đã cho kết quả sau cái kia. Lý tưởng nhất là DataReader nên đọc một hàng tại một thời điểm từ luồng được kết nối với máy chủ DB và nên ném một ngoại lệ nếu chúng ta ngắt kết nối máy chủ DB?

Tôi không biết, Tôi đang thiếu gì ở đây.

+3

Thử nghiệm tốt! – smwikipedia

Trả lời

25

Tôi nghi ngờ mạnh mẽ rằng người đọc đọc một loạt kết quả tại một thời điểm. Điều đó hiệu quả hơn nhiều so với một hàng tại một thời điểm (suy nghĩ về tình huống mà một hàng đơn lẻ chỉ là một vài byte ... bạn không muốn một gói mạng trên mỗi hàng khi nó có thể lấy nhiều hàng trong một gói đơn). Nó cũng có khả năng cho phép cơ sở dữ liệu giải phóng tài nguyên nội bộ của nó sớm - nếu trình đọc dữ liệu đã đọc tất cả các kết quả (khi chỉ có một vài) nó có hiệu quả có thể quên truy vấn.

Tôi nghi ngờ nếu bạn thử cùng loại điều với truy vấn trả về nhiều kết quả, bạn sẽ nhận được ngoại lệ dự kiến.

+5

Chính xác (http://msdn.microsoft.com/en-us/library/ms187602.aspx), kết quả được gửi đến máy khách nhanh nhất có thể, sẽ làm ướt bộ đệm mạng đến cho kết nối bạn đã mở máy chủ. Nếu bạn không truy xuất nhiều dữ liệu hơn bộ đệm đó, bạn sẽ có thể truy xuất tất cả các hàng trong kết quả. –

+0

Giải thích tốt! – smwikipedia

+0

bộ đệm mạng là gì? plzz giải thích. – Mou

4

Loại kết nối cơ bản cũng có thể tác động đến lượng dữ liệu được cung cấp tại một thời điểm. Đối với một lượng nhỏ dữ liệu sử dụng đầu nối bộ nhớ chia sẻ, hoàn toàn có thể là tất cả dữ liệu được gửi cùng nhau.

Bộ nhớ dùng chung là giao thức mặc định khi máy khách và máy chủ ở trên cùng một máy.

3

Nó đọc chúng vì nó có thời gian ở chế độ nền. Vào thời điểm bạn đã đi đến SQL Server và đóng kết nối, tất cả các dữ liệu đã được chuyển qua trong nền. Điều gì sẽ xảy ra khi bạn thực thi trình đọc, là nó gọi SQL Server và yêu cầu nó bắt đầu gửi kết quả. Ngay sau khi truy vấn được thực hiện xong (phân tích cú pháp chính xác, truy vấn là hợp lệ), nhưng trước khi nó kết thúc chạy, nó trả về. Tại thời điểm đó, bạn có thể bắt đầu gọi phương thức đọc. Tuy nhiên, nó vẫn đọc và đệm dữ liệu trong nền để khi bạn gọi lại đọc, hàng tiếp theo đã sẵn sàng, chờ trong bộ đệm, và nó không phải đi đến cơ sở dữ liệu.

6

Trình đọc dữ liệu đọc một bản ghi tại một thời điểm, nhưng nó đọc nó từ trình điều khiển cơ sở dữ liệu cơ bản. Trình điều khiển cơ sở dữ liệu đọc dữ liệu từ cơ sở dữ liệu trong các khối, thường sử dụng bộ đệm 8 kilobyte.

Nếu hồ sơ kết quả của bạn nhỏ và bạn không nhận được rất nhiều, tất cả sẽ phù hợp với bộ đệm và trình điều khiển cơ sở dữ liệu sẽ có thể cấp tất cả cho trình đọc dữ liệu mà không cần phải hỏi cơ sở dữ liệu dữ liệu.

Nếu bạn tìm nạp kết quả lớn hơn bộ đệm, bạn sẽ chỉ có thể đọc phần đầu tiên của nó, trước khi trình điều khiển cơ sở dữ liệu cần hỏi cơ sở dữ liệu để có thêm dữ liệu. Tại thời điểm đó bạn sẽ nhận được một ngoại lệ nếu cơ sở dữ liệu không còn truy cập được nữa.

Các vấn đề liên quan