Veriye Erişim (ADO.NET)

İkinci makalemde (Veritabanı Programlama (SQL)) sizlere veri işlemeyi anlatmıştım. Peki biz, işlediğimiz bu verilere nasıl erişiriz? Bir web sitesi yaptınız, güzel bir de veritabanı da oluşturdunuz peki bağlantıyı nasıl yapacaksınız? İşte sizlere bu makalemde sizlere veriye erişim teknolojilerine anlatacağım. Biz buna .net dünyasında Ado.net diyoruz.

Şekil 1: Veri kaynakları ve uygulamalar arasındaki bağlantı

Veriye Erişim Teknolojileri

ODBC (Open Database Connectivity)

Veritabanı yönetim sistemlerine erişmek için standart bir yazılım arayüzü sağlar. ODB (Open Database), ODBC’nin genişletilmiş modelidir. ODBC’de veri tabanına istemci olarak erişim mümkünken ODB kullanıldığında bağlantının her zaman local′de görülmesi sağlanır. Böylece sistemde yoğunluk, veri kaybı ve IP çakışması yaşanmaz.

DAO (Data Access Objects)

ODBC’nin alt seviye diller için (C,C++, vb) geliştirilmiş olması ve kullanımının zor olması nedeniyle Microsoft tarafından Visual Basic 3 ile geliştirdiği ve kullanımı kolay bir teknolojidir. Microsoft’un Access veritabanlarına erişim standardı olan jet için geliştirdiği bu teknik, hala VB6’dan MS Access’e veri erişim için en hızlı yöntemdir.

RDO (Remote Data Objects)

Microsoft’un VB4 ile duyurduğu RDO; DAO’nun ODBC sağlayıcısındaki eksikliğini gidermek için geliştirilmiştir. Uzak veri kaynaklarına erişim için ODBC’yi daha performanslı kullanmak için geliştirilmiştir.

OLE DB (Object Linking and Embedding DataBase)

ODBC’de olduğu gibi sürücü  mantığıyla çalışan OLE DB, arka tarafta COM arayüzünü kullanan bir tekniktir. Kaydettiği gelişme ile bir çok sisteme bağlantı için kullanılabilmektedir. Bu başarısından dolayı da ADO.NET içinde önemli bir yeri vardır.

ADO (ActiveX Data Objects)

ADO.NET ‘in temelini oluşturan teknolojidir. ADO, OLE DB teknolojisini kullanan ve veriye erişimi daha da kolaylaştıran, yüksek seviye programlama dilleri için veri erişiminde tercih edilen bir teknolojidir.

ADO.NET

ADO.NET, .NET Framework ile geliştirilen veri işlemlerini kolaylaştırır. N katmanlı mimariler (Nesne Tabanlı Programlama) geliştirmek için hazırlanmış olup çevrimdışı sistemleri ve XML’e tam destek veren bir sistemdir.

ADO.NET Mimarisi

Şekil 2: Ado.net’in .NET Framework içindeki yeri

 

 

 

 

 

 

Şekil 3: Ado.net mimarisi

System.Data: ADO.NET ile uygulama geliştirirken kullanılabilecek, tüm providerler için ortak olan bileşenlerin bulunduğu namespace’dir.

System.Data.SqlClient: SQL Server ile çalışabilmek için yazılmış class’ların yer aldığı namespace’dir.

System.Data.OleDB: Microsoft Access, Oracle, Text Dosyaları, Excel vb gibi sistemler bağlantıyı sağlar.

System.Data.Odbc: ODBC standartlarını destekleyen sistemlere bağlantı kurmayı sağlar.

System.Data.Oracle: Oracle bağlantısını sağlar. Referansı ekledikten sonra uygulamalarda Oracle için yazılmış olan class’lar kullanılabilmektedir.

SQL Server .NET Veri Sağlayıcısı (Data Provider) Ortak Tipleri

SQL Connection

Bu class ile bağlantı kurmak istenilen SQL Server instance’ını, kullanılmak istenilen veritabanını, ve bağlantı için gerekli olan güvenlik ayarlarını belirttikten sonra, ağlantı açılarak veritabanı kullanılabilir hale getirilmiş olur. Daha sonra diğer class’lar devreye girer ve veri taşıma işlemleri gerçekleştirilir.

