HAFTA 9 İstemci Tarafta DB Erişimi Kodlamak" Yaşar GÖZÜDELİ ygozudeli@verivizyon.com http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları
Konu Akışı ADO.NET Bileşenleri Entity FrameWork ve O/R Mapping www.verivizyon.com 2
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 www.verivizyon.com 3
Veritabanın Uygulamalardaki Rolü Windows Ortamı, {ASP.NET, PHP,ASP,JSP+Browser, Dos Ekranı ADO.NET (veritabanı Erişim API'leri) PHP Script,VBScript,JavaScript, VB6.0,C#, VB.NET,Java ile yazılmış veri erişim Class ları-kodları Text dosyası, MSAccess,MySQL, SQL Server, Oracle... 4
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. 5
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ı SQL Server OLE DB ODBC Oracle İsim Uzayı System.Data.SqlClient System.Data.OleDb System.Data.Odbc System.Data.Oracle 6
xxxconnection OleDbConnection, SqlConnection Kullanım: 4 aşama Oluştur Aç Kullan Kapat Transaction için destek sağlar OleDbConnection Örneği: 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(); 7
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ı"); 8
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ı conn.connectionstring= Provider = SQLOLEDB ; Data Source = (local) ; Database = pubs ; Integrated Security = SSPI "; Veritabanı adı Erişim Modu. Windows hesabından yetkili olanlar erişebilir 9
ConnectionString Bazı Connection String parametreleri OleDbConnection connaccess=new OleDbConnection ("Provider = Microsoft.Jet.OLEDB.4.0 ; data source = c:\\authors.mdb" ); Access içinveri erişim sürücüsü Veritabanının yolu conn.connectionstring= "Provider = SQLOLEDB ; Data Source = (local) ; Database = pubs ; user id =webuser; password=w~q12 *- "; Kullanıcı adı ve şifre verilerek erişiliyor 10
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 11
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 12
SQL Veri İşleme Dili(DML) İfade SELECT WHERE JOIN INSERT UPDATE DELETE Örnek SELECT isim,soyad FROM tbkullanici SELECT isim, soyad FROM tbkullanici WHERE isim LIKE '%xxxxx%' SELECT isim,soyad FROM tbkullanici JOIN tbmakale ON tbkullanici.kullanicikod=tbmakale.yazarkod INSERT INTO tbkullanici(isim,soyad) VALUES('Ali','Eryat') UPDATE tbkullanici SET isim=xxyy' WHERE kullanicikod = 3 DELETE FROM tbkullanici WHERE kullanicikod = 3 Veritabanına veri eklemek Veri Seçmek Veri silmek Veri Güncellemek için kullanılan standart ifadeler 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 13
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); 14
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 15
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(); 16
xxxcommand.commandtype Command'ın Text özelliğine verilen ifadenin türünü belirtmek için, Command.CommandType özelliği kullanılır CommandType Text (Default) Açıklama 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 17
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 18
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 19
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()); finally{ con.close(); 20
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. 21
SqlDataReader Örnek 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 = Akımı başlat cmd.executereader(commandbehavioru.closeconnection); while(dr.read()){ Console.WriteLine(dr.GetString(0)); dr.close(); conn.close(); datareader kapanınca conn da kapansın Açılan satırdan, 0 indisli sütunun değeri 22
CommandBehavior Enumaratörü CloseConnection Command nesnesine, datareader kapandığında connection'ı KeyInfo da kapatmasını belirtir 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 23
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(); 24
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. 25
Ödev Bir adet SQL Server a erişen istemci kod örneği www.verivizyon.com 26
Sonuç Veritabanları sadece insanların sorgulamaları için değildir. Yazılımlar da insanlarla etkileştikten sonra verilerini veritabanlarında saklayıp veritabanlarından okuyarak gösterebilirler. www.verivizyon.com 27