Yanıtlar:
Öte yandan, o:
Pahasına:
Yani gerçekten ne yaptığınıza bağlı, ancak yalnızca bir veri kümesi tarafından desteklenen bir şeye ihtiyacım olana kadar Veri Okuyucuyu tercih etme eğilimindeyim. SqlDataReader, salt okunur bir ızgaraya bağlanmanın ortak veri erişimi durumu için mükemmeldir.
Daha fazla bilgi için resmi Microsoft belgelerine bakın .
while (reader.Read()).
Bunun cevabı oldukça geniş olabilir.
Esasen, benim için genellikle kararlarımı etkileyen en büyük fark, bir SQLDataReader ile veritabanından veri "akışlı" olmanızdır. Bir SQLDataAdapter ile, verileri veritabanından kendisi daha fazla sorgulanabilen bir nesneye çıkarır ve CRUD işlemlerini gerçekleştirirsiniz.
Açıkçası bir veri akışı ile SQLDataReader ÇOK daha hızlıdır, ancak bir seferde yalnızca bir kaydı işleyebilirsiniz. Bir SQLDataAdapter ile, kodunuzla çalışmak / geçmek için veritabanından sorgunuzla eşleşen satırların eksiksiz bir koleksiyonuna sahip olursunuz.
UYARI: Eğer bir SQLDataReader kullanıyorsanız, DAİMA, DAİMA bağlantıyı kapatmak için doğru kod yazdığınızdan emin olun, çünkü bağlantıyı SQLDataReader ile açık tuttuğunuzdan. Bunun yapılmaması veya sonuçların işlenmesinde bir hata olması durumunda bağlantının kapatılmasına yönelik uygun hata işleme , uygulamanızı bağlantı sızıntıları ile DÜZELTECEK .
VB'mi bağışlayın, ancak SqlDataReader kullanırken sahip olmanız gereken minimum kod miktarı budur:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
eşdeğer C #:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
Bir SqlDataAdapter tipik olarak bir DataSet veya DataTable'ı doldurmak için kullanılır ve bu nedenle bağlantınız kapatıldıktan sonra (bağlantısı kesilen erişim) verilere erişiminiz olur.
SqlDataReader, genellikle bir DataSet / DataTable doldurmaktan daha hızlı olma eğiliminde olan, yalnızca hızlı ileri ve bağlantılı bir imleçtir.
Ayrıca, bir SqlDataReader ile, verilerinizle her seferinde bir kayıt işlemi gerçekleştirirsiniz ve herhangi bir veriyi bellekte tutmazsınız. Açıkça bir DataTable veya DataSet ile, bir bellek ayırma ek yükünüz vardır.
Verilerinizi bellekte tutmanız gerekmiyorsa, bu nedenle yalnızca bir şeyler oluşturmak için SqlDataReader'a gidin. Verilerinizle bağlantısız bir şekilde ilgilenmek istiyorsanız, bir DataSet veya DataTable'ı doldurmak için DataAdapter'ı seçin.
Veritabanından bir bellek içi DataSet / DataTable doldurmak istediğinizde bir SqlDataAdapter kullanın. Daha sonra bağlantıyı kapatma / kesme esnekliğine sahip olursunuz, datatable'ı geçirin / bellekte dolaşın. Daha sonra verileri işleyebilir ve InsertCommand / UpdateCommand ile birlikte veri bağdaştırıcısını kullanarak DB'de saklayabilirsiniz.
Verileri iş mantığınız etrafında geçirme esnekliğine ihtiyaç duymadan hızlı, düşük bellek ayak izine sahip veri erişimi istediğinizde bir SqlDataReader kullanın. Bu, tüm verileri tek seferde belleğe yüklemediğinden, büyük veri hacimlerinin hızlı, düşük bellek kullanımı alımı için daha uygundur - SqlDataAdapter yaklaşımıyla, DataSet / DataTable tüm verilerle doldurulur, bu nedenle tutmak için çok fazla bellek gerektiren çok sayıda satır ve sütun var.
Doldurma işlevi dahili olarak bir Veri Okuyucusu kullanır. Düşünceniz "Hangisi daha verimli?" İse, o zaman kayıt bazında koleksiyonu dolduran sıkı bir döngüde bir DataReader kullanmak, muhtemelen sistemdeki DataAdapter.Fill'i kullanmakla aynı yük olacaktır.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)