Kısacası SQL Connection, database bağlantıyı sağlayan class’dır. Bu class’ın içerisinde belirtiğiniz adres ile uygulamanızın database bağlantısı sağlanır.

SqlConnection Sınıfının Özellikleri ve Metotları

1) ConnectionString

Veri tabanına bağlantı sağlamak için oluşturduğumuz bağlantı adresini (bağlantı cümlesini) belirttiğimiz metottur. bağlantı cümleleri için bakınız: “SQL Connection (SQL Bağlantı) Örnekleri”

Özellikleri

  • Data Source: SQL Server adı.
  • Integrated Security: True, Windows Authentication ile bağlantının yapılması. False ise, Sql Server Authentication ile bağlantı yapılmasıdır.
  • Persist Security Info: SQL Server’in güvenlik bilgilerini uygulama tarafına geriye göndermesidir. Varsayılan değer olarak False alır.
  • Pooling: SQL Server bağlantı havuzunu destekler. Varsayılan değer olarak True alır.
  • Max Pool Size: Aynı bağlantı için açılan havuzda, maksimum kaç tane bağlantının bulunması gerektiğini belirtir.
  • Max Pool Size: Aynı bağlantı için açılan havuzda, minimum kaç tane bağlantının bulunması gerektiğini belirtir.
  • Provider: Sadece OleDBConnection için kullanılır.

2) Open()

Bağlantının kullanıma hazır olması ve açılmasını sağlar. SQL Server üzerinden kaynakların ayrılması ve kullanılabilmesini sağlayan metottur.

3) Close()

Bağlantının kapatılmasını sağlar. SQL Server tarafından ayrılan kaynakların bırakılmasını sağlar.

4) ConnectionState

Bağlantının durumunu verir. Alabileceği değerler: “Broken, Closed, Connecting, Executing, Fetching, Open” şeklindedir. Böylece bağlantının durumuna göre yapılacak işleme karar verilir.

SQL Connection (SQL Bağlantı) Örnekleri

Standart Güvenlik
Server=myServerAddress; Database=myDataBase; User Id=myUsername; Password=myPassword;

Güvenilir Bağlantı
Server=myServerAddress; Database=myDataBase; Trusted_Connection=True;

SQL Server Instance Bağlantı
Server=myServerName\myInstanceName; Database=myDataBase; User Id=myUsername; Password=myPassword;

Bir CE cihazından gelen Güvenilen Bağlantı
Data Source=myServerAddress; Initial Catalog=myDataBase; Integrated Security=SSPI; User ID=myDomain\myUsername; Password=myPassword;

IP Adresi Üzerinden Bağlantı
Data Source=190.190.200.100,1433; Network Library=DBMSSOCN; Initial Catalog=myDataBase; User ID=myUsername; Password=myPassword;

Multiple Active Result Sets True
Server=myServerAddress; Database=myDataBase; Trusted_Connection=True; MultipleActiveResultSets=true;

Lokal SQL Server Express’e Database Ekleme
Server=.\SQLExpress; AttachDbFilename=C:\MyFolder\MyDataFile.mdf; Database=dbname; Trusted_Connection=Yes;

Otomatik Lokal Database Bağlantısı
Server=(localdb)\v11.0; Integrated Security=true;

Örnek Uygulama

static void Main(string[] args)
 { 
     //SQL CONNECTION
     SqlConnection connection = new SqlConnection();
     connection.ConnectionString = "Server=.; Database=AdventureWorks2012; Trusted_Connection=True;";
     connection.Open();
 
          //İşlemler...

     connection.Close();
}

*Burda unutulmaması gereken Sql Connection ile bağlantı adresimizi tanımladıktan sonra sql veri tabanımıza bağlanması için connection.Open() komutuyla bağlantıyı açmak işlemlerimiz bittikten sonra connection.Close() methodu ile bağlantıyı kapatmak.

SQL Command

Sql Connection ile bağlantımızı tanımladık ve veri tabanımıza güvenilir bir şekilde bağlantımızı sağladık. Şimdi sıra veri tabanında işlem yapmaya geldi bu bir sorgu olabilir veri ekleme olabilir (SELECT, INSERT, UPDATE, vb). O yüzden gerekli komutları yazmamız lazım. İşte Sql Command’da bu işlemi yapabilmek için oluşturulmuş bir class’dır. Sql Command ile bağlantı kurduğunuz veri tabanına komutlar gönderebilir istediğiniz işlemleri yapabilirsiniz.

