Veritabanı İşlemleri
Bu bölümde; Veritabanı bağlantısı Komutların Yürütülmesi ADO.NET Nesne Modeli kavramları incelenecektir.
ADO.NET (ActiveX Data Objects) ADO.NET, var olan Windows API’lerinden çok daha fazlasıdır. .NET öncesinde var olan ADO ile benzerlik taşısa da, veriye erişim için kullandıkları sınıflar ve metotlar oldukça farklıdır. ADO.NET 4 farklı istemci namespace ile birlikte gelmektedir (SQL Server, Oracle, ODBC veri kaynakları için ve OLEDB veri kaynakları için)
Veri Kaynağı & Veritabanı (Data Source & Database) Veri kaynağı kavramı ile veritabanı kavramı farklıdır. XML, MS Excel, metin dosyası vb. veri kaynağına örnek olarak verilebilir. Veritabanları da veri kaynaklarından bir tanesidir.
ODBC & OLEDB ODBC (Open Database Connectivity): Microsoft’un veritabanlarına programlama dillerinde erişmek için ortaya koyduğu bir standartdır. OLEDB: ODBC’deki dll’lerden apileri çağırmak yerine COM nesneleri üzerinden erişilen halidir.
ODBC ve OLEDB teknolojilerini destekleyen veritabanları, bu teknolojiler sayesinde hemen her uygulamadan erişilebilir hale gelir. Bu yapılar, veritabanlarına erişim için ortak kabul gören bir arabirim oluştururlar.
NameSpace Tanım System.Data Bütün şablon tipli veri erişim sınıfları bulunur. System.Data.Common Dahili veri sağlayıcıları tarafından paylaşılan sınıflar System.Data.Odbc ODBC sağlayıcılarının sınıfları System.Data.OleDb OLEDB sağlayıcılarının sınıfları System.Data.ProviderBase Yeni temel sınıflar ve connection factory sınıfları System.Data.Oracle Oracle sağlayıcı sınıfları
NameSpace Tanım System.Data.Sql SQL Server’ın veriye erişimi için yeni şablon arayüzler ve sınıflar System.Data.SqlClient SQL Server sağlayıcı sınıfları System.Data.SqlTypes SQL Server Veri Türleri İster SQL Server, isterseniz OLEDB sınıflarını kullanıyor olun, ADO.NET’in kendisi bir çok farklı sınıf içerir.
ADO.NET Mimarisi
ADO.NET bu kavramlar doğrultusunda kendisine has sınıflar içermektedir.
NameSpace Tanım DataSet Bu nesne, VT ile bağlantı olmadan da çalışabilir. Farklı DataTable’lar ve bunlar arasındaki ilişkileri barındırır. DataTable DataColumn’lar bir araya gelerek oluşurlar. Bir veya daha çok DataRow içerir. DataRow Birden çok değeri içerir (Kayıtlar) DataColumn Bu nesne, bir sütunun tanımlamasını içerir. DataRelation DataSet içerisindeki DataTable’lar arasındaki bağlantıdır. Constraint DataColumn sınıfı için kural tanımlar.
Özel Veritabanı Sınıfları Ortak sınıflar olduğu gibi ADO.NET, veritabanına özel sınıflar da içerir. Bu sınıflar System.Data namespace’de tanımlanmış olan arayüz sınıflarını implement ederler. Örneğin hem SqlConnection hem de OleDbConnection sınıfları DbConnection sınıfından türemişlerdir.
Kategori İlgili Sınıflar Command SqlCommand, OleDbCommand, OracleCommand ve ODBCCommand DataTable DataColumn’lar bir araya gelerek oluşurlar. Bir veya daha çok DataRow içerir. DataRow Birden çok değeri içerir (Kayıtlar) DataColumn Bu nesne, bir sütunun tanımlamasını içerir. DataRelation DataSet içerisindeki DataTable’lar arasındaki bağlantıdır. Constraint DataColumn sınıfı için kural tanımlar.
Veritabanı Bağlantısı Bir veritabanına bağlanmak için, bağlantı parametrelerini (vt’nin bulunduğu makine, erişim yetkileri) sağlamak gerekir.
İki farklı bağlantı sınıfı dahil oldukları hiyerarşik sistem gösterilmektedir.
using System.Data.SqlClient; namespace DbAccess { class Program static void Main(string[] args) string source = "server=BORA-BILGISAYAR\\SQLEXPRESS;integrated security=SSPI;database=NORTHWND"; SqlConnection conn = new SqlConnection(source); conn.Open(); Console.WriteLine("VT Bağlantısı sağlandı"); conn.Close(); Console.WriteLine("VT Bağlantısı kesildi"); } SSPI : Security Support Provider Interface Windows ortamında doğrulama (authentication) işleminde kullanılan arabirimdir.
SQL Server farklı modlarda doğrulamalara sahiptir SQL Server farklı modlarda doğrulamalara sahiptir. SQL Server’a bağlanmak için Windows Authentication yerine SQL Server’da yetkili olan kullanıcıların da bağlanmasına izin verilebilir (uid/password gibi).
Bağlantı String’ini Yönetmek .NET 2.0 ile birlikte bağlantı stringini belirli bir yerde saklamak mümkündür. Böylelikle VT değiştiğinde kaynak kod üzerinde çok fazla bir değişiklik yapılmasına gerek kalmaz. Bağlantı stringi “Application Configuration File” (App.config) içerisinde XML olarak saklanabilir.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="VT" providerName="System.Data.SqlClient" connectionString="Data Source=localhost\sqlexpress;integrated security=SSPI; database=NORTHWIND" /> </connectionStrings> </configuration>
using System; using System.Data.SqlClient; using System.Configuration; namespace DbAccess { class Program { static void Main(string[] args) string s1 = ConfigurationManager.ConnectionStrings["VT"].ConnectionString; SqlConnection conn = new SqlConnection(s1); conn.Open(); Console.WriteLine("VT Bağlantısı sağlandı"); conn.Close(); Console.WriteLine("VT Bağlantısı kesildi"); }
Komut Türleri (Command Types) Komutlar, en basit haliyle SQL ifadelerini barındıran textlerdir. Komutlar stored procedure olabileceği gibi tablodan satır ve sütun isimlerini de döndürebilir.
static void Main(string[] args) { string s1 = ConfigurationManager static void Main(string[] args) { string s1 = ConfigurationManager.ConnectionStrings["VT"].ConnectionString; string select = "SELECT ContactName,CompanyName FROM Customers"; SqlConnection conn = new SqlConnection(s1); conn.Open(); SqlCommand cmd = new SqlCommand(select, conn); conn.Close(); }
Bu yapıda 3 tür Command bulunmaktadır: Text StoredProcedure TableDirect
Komut Türü Örnek Text (Varsayılan) StoredProcedure TableDirect String select = “SELECT ContactName FROM Customers”; SqlCommand cmd = new SqlCommand(select,conn) StoredProcedure SqlCommand cmd = new SqlCommand(“CustOrderHist”,conn); cmd.CommandType=CommandType.StoredProcedure; cmd.Parameters.AddWithValue(“@CustomerID,”QUICK”); TableDirect OleDbCommand cmd=new OleDbCommand(“Categories”,conn); cmd.Commandtype=CommandType.TableDirect //Tablonun tamamı elde edilmekte //Sadece OleDb’de kullanılabilmektedir.
Komutların Yürütülmesi (Execution) Komutların türlerinin belirlenmesinden sonra bu komutların yürütülmesi gerekmektedir. Komutun yürütülmesinden sonra geriye ne döneceğine bağlı olarak farklı stratejiler bulunmaktadır.
Metotlar Açıklamaları ExecuteNonQuery() Komutu icra eder fakat herhangi bir çıktı vermez. (VT’da kayıtları değiştirmek, silmek, yeni bir kayıt eklemek vb. işlemler). Bu metodun geri dönüş değeri komutun çalıştırıldıktan sonra etkilediği kayıt sayısıdır. ExecuteReader() Komutu icra eder ve IDataReader türünde değer geri döndürür. Bu metot, SQL ifadesinin SELECT komutu içerdiği durumlarda kullanılır. ExecuteScalar() Komutu icra eder ve geriye tek bir değer döndürür. (Örn: Tablodaki kayıt sayısı gibi) ExecuteXmlReader() Komutu icra eder ve XmlReader nesnesi döndürür.
ExecuteNonQuery() static void Main(string[] args) { string source = ConfigurationManager.ConnectionStrings["VT"].ConnectionString; string select = "UPDATE Customers SET ContactName='Bora' WHERE ContactName='Mary Saveley'"; SqlConnection conn = new SqlConnection(source); conn.Open(); SqlCommand cmd = new SqlCommand(select, conn); int rowsreturned = cmd.ExecuteNonQuery(); Console.WriteLine("Değişen satır sayısı = {0}",rowsreturned); conn.Close(); }
ExecuteReader() static void Main(string[] args) { string source = ConfigurationManager.ConnectionStrings["VT"].ConnectionString; string select = "SELECT ContactName,CompanyName FROM Customers"; SqlConnection conn = new SqlConnection(source); conn.Open(); SqlCommand cmd = new SqlCommand(select, conn); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) Console.WriteLine("Contact:{0,-20} Company:{1}",reader[0],reader[1]); } conn.Close();
ExecuteScalar() static void Main(string[] args) { string source = ConfigurationManager.ConnectionStrings["VT"].ConnectionString; string select = "SELECT COUNT(*) FROM Customers"; SqlConnection conn = new SqlConnection(source); conn.Open(); SqlCommand cmd = new SqlCommand(select, conn); object o = cmd.ExecuteScalar(); Console.WriteLine(o); conn.Close(); }