DataReaders Nedir?

 

 ADO.Nette DataReaders kavramı

Bu yazıda ADO .Net’te DataReaders kavramını açıklanıyor ve DataReaders kullanılarak bir uygulama nasıl yapılır o gösterilecek. Yalnız bunu iki dizilik bir yazı şeklinde aktarılacaktır. Şimdi biraz teorik bilgi alalım.
.Net Framework’ü SqlDataReader ve OleDbDataReader olmak üzere iki çeşit datareader’ın kullanımına izin verir. Bu datareader’lar System.Data.SqlClient ile System.Data.OleDb isim uzaylarının içinde yer alır.(Şimdi datareader kullanırken hangi isim uzaylarını ekleyeceğimizi öğrenmiş olduk.)
Her iki datareader arasında bir parça fark olsa da genelde kullanım amaçları aynıdır. Bunlar ulaşım sağlama, yüksek performans, erişimde veri tiplerini zorlama olarak belirtilebilir.
Datareaderlar yüksek performanslarını veritabanlarına yaptıkları direkt bağlantılara borçludurlar. Tabii ki bağlantısız bir DataReader yaratılamayacağı gibi yarattığımız DataReader’ın performansı büyük ölçüde ağ(network) bağlantımızın de bize sağladığı bağlantı kalitesi ile de ilgilidir. Eğer yüksek hızlı bir ağ bağlantınız varsa tabii ki yüksek performanslı bir DataReader’a da sahip olabilirsiniz.
DataReder’lar bir anda bir tek sıra dataya ulaşım imkanı verirler. Bu da tüm veritabanının belleğe taşınmasını önleyerek performansı arttırır.
Veri tiplerini zorlamadan bahsetmiştim. Şimdi bir örnek vereyim. SQL Server veritabanlarında GetSqlInt32 metodu döndürülecek verinin tipinin Int32 olmasına zorlayarak verinin güvenliğini arttırır. Aynı şekilde GetInt32 metodu da OLE DB veritabanlarının kullanımında mevcuttur.
Bundan sonra anlatacağım konuları belirteyim. (Aslında temel bilgiyi vermiş oldum. Buradan sonrası detaya girecek.)
         Datareader’ların Interface’leri
         Ne Zaman SqlDataReader Kullanılır ? Ne zaman OleDbDataReader Kullanılır?
         SQL veritabanından nasıl veri döndürülür?
         Basit bir DataReader uygulaması gerçekleştirmek.
         Performans kriterleri
İlk üçünü bu yazıda sizlere aktarmaya çalışacağım. Diğer ikisini de ikinci yazımda sizlere aktarmaya çalışacağım. Ama şunu belirtmeliyim ki dil olarak C#’ı tercih ettiğim için C# geçmişiniz olması yada daha önce Java ile ilgilenmiş olmanız sizin için daha yararlı olabilir. Tabii bir de SQL Server 2000 geçmişiniz olması daha rahat anlamanıza yardımcı olacaktır.
DataReader Arabirimleri(Interfaceleri) : ADO .Net’te DataReaderlar herhangi bir sınıftan türetilemezler yani taban sınıfları yoktur. Ancak IDataReader ile IDataRecord adında iki tane arabirimin(interface) implemente edilmesine olanak sağlarlar.
– IDataReader Interface : Bu arabirim(interface) içinde barındırdığı birçok metod ve özellik sayesinde kullanıcıya dönen sonuçların detaylarına ulaşılabilmesini sağlamaya yarar. Şimdi de bu kolaylıkları sağlayan metod ve özelliklere bir göz atalım.
Metodlar ve açıklamaları aşağıda verilmiştir.
Close : DataReader nesnesini kapatmaya yarar
GetSchemaTable : Bir veri tablosu(DataTable) döndürerek sonucu DataReader’ın Schema’sına yerleştirir.
NextResult : Eğer bir sonraki sonuç mevcutsa DataReder’ı bir sonraki sonuç için kaydırır.
Read : DataReader’ı bir sonraki kayıt için ilerletir.
Özellikler(Property) ve açıklamalrı aşağıda verilmektedir..
Depths : O an geçerli olan sıranın en dibinde yer alan değeri döndürür. Yalnız bu özellik her iki tipteki datareader’da bulunmasına rağmen sadece OleDbDataReader ile uygulanabilir.
IsClosed : DataReader’ın kapalı olup olmadığına dair boolean(true or false) değer döndürür.
RecordsAffected : SQL cümleciği ile değiştirilen eklenen silinen sıra sayısını döndürür.
         IDataRecord Interface’i : Yukarıda temel olarak Datareader’larla neler