Örnek Kullanım

static void Main(string[] args)
{

     SqlConnection connection = new SqlConnection();
     connection.ConnectionString = "Server=.; Database=DBPersonel; Trusted_Connection=True;";
     connection.Open();

     SqlCommand cmd = new SqlCommand();
     cmd.CommandText = "Insert INTO tbl_Personel (PersonelIsim,PersonelSoyIsim,PersonelMail,PersonelTel) VALUES ('Fatih', 'ALKAN', 'fatihalkan@mail.com', '05547746909')";
     cmd.Connection = connection;
     cmd.CommandType = CommandType.Text;
     cmd.ExecuteNonQuery();
     connection.Close();

}

SQL Command Metotları

  • CommandText: Parametrik veya parametresiz sql cümlelerinizi atanabileceği özelliktir.
  • CommandType: CommandText ile belirtilen ifadenin, stored procedure’mü, yoksa text’mi ifade ettiğini belirtir.
  • Connection: Sql Command ile yazılan sorgunun hangi veri tabanında çalıştırılması gerektiğini belirtir.
  • ExecuteNonQuery(): Yazılan komut ile etkilenen kayıt sayısının geriye alınabilmesini sağlar.
  • ExecuteScalar(): ExecueNonQuery ile aynı işlemi görür yalnız geriye sadece bir değer döndürür.
  • ExecuteReader(): Sorgu sonucunda geriye gelen verinin uygulama  tarafından alınabilmesini sağlar.
  • ExecuteXmlReader(): Gelen verinin XML formatında okunmasını sağlar.

Bağlantılı (Connected) Model

SqlDataReader

SqlDataReader, adından da anlaşıldığı üzere bağlantılı model bağlantı sağlar. Kısacası uygulamanız veri ile çalıştığı sürece sürekli açık bir bağlantı bekler. Tüm işlemleri anlık olarak yapacağından dolayı veri işlemleri oldukça hızlı gelişir.  Ama büyük datalar ile işlem yaptığınız zaman verileriniz yoğunluğundan dolayı kopukluklar yaşayabilirsiniz.

SqlDataReader Metotları

  • Read(): SqlDataReader’ın en önemli metodudur. Reader’ın veriyi satır satır okur. Her okumadan sonra bir sonraki satıra geçer. Eğer bir sonraki satıra geçemezse yani öyle bir satır yoksa false değerini döner. Böylece Reader ile tüm veri satırlarını tek tek gezmiş oluruz.
  • Get.(): Read() metodu ile okuduğu satırdaki sütunların değerlerini alabilmeyi ve aynı zamanda tiplerini de dönüştürerek alabilmeyi sağlar.
  • Close(): DataReader’in kullandığı connection nesnesini bırakmasını sağlar.

Örnek Kullanım

static void Main(string[] args)
{
     SqlConnection conn = new SqlConnection(); //SQL Connection (Bağlantı oluşturuluyor.)
     conn.ConnectionString = "Server=.; Database=DBPersonel; Trusted_Connection=True;";
     conn.Open();

     SqlCommand cmd = new SqlCommand(); //SQL Command (Veritabanına komut gönderiyoruz.)
     cmd.CommandText = "SELECT * FROM tbl_Personel";
     cmd.Connection = conn;

     SqlDataReader dr; //SQL Data Reader oluşturuldu.
     dr = cmd.ExecuteReader(); //Command ile dönen veri SQLDataReader'a atanıyor.
     
     if (dr.HasRows) //DataReader boş değilse.
     {
          while (dr.Read()) //DataReader'ın okumaya devam ettiği sürece. 
          {
               Console.WriteLine(dr["PersonelIsim"]);
               Console.WriteLine(dr["PersonelMail"]);
          }
     }
     conn.Close();
     dr.Close();
 }

Bağlantısız (Disconnected) Model

SqlDataAdapter

Bu modelin bağlantısız olma özelliği, DataReader nesnesinde olduğu gibi ve o nesnenin en büyük sıkıntısı olan read-only, forward-only olması ve en önemlisi de son satırı okuyana kadar, bağlantının açık kalması gerekliliğinin, bu modelde olmayışıdır.

