2011-12-08 17 views
9

aynı mı DataReader [i] DataReader.GetValue DataReader.GetString (i) v, (i) v

dataReader.GetValue(i) 

için mantıksal olarak eşdeğer

dataReader[i] 

mi? Onlar farklı mı? Birinin diğerine uygun olacağı bir durum var mı?

documented differently vardır:

  • belirtilen dizin
  • İade belirtilen alanın değeri bulunan sütun alır. ben onları kullandığınızda

Ama ikisi de alanın değerini döndürür. "Sütunu al" için ne anlama geliyor? "Bir alanın değerini döndürmek" ne demektir?


Bonus Chatter: Ben buna

:

reader[i]; 
reader.GetValue(i); 
reader.GetString(i); 

i String

cevap

15

Sonuçta bunu kastediyoruz System.Data.IDataReader belirli uygulanmasına bağlı her zaman olsun , ama System.Data.SqlClient.SqlDataReader demek istediğini varsayalım. Bu durumda

, reader[i] ve reader.GetValue(i) tam aynı şey yok. Aslında, reader[i] dahili olarak reader.GetValue(i)'u çağırır. (Kodu ILSpy gibi bir araç kullanarak sökerek görebilirsiniz.). Her iki üye de geçerli satırın i-inci sütunundaki değeri döndürür ve değerin türüne bakılmaksızın başarıyla döndürür (dönüş türü object). Bu üyelerin her ikisi için belgeler biraz yanıltıcıdır ve daha iyi bir şekilde ifade edilebilir. Bu üyelerden istediğiniz her şeyi kullanabilirsiniz, sadece daha iyi okuduğunuzu seçin. reader.GetString(i) Oysa

özellikle string olarak geçerli satırın i-inci kolon içinde yer alan bir değer dönmek için tasarlanmıştır. Bu sütundaki değer string değilse, InvalidCastException atılacaktır. Değerin string ve string ile çalışmak istediğiniz tür olduğundan eminseniz bu yöntemi kullanın. Bu, yayınlarınızı yapmak zorunda kalmayacağınız için kodunuzu daha kısa bir hale getirecektir. Belirli bir durumda

, geçerli satırın i-inci sütundaki değer her üç üyeden dönüş değeri aynıdır yüzden tip string, olmalıdır.

Doğru yazılırsa, System.Data.IDataReader'un diğer uygulamaları aynı şekilde davranmalıdır.

+0

'GetValue' bir 'byte 'döndürdüğü, ancak' GetInt32' bir Int32 –

+0

baytını atamadığı korkunç kenar durumları var (özellikle demonte kodun izlenmesi zor olduğundan) Görünüşte, sütundaki değer zaten istenen tipte olmalıdır, aksi takdirde InvalidCastException (kendisi biraz yanıltıcıdır) atılacaktır. Cevabı ben düzenleyeceğim. –

+0

Gerçekten de, GetInt32 belgeleri (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx) "Dönüşüm yapılmıyor, bu nedenle alınan veriler Zaten bir 32-bit imzalı tamsayı. " Diğer GetXXX yöntemleri benzer şekilde belgelenmiştir. –