2010-03-30 35 views
12

Tôi thường thấy khó hiểu như khi nó là thích hợp để sử dụng:Whats sự khác biệt giữa rs.close vs rs = không có gì trong một RecordSet

rs.Close 

trái ngược với

Set rs = Nothing 

tôi có thể hiểu cần đóng kết nối với nguồn, nhưng tôi có nên sử dụng cả hai khi biến nằm ngoài phạm vi?

Tôi có thể đặt biến thành Không có gì để bỏ qua bước Đóng kết nối không? Đây có phải là hành vi không tốt?

Trả lời

11

Bằng cách sử dụng phương pháp "Đóng" bạn đang đóng kết nối với cơ sở dữ liệu nhưng vẫn nằm trong bộ nhớ nơi bạn có thể mở lại bằng phương thức "Mở".

Đặt bản ghi âm thành "Không có gì", mặt khác giải phóng đối tượng hoàn toàn khỏi bộ nhớ.

+0

Vì vậy, không làm một bypass nhu cầu làm khác? –

+0

Không thực sự mặc dù bạn có thể bỏ qua thiết lập recordset để không có gì và sẽ không gặp phải bất kỳ lỗi nào. Nó chỉ là thực hành tốt nhất để thiết lập các nếp gấp để không có gì sau khi bạn đóng nó đặc biệt là khi bạn không sử dụng để recordset đó hoặc bạn sẽ không truy cập vào recordset cùng một lần nữa. –

+2

Câu trả lời của bạn đề cập đến các kết nối cơ sở dữ liệu, nhưng câu hỏi đã sử dụng một recordset. Các biến cơ sở dữ liệu khác với những người khác ở chỗ những gì bạn có thể làm một cách an toàn với chúng phụ thuộc vào cách chúng được khởi tạo (CurrentDB vs. DBEngine (0) (0)). Với một biến recordset, đóng recordset không đóng kết nối cơ sở dữ liệu ở tất cả. –

7

Phương thức đóng sẽ rớt xuống cấu trúc bộ nhớ.

Đặt biến thành Không có gì xóa con trỏ tới cấu trúc bộ nhớ đó.

Về mặt lý thuyết, xóa con trỏ sẽ giải phóng bộ nhớ mà con trỏ đang đề cập đến, vì VBA sử dụng tính toán tham chiếu để xác định khi nào nó có thể giải phóng bộ nhớ. Thật không may, những thứ khác nhau có thể đi sai và số lượng tham chiếu có thể kết thúc trong quá trình đánh bóng và bộ nhớ sẽ không được phát hành ngay cả khi cần.

Vì vậy, để đảm bảo bạn không bị rò rỉ bộ nhớ hoặc các loại lỗi lạ gây ra bởi các tham chiếu ngầm và không được phát hành, bạn cả Đóng và đặt thành Không có gì.

5

Bạn có thể đặt Recordset để có gì mà không cần phải gọi Close, theo tài liệu chính thức:

Một thay thế cho các phương thức Close là để thiết lập giá trị của một biến đối tượng để có gì (Set dbsTemp = Nothing) . Thông tin

thêm: Recordset.Close Method (DAO)

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