«BM364» Veritabanı Uygulamaları
Yaşar GÖZÜDELİ
[email protected] http://blog.verivizyon.com/ygozudeli
“İstemci Tarafta DB Erişimi Kodlamak"
HAFTA
9
Konu Akışı
ADO.NET Bileşenleri
Entity FrameWork ve O/R Mapping
ADO.NET
Veritabanı uygulamalarında veri kaynağına erişim için standart bir yol
ADO.NET' in bağlantılı ve bağlantısız çalışma modları
ADO.NET nesne modeli
Bir veritabanına bağlanıp veri okuma ve değiştirme
işlemini yapabilmek
Veritabanın Uygulamalardaki Rolü
Text dosyası, MSAccess,MySQL, SQL Server, Oracle....
PHP Script,VBScript,JavaScript, VB6.0,C#, VB.NET,Java ile yazılmış veri erişim
Class’ları-Kodları
Windows Ortamı, {ASP.NET, PHP,ASP,JSP}+Browser, Dos Ekranı
ADO.NET (veritabanı Erişim API'leri)
ADO.NET Nesne Modeli-Bağlantılı
İki tür erişim:
Bağlantılı Veri Erişimi
Connection, veritabanı ile bir bağlantı sağlar
Transaction, ACID'i sağlamak için kullanılan bir nesnedir.
DataAdapter Offline ve online verilerin veritabanı ile çift yönlü etkileşimini sağlar
Command, Veritabanına gidecek metin ifadeyi yönetir.
Parametrelerle, metin ifade şekillendirilebilir
DataReader,tek yönlü, ileri doğru küçük çaplı veri okumada kullanılır.
Veri Sağlayıcıları(Data Providers)
Veri Sürücüsü
Uygulama-Veritabanı iletişimi
DLL olarak sistemde kayıtlıdırlar
ADO.NET ile veritabanı
uygulamaları geliştirirken, bu sürücüler kullanılır
Her bir sürücüye özgü veri sağlayıcısı
Özel Veri Sağlayıcıları:
Daha iyi performans
Genel Veri Sağlayıcıları
Daha genel işlev
Veri Sağlayıcısı İsim Uzayı
SQL Server System.Data.SqlClient OLE DB System.Data.OleDb ODBC System.Data.Odbc Oracle System.Data.Oracle
String conStr="Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=NWIND_RW.MDB";
OleDbConnection conn = new OleDbConnection(conStr);
conn.Open();
//… OleDbDataAdapter veya OleDbCommand ile veri işlemleri yapılır
conn.Close();
xxxConnection
OleDbConnection, SqlConnection…
Kullanım: 4 aşama
Oluştur
Aç
Kullan
Kapat
Transaction için destek sağlar
OleDbConnection Örneği:
OleDbConnection ile SQL Server'a Erişim
OleDbConnection conn =new OleDbConnection();
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=.;Database=pubs;Integrated Security=SSPI";
try {
conn.Open();
Console.WriteLine("Bağlantı açıldı");
}
catch(SqlException hata) {
Console.WriteLine(hata.Message.ToString());
}
Finally{
conn.Close();
Console.WriteLine("Bağlantı kapatıldı");
}
ConnectionString
Bir veritabanına erişim için gerekli bütün bilgileri içerir
Çoklu tanımlamalar arasına noktalı virgül konur
Bütün tanımlamalar gerekli olmayabilir
Format ve yapıyı tanımak önemli
Parametreleri ezberlemeye gerek yok
yardım dosyasından-örnekten bakıp yazılır!
OLE-DB Sürücüsü
Veritabanı Sunucu Adı
Veritabanı adı Erişim Modu. Windows hesabından yetkili olanlar erişebilir
conn.ConnectionString= “ Provider = SQLOLEDB ; Data Source = (local)
; Database = pubs ; Integrated Security = SSPI ";
ConnectionString
Bazı Connection String parametreleri
Kullanıcı adı ve şifre verilerek erişiliyor
conn.ConnectionString= "Provider = SQLOLEDB ; Data Source = (local) ; Database = pubs ; user id =webuser; password=w~q12|*- ";
Veritabanının yolu Access içinVeri erişim sürücüsü
OleDbConnection connAccess=new OleDbConnection ("Provider = Microsoft.Jet.OLEDB.4.0 ; data source = c:\\Authors.mdb" );
ConnectionString
using(SqlConnection conn) {
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Database=Friends;User
Id=sa;Password=sa.; ConnectionTimeout=10";
Console.WriteLine(conn.DataBase.ToString());
conn.ChangeDatabase("northwind");
//artık başka bir veritabanına bağlantı sağlıyor conn.Open();
Console.WriteLine("bağlantı açıldı");
conn.Close();
Console.WriteLine("bağlantı kapandı");
}
Çıkışta, connection nesnesinin Dispose() methodu çağrılır
xxxCommand
SqlCommand, OleDbCommand, OracleCommand, OdbcCommand …
Her command kendi connection'ı ile kullanılabilir
Veritabanında çalıştırılacak sorguları tutar, çalıştırır ve yanıt döndürürler
Sorgu = SP adı | tablo adı | SELECT * ifade
Özellikleri
Connection:Bağlantı sağlanan Conn nesnesi. Get ve set
CommandText: Sorgu metni.
CommandType: get-set. Text'deki komut nasıl değerlendirilecek
Text | StoredProcedure | TableDirect
CommandTimeOut: Saniye cinsinden bağlantının açık kalacağı süre
SQL Veri İşleme Dili(DML)
İfade Örnek
SELECT SELECT isim,soyad FROM tbKullanici
WHERE SELECT isim, soyad FROM tbKullanici
WHERE isim LIKE '%xxxxx%'
JOIN SELECT isim,soyad
FROM tbKullanici JOIN tbMakale
ON tbKullanici.KullaniciKod=tbMakale.YazarKod
INSERT INSERT INTO tbKullanici(isim,soyad) VALUES('Ali','Eryat')
UPDATE UPDATE tbKullanici SET isim=xxyy'
WHERE kullaniciKod = 3
DELETE DELETE FROM tbKullanici WHERE kullaniciKod = 3
tbKullanici
kullaniciKod isim soyad
1 Yusuf YAHYA
2 Volkan VERİM
3 Yahya ÖZTÜRK
tbMakale
MakaleKod Makale YazarKod
1 SQL….. 1
2 C#... 2
3 ASP.NET…… 1
•Veritabanına veri eklemek
•Veri Seçmek
•Veri silmek
•Veri Güncellemek için kullanılan standart ifadeler
Command Nesnesi ile Sorguların Kullanımı
OleDbConnection conn = new
OleDbConnection("Provider=SQLOLEDB;data source=.;initial catalog=dbContext;integrated security=SSPI");
String sSql = "INSERT INTO tbKullanici (isim,soyad) VALUES('Ahmet','Eryatan')
";
OleDbCommand cmd=new OleDbCommand(sSQL, conn);
Command Nesnesi ile Sorguyu Çalıştırmak
Command.Text özelliğine yüklenen sorguyu
veritabanına gönderip çalıştırtmak için üç method
ExecuteNonQuery
Geriye Sonuç döndürmeyen sorgular içindir
Kaç adet kayıt etkilendiğini döndürür
SP'den parametre döndürebilir. SELECT sonucu da döndürmez
ExecuteReader
Bir xxxDataReader nüshalandır ve içine gelen sonucu doldurup döndür
ExecuteScalar
Skaler bir sonuç döndürür.
o SELECT COUNT(*) FROM tbKullanici bir sayı döndürür.
Skaler bir sorgu değil ise, 1x1 ile belirtilen hücreyi döndürür
Command ile SQL çalıştırma örneği
OleDbConnection conn = new OleDbConnection("Provider=SQLOLEDB;data source=.;initial catalog=dbContext;integrated security=SSPI");
String sSql = "INSERT INTO tbKullanici (isim,soyad) VALUES('Ahmet','Eryatan')";
OleDbCommand cmd=new OleDbCommand(sSQL, conn);
try{
conn.Open()
int sonuc = cmd.ExecuteNonQuery()
Console.WriteLine("{0} adet kayıt eklendi", sonuc.ToString())
}
catch(OleDbException e){
Console.WriteLine("Hata Oluştu:{0}", e.Message.ToString()) }
Finally{
conn.close();
xxxCommand.CommandType
Command'ın Text özelliğine verilen ifadenin türünü belirtmek için, Command.CommandType özelliği kullanılır
CommandType Açıklama
Text (Default) Sql ifadesi olarak çalıştırılması gerektiğini belirtir
StoredProcedure SP olarak çalıştırılması gerektiğini belirtir
TableDirect Tablo adı verildiğini belirtir ve SELECT * FROM
<tablo_ismi> ile tablonun içeriğinin çekileceğini
belirtir
TableDirect Örneği
// conn nesnesinde bağlantı açıldı
OleDbCommand cmd=new OleDbCommand("tbMarka",conn);
cmd.CommandType=CommandType.TableDirect;
try {
conn.Open();
OleDbDataReader dr;
dr=cmd.ExecuteReader();
while(dr.Read()) {
Console.WriteLine(dr["markaAd"].ToString());
}
dr.Close();
}
catch(Exception hata){
Console.WriteLine(hata.Message.ToString());
}
finally{ conn.Close();
Tablodaki Verilere erişim
SP örneği
STORED PROCEDURE, Veritabanında kayıtlı Sorgulara verilen ad.
C#'taki metodlar gibi davranır.(parametre alır-değer döndürür-parametre döndürür)
İçerisinde SELECT ifadesi varsa, resultset(tablular data) döndürür.
Cmd.CommandType = CommandType.StoredProcedure ile, Command nesnesinin veritabanına SP gönderdiği belirtilir
Örnek bir SP
CREATE PROCEDURE MarkaBul (
@markaKod int )
AS
SELECT markaKod, markaAd FROM tbMarka
WHERE markaKod=@markaKod RETURN
Command ile SP çalıştırmak
SqlCommand cmd=new SqlCommand("MarkaBul",conn);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("@markaKod",SqlDbType.Integer);
cmd.Parameters["@markaKod"].Value=201;
cmd.Parameters["@markaKod"].Direction = try
{ conn.Open();
SqlDataReader dr;
dr = cmd.ExecuteReader();
while(dr.Read()) {
Console.WriteLine(dr["markaKod"].ToString()+"-
"+dr["markaAd"].ToString());
}
dr.Close();
}
catch(Exception hata) {
Console.WriteLine(hata.Message.ToString());
}
xxxDataReader
Sadece ileri yönlü veri okuma için
Basit türden veri okuma işlemleri için hızlı
DataAdapter'e göre daha az yük bindirir.
Nüshalama işlemi için kendi yapıcısı yok
xxxCommand.ExecuteReader() ile nüshalanır ve döndürülür
xxxCommand, açık olduğu sürece veri okuyabilir
Bağlantılı halde veriye erişebilir. Bağlantısız veri tutmaz.
SqlDataReader Örnek
Açılan satırdan, 0 indisli sütunun değeri
Akımı başlat
dataReader kapanınca conn da kapansın
SqlConnection conn = new SqlConnection("data
source=localhost;integrated security=sspi;initial catalog=pubs");
String sSQL="SELECT au_lname,au_fname FROM authors";
SqlCommand cmd=new SqlCommand(sSQL,conn);
conn.Open();
SqlDataReader dr =
cmd.ExecuteReader(CommandBehavioru.CloseConnection);
while(dr.Read()){
Console.WriteLine(dr.GetString(0));
}
dr.Close();
conn.Close();
CommandBehavior Enumaratörü
CloseConnection
Command nesnesine, datareader kapandığında connection'ı da kapatmasını belirtir
KeyInfo
Sorguya ait anahtar alan bilgilerini de içeren bir dataReader nüshalamak için
SchemaOnly
Sorguya ait sadece şemayı içeren bir DataReader nüshalamak için
SequentialAccess
BLOB(Binary Large Object- Text-Binary-Image) türü veritabanı alanlarını sorgularken, bu alana bir streaming sağlayabilmek için.
BLOB alanlar 2GB civarı veri alabilir
SingleResult
Sorgu ne kadar resultset döndürürse döndürsün, ilk resultset'i okuyabilen bir DataReader. Daha iyi performans
SingleRow
Sorgu ne kadar satır döndürürse döndürsün ilk satır erişilebilir.
Daha iyi bir performans
CommandBehavior.SingleRow
SqlConnection conn = new SqlConnection("data
source=localhost;integrated security=sspi;initial catalog=dukkan");
String sSQL="SELECT isim, soyad FROM tbKullanici WHERE kullaniciKod=2";
SqlCommand cmd=new SqlCommand(sSQL,conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavioru.SingleRow);
for(int i=0; i<rd.FieldCount;i++){
Console.WriteLine(dr.GetName(i) +"="+ dr[i].ToString());
}
dr.Close();
conn.Close();
xxxDataReader-2
Önemli özellikleri:
FieldCount: Sorgudan dönen sütun sayısı
RecordsAffected: Sorgudan etkilenen kayıt sayısı
Indeksleyiciler'le veri okunabilir
dr[0] veya dr["isim"]
Veri Okumak için sağladığı Metodlar
dr.GetValue(), GetString(), GetInt32(),… ile veri okunabilir.
dr.Read()
ile bir satır açılır ve okunabilir hale getirilir. True döndürürse satır var demektir.
NextResultSet()
Yığının bir sonraki SELECT' inin sonucu
GetValues()
Geçerli olan satırı döndürür.