Slayt 1 - Verivizyon
Transkript
Slayt 1 - Verivizyon
HAFTA 9 “İstemci Tarafta DB Erişimi Kodlamak" Yaşar GÖZÜDELİ [email protected] 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ı PHP Script,VBScript,JavaScript, VB6.0,C#, VB.NET,Java ile yazılmış veri erişim Class’ları-Kodları ADO.NET (veritabanı Erişim API'leri) 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ı: 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 Daha iyi performans Genel Veri Sağlayıcıları Daha genel işlev 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" ); Veritabanının yolu Access içinVeri erişim sürücüsü 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 … Veritabanında çalıştırılacak sorguları tutar, çalıştırır ve yanıt döndürürler Her command kendi connection'ı ile kullanılabilir 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 Ö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 •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 ExecuteReader 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 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 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 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(); Tablodaki Verilere erişim } catch(Exception hata){ Console.WriteLine(hata.Message.ToString()); } finally{ conn.Close(); } 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ı Nüshalama işlemi için kendi yapıcısı yok DataAdapter'e göre daha az yük bindirir. 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(); Akımı başlat SqlDataReader dr = cmd.ExecuteReader(CommandBehavioru.CloseConnection); while(dr.Read()){ Console.WriteLine(dr.GetString(0)); } dataReader kapanınca conn da kapansın dr.Close(); conn.Close(); Açılan satırdan, 0 indisli sütunun değeri 22 CommandBehavior Enumaratörü CloseConnection KeyInfo 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 Sorguya ait sadece şemayı içeren bir DataReader nüshalamak için SequentialAccess Sorguya ait anahtar alan bilgilerini de içeren bir dataReader nüshalamak için SchemaOnly Command nesnesine, datareader kapandığında connection'ı da kapatmasını belirtir 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() NextResultSet() ile bir satır açılır ve okunabilir hale getirilir. True döndürürse satır var demektir. 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