Kısaca açıklamak gerekirse SqlDataAdapter ile bağlantı sağlandığı zaman, SqlCommand(sorgu) ile gönderilen veri karşılığına gelen tüm datalar çekilir. Geri dönen tüm veriler DataAdapter üzerinde DataTable atanır. Böylece sürekli veriye bağlı kalınmasına gerek kalmaz. Daha sonra uygulama işlemi (örneğin veri silme işlemi) DataTable  üzerinden gerçekleştirir. Eğer işlem bittiyse DataTable üzerinden işlenen veri tekrar veri tabanına bağlantı sağlanarak veri tabanına gönderilir.

DataSet

DataSet, aslında veritabanının uygulama tarafındaki versiyonu olarak düşünülebilir. Veritabanının bire-bir kopyası olarak kullanılabilecek DataSet, uygulamanın çalıştığı makinanın belleğine yerleşir ve orada sanki veritabanıymış gibi kullanılabilir. Mesela bir DataSet üzerinde sorgulamalar, güncellemeler, eklemeler ve kayıt silme işlemleri yapılabilmektedir. Tabiki şunu da karıştırmamak gerekir. Bir DataSet veri tutmaz, veriyi DataSet içerisindeki DataTable adı verilen nesneler tutmaktadır. Bu nedenle, DataAdapter class’ının Fill() metoduna da DataSet’i doldurması söylendiğinde, aslında DataSet içerisinde birden çok DataTable olabilir ve bu tablolar arasında DataRelation adı verilen bağlantı nesneleri yer almaktadır. DataTable nesnesi de aslında içinde bir çok bileşen bulundurmaktadır. Bunların en önemlisi ve tablonun yapısını belirten DataColumn class’ıdır. Bu classla, kolonun yapısı, özellikleri, adı, tipi alabileceği verinin büyüklüğü vb. bilgiler tutulmaktadır. Diğer önemli bir bileşen de DataRow’dur. DataTable içerisindeki her bir satır, DataRow olarak belirtilmektedir. Veriler, DataColumn ve DataRow’ların kesiştiği hücrelerde tutulmaktadır.

Örnek Kullanım

static void Main(string[] args)
{
     SqlConnection conn = new SqlConnection(); //SQL Connection (Bağlantı oluşturuluyor.)
     conn.ConnectionString = "Server=.; Database=DBPersonel; Trusted_Connection=True;";
     conn.Open();

     //SQL Data Adapter ile (Veritabanına komut gönderiyoruz.)
     SqlDataAdapter adaptor = new SqlDataAdapter("SELECT * FROM tbl_Personel",conn);
     DataTable dt = new DataTable(); //DataTable oluşturuyoruz.
     adaptor.Fill(dt); //Adaptor ile gelen veriyi DataTable taşıyoruz.

     DataSet ds = new DataSet();
     ds.Tables.Add(dt); //DataTable Set ile atama yaparak satırlar arasında dönüyoruz.

     for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
     {
         Console.WriteLine(ds.Tables[0].Rows[i]["PersonelMail"].ToString());
     }
}

 

2 comments

  1. Yazınızı çok faydalı buldum. C# ile OOP üzerine belli bir seviyeye geldikten sonra veri tabanı kullanarak önce masaüstü uygulamaları, ardından web programlamaya geçmek hedefim.

    Bunun için öncelikle veri tabanı temelimi oluşturdum. Paralel gelişim göstersin diye uygulamaya yazmaya başladım ancak veri tabanıyla nasıl bağlanılır, bağlandıktan sonra query nasıl yazılır, CRUD işlemleri nasıl yapılır bunlar büyük bir soru işareti olarak bana geri döndü. Biraz araştırma sonucu sizin yazınızla tanıştım. Bu aşamada connected ve disconnected mimariyi detaylı olarak anlatan, ne zaman hangisi kullanılmalıdır tarzında bir yazınız varsa okumak isterim.

    1. Bu konuyu çok detaylıca ve maddeler halinde yazmak lazım. Çok farklı koşullar dahilinde hangi tip bağlantıyı kullanmaya karar vermek aslında biraz da tecrübeyle ilgili. Kısaca bir bilgi vermek lazımsa ani bilgi değişimlerinin olmadığı verilerde disconnected mimariyi tercih etmek daha mantıklıdır. Birde çok büyük veri akışlarında disconnected mimariyi ben tercih ederim genellikle…

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir