2011-12-05 26 views
9
Dim rs as ADODB.Recordset 
set rs = ReturnARecordset 'assume ReturnARecordset does just that... 

'do something with rs 

rs.Close 
set rs = Nothing 

Có cần thiết phải gọi rs.Close trước khi đặt nó thành không?Có cần đóng một đối tượng Adodb.recordset trước khi đặt nó thành không?

Chỉnh sửa: Chúng tôi có một kết nối toàn cầu mà chúng tôi tiếp tục mở trong suốt thời gian của ứng dụng và tất cả các đối tượng recordset sử dụng cùng một kết nối này. Tôi thấy hai câu trả lời dưới đây nói về sự cần thiết phải đóng bộ hồ sơ để đảm bảo các kết nối không được treo treo mở. Với tôi nghe có vẻ như rất nhiều bài nói ngớ ngẩn vì các kết nối được điều khiển với các đối tượng kết nối, chứ không phải các đối tượng recordset phải không? Nhưng xin vui lòng cho tôi biết nếu tôi đang thiếu một cái gì đó ở đây ...

Trả lời

4

Lý do duy nhất để gọi Close rõ ràng là khi bạn không chắc chắn bản ghi được tham chiếu từ một nơi khác trong dự án của bạn, thường là kết quả của một số mã hóa cẩu thả.

Dim rs as ADODB.Recordset 
Set rs = ReturnARecordset 
... 
MyControl.ObscureMethod rs 
... 
Set rs = Nothing 

Dòng cuối cùng có nghĩa vụ phải chấm dứt dụ recordset mà không gọi Close một cách rõ ràng, trừ khi MyControl đang nắm giữ một tài liệu tham khảo thêm và do đó ngăn ngừa bình thường giọt nước mắt xuống. Gọi số Close trên rs sẽ đảm bảo MyControl không thể sử dụng tham chiếu của nó cho bất kỳ điều gì hữu ích, bị lỗi trong lửa trong thời gian chờ đợi.

+0

Suy nghĩ của tôi chính xác. Tôi chủ yếu cố gắng tìm ra nếu có một lý do hợp lệ để gọi phương thức Close trên các biến recordset riêng tư với hàm mà chúng được tạo ra và nhanh chóng đi ra khỏi phạm vi. –

+2

Gọi 'Đóng', đặt rõ ràng * tham chiếu * cục bộ thành 'Không có gì' là một phần của cùng một chương trình Cargo Cult mà phòng tắm trên Internet có mã đầy. Sử dụng ý thức chung, tốt nhất là kiểm tra rò rỉ trong môi trường cụ thể của bạn. – wqw

+0

Vâng, tôi không bao giờ thiết lập để không có gì khi tôi biết nó về để đi ra khỏi phạm vi anyway. Nhưng tôi không muốn nghe nhiều câu trả lời về tầm quan trọng của việc thiết lập nó thành không có gì khi đó không phải là câu hỏi của tôi, vì vậy tôi đặt dòng vào đó để ngăn những nhận xét đó :) –

4

Có, điều này không chỉ ép buộc bộ sưu tập rác còn nói với máy chủ rằng kết nối đang bị chấm dứt, điều này tránh được nhiều kết nối mồ côi mở. cuối cùng sẽ tự hết thời gian), nhưng thực hành tốt nhất luôn là để đóng chúng.

Điều này đặc biệt rõ ràng khi ADODB đang sử dụng kết nối từ xa thay vì kết nối cục bộ.

+1

Điều đó không có ý nghĩa. Recordset.Open mất một đối tượng kết nối như một tham số và đóng recordset không đóng kết nối. Ứng dụng của chúng tôi có một đối tượng kết nối duy nhất vẫn mở trong suốt thời gian của ứng dụng và tất cả các truy vấn sử dụng đối tượng này. Vì vậy, với ý nghĩ đó, có lý do nào khác để đóng recordset không? Tôi sẽ giả định rằng khi số lượng tài liệu tham khảo của recordset đạt đến 0, nó sẽ chăm sóc bất cứ thứ gì gọi Close sẽ làm trong destructor của nó nhưng tôi không chắc vì vậy đó là lý do tại sao tôi hỏi. –

+0

Tức là, có bất kỳ lý do nào khác để đóng một recordset khi nó sẽ được đặt ngay lập tức thành không có gì sau đó (hoặc rõ ràng hoặc bằng cách thoát khỏi phạm vi) –

1

Bạn có thể chạy vào ODBC hoặc OLEDB vấn đề Pooling, mà giữ một kết nối mở và buộc lên một khe cắm hồ bơi:

nguyên nhân thường gặp của kết nối leo bao gồm:

Các kết nối ADO và các đối tượng Recordset là không thực sự đóng cửa. Nếu bạn không đóng chúng một cách rõ ràng, chúng sẽ không được thả vào hồ bơi. Đây có lẽ là nguyên nhân thường gặp nhất của kết nối creep.

Đối tượng ADO bạn đã tạo (đặc biệt là đối tượng Kết nối) không được phát hành rõ ràng. Các đối tượng phát hành rõ ràng bạn tạo ra chỉ là thực hành lập trình tốt. Nếu bạn cấp phát bộ nhớ, hãy giải phóng bộ nhớ. Tùy thuộc vào ngôn ngữ bạn đang sử dụng, cho phép một biến nằm ngoài phạm vi có thể hoặc không thể dẫn đến việc nó được phát hành.

Xem Pooling in the Microsoft Data Access Components

Và nếu có bất kỳ cơ hội Net Interop tham gia thận trọng: có rất nhiều cảnh báo về những vấn đề gây ra do các đối tượng lười biếng cách COM (hoặc đối tượng chứa) phát hành xảy ra dưới. Thu gom rác của Net.

+0

Vui lòng xem chỉnh sửa của tôi và cho tôi biết nếu tôi đang thiếu điều gì đó ở đây ... –

+1

Việc tạo nhóm không phải là vấn đề theo như tôi biết khi một Recordset không được mở bằng Kết nối của riêng nó. – Bob77

+0

Được rồi. Tôi chỉ đang làm việc với các tập bản ghi đã được thông qua một đối tượng kết nối và thành thật thậm chí không nhớ rằng bạn có thể mở chúng mà không làm như vậy. Cảm ơn. –

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