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

'do something with rs 

rs.Close 
set rs = Nothing 

Hiçbir şey yapmadan önce rs.Close'u çağırmak gerekli mi?Bir Adodb.recordset nesnesini hiçbir şey yapmadan önce kapatmak gerekli mi?

Düzenleme: Uygulamanın süresi boyunca açık tuttuğumuz bir genel bağlantımız var ve tüm kayıt kümesi nesneleri aynı bağlantıyı kullanıyor. Bağlantıların açık kalmayacağından emin olmak için kayıtların kapatılması gerektiğinden iki yanıt daha görüyorum. Benim için çok fazla aptalca konuşmaya benziyor, çünkü bağlantılar bağlantı nesneleriyle değil, kayıt nesnesiyle kontrol ediliyor? Ama burada bir şey eksik varsa lütfen bana bildirin ...

cevap

4

Close numaralı telefonu çağırmanın tek nedeni, kayıt kümesinin projenizdeki başka bir yerden, genellikle bazı özensiz kodlamaların bir sonucu olarak referans alındığından emin olmadığınız zaman olmasıdır.

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

Son hattı MyControl ilave referansa sahip ve bu nedenle normal gözyaşı aşağı önlenmesi sürece, açık Close çağırmadan kayıt örneği sona erdirmek için gerekiyordu. rs numaralı telefondan Close numaralı telefonu arayarak, MyControl numaralı telefonun referansını, bu esnada alevler içinde çarpışan kullanışlı herhangi bir şey için kullanamayacağından emin olacaksınız.

+0

Düşüncelerim tam olarak. Çoğunlukla, oluşturuldukları işleve özel olan kayıtlar değişkenlerinde Kapat yöntemini çağırmak için geçerli bir neden olup olmadığını çabucak anlamaya çalışıyorum ve hızlı bir şekilde kapsam dışına çıkıyorum. –

+2

'Close' (Kapalı) 'yı çağırmak, açıkça * yerel * referanslarını' Nothing' olarak ayarlamak, aynı Kargo Cult programının parçalarının internet banyolarının dolu olduğu bölümleridir. Sağduyunuzu kullanın, en iyi sizin ortamınızdaki sızıntıları test etmek olacaktır. – wqw

+0

Evet, zaten kapsam dışında kalmak üzere olduğunu bildiğim zaman hiçbir şey yapmayacağım. Ama bu sorularımın ne anlama geldiği hakkında hiçbir şey yapmamanın önemi üzerine birden çok cevap duymak istemedim, bu yüzden bu yorumları önlemek için hattı oraya koydum :) –

4

Evet, bu sadece bir çöp toplamaya zorlamaktan öteye geçiyor, aynı zamanda sunucuya bağlantının sonlandırıldığını söyler, bu da çoklu açık yetim bağlantısına sahip olmamasını sağlar. sonunda kendileri zaman aşımına uğrayacaklar, ama onları kapatmak için her zaman en iyi uygulama.

Bu özellikle, ADODB yerel değil, bir uzak bağlantı kullanıyorsa, özellikle belirgindir.

+1

Bu mantıklı değil. Recordset.Open bir bağlantı nesnesini parametre olarak alır ve kayıt kümesini kapatmak bağlantıyı kapatmaz. Uygulamamız, uygulamanın süresi boyunca açık kalan tek bir bağlantı nesnesine sahiptir ve tüm sorgular bu nesneyi kullanır. Yani akılda tutarak, kayıt kümesini kapatmak için başka bir sebep var mı? Kayıtların referans sayısı 0'a ulaştığında, Close'un kendi yıkıcısında yapacağı bir şeyin icabına bakacağını sanıyorum, ama emin değilim, bu yüzden sordum. –

+0

Yani, bir kayıt kümesini sonradan hemen sonra hiçbir şey olmayacak şekilde (açık ya da kapsam dışına çıkarak) kapatmanın başka bir nedeni var: –

1

Sen ODBC veya OLEDB içine açık bir bağlantı tutmak Havuzlama sorunları çalıştırmak ve bir havuz yuvası kravat olabilir: Bağlantı sürünme

genel nedenleri şunlardır:

ADO Connection ve Recordset nesneleri aslında kapalı değil. Açıkça onları kapatmazsanız, havuza bırakılmazlar. Bu muhtemelen en sık görülen bağlantı sürünme sebebidir.

Oluşturduğunuz bir ADO nesnesi (özellikle bir Connection nesnesi) açık bir şekilde serbest bırakılmadı. Oluşturduğunuz nesneleri açıkça serbest bırakmak sadece iyi bir programlama uygulamasıdır. Bellek ayırırsanız serbest bırakın. Kullandığınız dile bağlı olarak, bir değişkenin kapsam dışına çıkmasına izin verilmesiyle sonuçlanabilir veya yayınlanmayabilir.

Pooling in the Microsoft Data Access Components Bkz Ve varsa Net Interop herhangi bir şans dikkatli dahil: nedeniyle tahliye altında meydana tembel yolu COM nesnesi (veya içerdiği nesne) neden sorunlar hakkında uyarılar çok sayıda bulunmaktadır. Net'in çöp toplama.

+0

Lütfen benim düzenlememe bakın ve bana haber verin Burada bir şey eksik olursam ... –

+1

Havuzlama, bir Recordset'in kendi Bağlantısı ile açılmadığında bildiğim kadarıyla bir sorun değil. – Bob77

+0

Tamam, bu mantıklı. Sadece bir bağlantı nesnesinden geçmiş kayıtlar ile çalışıyorum ve bunları yapmadan açabileceğinizi bile hatırlamadım. Teşekkürler. –