yapabileceğimizi gördük. Ancak direkt verilere bağlantı yapamamıştık burada ise DataRecord devreye girerek bizim verilerin kayıtlarına direkt bağlantı yapmamıza olanak sağlar. Bu arabirim ile veritabanının o an geçerli olan sıranın geçerli sütunundaki kayıdına direkt ulaşabiliriz. Aşağıda bu arabirime ait bazı metod ve özellikleri göstereceğim.
Metodlar ve açıklamaları aşağıda verilmiştir.
GetBoolean : Verilen sütun için boolean değer döndürür.
GetByte : Verilen sütun için 8 bitlik işaretsiz tamsayı döndürür.
GetInt64 : Verilen sütun için 64 bitlik işaretsiz tamsayı döndürür.
GetChar : Verilen sütunun karakter değerini döndürür.
Biraz da özelliklere göz atalım.
FieldCount : Geçerli sıradaki sütun sayısını döndürür.
Item : Verilen sütundaki değeri döndürür.
Genellikle IDataRecord arabirimindeki metodlar GetXXX tarzında yazılarak istenen sütundaki değer döndürülür. Metodlar ve özellikler için daha ayrıntılı bilgiye MSDN’lerden ulaşabilirsiniz. Burada bütün metodlar ve özellikleri tanıtırsam bu yazı dizisi gerektiğinden fazla uzayabilir. Ancak istek olursa sadece metod ve özellikleri tanıtan bir yazı da yazabilirim.
ADO .Net DataReader’ları
Burada hangi durumlarda SqlDataReader, hangi durumlarda OleDbDataReader  kullanılır onları açıklamaya çalışacağım.
SqlClient’ın yönettiği sınıflar SqlCommand, SqlConnection, SqlDataAdapter, SqlDataReader, SqlParameter’dir.
OleDb’nin yönettiği sınıflar ise OleDbCommand, OleDbConnection, OleDbAdapter, OleDbDataReader, OleDbParameter’dır.
OleDbDataReader‘ı SQL Server’ın daha önceki(SQL 2000 öncesi) versiyonlarında kullanılabilir. Ama kullanılması tavsiye edilmez. (Pek sık kullanımına da rastlamadım zaten.) Bunun nedeni DataReader’ların arkaplanda bilgiyi kullanma şekillerinin (metodlarının) farklı olmasıdır. Fakat bununla birlikteSqlDataReader SQL Server’a bağlantı yaparken en iyi bağlantıyı nasıl yapacağına dair özel bilgiye sahiptir. Ancak OleDbDataReader herhangi bir veritabanına bağlanırken hep aynı yolu kullanır. Aslında SQL Server’a nasıl bağlantı yaptıklarını bir şekille gösterirsem daha iyi olur
Bu şekilden de anlaşıldığı gibi SqlDataReader SQL Server’s Tabular Data Stream(TDS) protokolünü kullanarak veriye direkt bağlantı yapar. Eğer OleDbDataReader’ı karşılaştırırsak OleDbDataReader’in bir çok katmandan geçtikten sonra veriye ulaştığını görürüz. Aralarındaki fark sadece performans farkından ibaret değildir. Aşağıda vereceğim iki örneğe bakalım.
Birinci örneğimiz OleDbDataReader ile ilgili
OleDbDataReader reader =  command.ExecuteReader();
while( reader.Read() )
{
            Console.WriteLine( reader.GetDateTime(2) );
}
İkinci örneğimiz SqlDataReader ile ilgili
SqlDataReader reader = command.ExecuteReader();
while( reader.Read() )
{
            Console.WriteLine( reader.GetSqlDateTime(2) )
}
Şimdi kodlamayla ilgili ayrıntıları açıklamayacağım. Ancak ikisinin de datareader yaratttığını ve sonucunu command generator ile okunduğunu belirteyim. Her iki datareader’ın da SQL Server’a bağlandığını hatırlatalım. Kod içinde dikkatinizi çekmek istediğim nokta Console çıktısının alındığı döngü. İlk örneğimizde DateTime nesnesi döner ve nesnenin içeriği ekrana çıktı olarak verilir. Ancak ikinci örnekte ise SqlDateTime nesnesi döner yani dönüş değerinin SqlDateTime olması zorlanır. Tabii nesnenin tipinin SqlDateTime tipine zorlanması için System.Data.SqlTypes isim uzayına erişilebilmesi gerekir.
private void Login()
{

SqlConnection con=new SqlConnection();

con.ConnectionString=”server=sunucum;uid=kullanıcıadım;pwd=şifrem;database=veritabanım”;

try

{
con.Open();
}

catch(SqlException ex)

{
error.Text=ex.Message;
}

SqlCommand com=new SqlCommand();

com.Connection=con;
com.CommandText=”SELECT * FROM tablo WHERE (userName='”+text2.Text+”‘)”;
SqlDataReader reader=com.ExecuteReader();
reader.Read();

string password=reader[“password”].ToString().Trim();
if(text3.Text==password)

{

//Girş yapıldıktan sonra yapılacak işlemler

}

else

{

//Tekrar deneyin mesajı

}
con.Dispose();
com.Dispose();

/*

Bu datareader’ı kullanarak o kullanıcıya ait diğer bilgilere de
ulaşabilirsin. Mesela SQL table’ında kulanıcının adı ve soyadını tutan
‘name’ isimli bir sutün var. O an text2’ye kullanıcı adını giren kullanıcının
adını ve soyadını almak için reader[“name”].ToString().Trim() ile bu
bilgiyi alabilirsin. İşte DataReader bu tür işlere yarıyor.
*/

}

Diğer Örnek: 

DataGridin data kaynağına göre bu işlem değişecektir. Ben DataTable olduğunu farzederek örnek kod veriyorum:
private void BindArray()

{

SqlConnection con=new SqlConnection();

con.ConnectionString=”server=sunucum;uid=kullanıcıadım;pwd=şifrem;database=veritabanım”;

try

{
con.Open();
}

catch(SqlException ex)

{
MessageBox.Show(ex.Message);
}

SqlCommand com=new SqlCommand();

com.Connection=con;
com.CommandText=”SELECT * FROM tablo”;

SqlDataAdapter adapter=new SqlDataAdapter(com.CommandText,con);
DataTable table=new DataTable();

adapter.Fill(table);

ArrayList arrayList=new ArrayList();
foreach(DataRow dtr in table.Rows)

{

foreach(DataColumn dtc in table.Columns)

{
arrayList.Add(dtr[dtc]);
}
}

foreach(object obj in arrayList)

{
textBox1.Text+=obj.ToString();
}
con.Dispose();
com.Dispose();
adapter.Dispose();
table.Dispose();

}
Kaynak : http://www.bilisimakademi.net/yaziOku.asp?yaziID=258

Bir yanıt yazın