2009-01-22 11 views
9

SqlDataAdapter.Dispose yönteminin herhangi bir SqlConnections öğesini gerçekten kapatıp kapatmadığını bilen var mı? Reflector'u yükledim ve SqlDataAdapter'ın DbDataAdapter'den miras aldığını görüyorum. Bu sınıftaki atma yöntemini söküp bakacak olursak, herhangi bir SqlConnections öğesinin yok sayıldığı görülür. Bunun için bir test yazabilirim, ama bunun hakkında herhangi bir fikir sahibi olup olmadığını görmek isteyeceğimi düşündüm.SqlDataAdapter.Dispose aslında bir ilişkili SqlConnection'ı mı kapatıyor?

cevap

10

farkında olmak ilk şey dataAdapter yönetmek ve bazı durumlarda bağlantınızı kapatmak olmasıdır. Örneğin, DataAdapter kullanıyorsanız, muhtemelen .Fill() ve .Update() işlevlerini kullanarak DataTables/DataSets üzerinde çalışıyorsunuzdur. .Fill() docs itibaren

:

deyim ile ilişkili bağlantı nesnesi geçerli olmalıdır, ancak açık olması gerekmez. Dolgu çağrılmadan önce bağlantı kapatılırsa, veri almak için açılır ve sonra kapatılır. Dolgu çağrılmadan önce bağlantı açıksa, açık kalır.

.Update() docs Bağlantıyla ilgili hiçbir şeyden bahsetmezsiniz, bu nedenle el ile yönetmeyi beklemem gerekir.

Şimdi özellikle Dispose() yöntemi hakkında sordu. Güncelleme gibi, Dispose() docs özellikle bağlantıdan bahsetmiyor, bu yüzden manuel olarak kapatmam gerekecek.

Using conn as New SqlConnection(""), _ 
     adapter as New SqlDataAdapter() With {.Connection = conn} 
    'Do stuff 
End Using 

Veya C#:

Son olarak, böyle hafifçe Bob King'in koduna artırabilir

using (SqlConnection conn = new SqlConnection("")) 
using (SqlDataAdapter adapter = new SqlDataAdapter() {Connection = conn}) 
{ 
    // Do stuff 
} 

Değil% 100 Ben adaptör hakkı için initialize sözdizimi var ama doğrudan cevap penceresine yazdınız. Gerekirse daha sonra tamir edeceğim.

+0

Hmm Joel, asla yeni Aynı kullanma açıklamada birden IDisposables bildirebilirsiniz. Bu oldukça kaygan! –

+0

Ayrıca, Object Initializers C# sürümünün bir ". http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx –

0

Hayır, bağlantıyı elden gelmez. İnmemesi gerektiğine inanıyorum. Başka bir yerde kullanmak isteyebilirsiniz.

1

olarak bildiğim kadarıyla öyle değil. Bunu başarmak için ifadeleri kullanma iç içe kullanmak, ilk bağlantı oluşturmak, sonra da adaptörü oluşturmak ve adaptör Elden kullanılarak ifadeleri "pop" olarak, daha sonra bağlantı tetik bir kapanıyor, hangi Elden edilir:

Using conn as New SqlConnection("") 
    Using adapter as New SqlDataAdapter() With {.Connection = conn} 
     'Do stuff' 
    End Using 
End Using 
bu seçtiğiniz dil ise,

sözdizimi, C# için neredeyse aynıdır.

İlgili konular