Veritabanı İşlemleri

advertisement
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
tanesidir.
veri kaynaklarından bir
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ı
System.Data.SqlClient
Tanım
SQL Server’ın veriye erişimi
için yeni şablon arayüzler ve
sınıflar
SQL Server sağlayıcı sınıfları
System.Data.SqlTypes
SQL Server Veri Türleri
NameSpace
System.Data.Sql
İ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.
Birden çok değeri içerir (Kayıtlar)
DataRow
DataColumn
DataRelation
Bu nesne, bir sütunun tanımlamasını içerir.
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.
Birden çok değeri içerir (Kayıtlar)
Bu nesne, bir sütunun tanımlamasını içerir.
DataSet içerisindeki DataTable’lar
arasındaki bağlantıdır.
DataRow
DataColumn
DataRelation
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;
using System.Data.SqlClient;
SSPI : Security Support Provider Interface
Windows
ortamında
doğrulama
(authentication)
işleminde
kullanılan
arabirimdir.
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");
}
}
}
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.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) 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,”QUI
CK”);
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();
}
Download