HAFTA 8 DB içerisinde CLR Bileşenleri" Yaşar GÖZÜDELİ ygozudeli@verivizyon.com http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları
Konu Akışı SQL Server ve.net CLR SQL Server içerisinde Yönetilebilir Kod Kullanmak www.verivizyon.com 2
Ders-1: SQL Server ve.net CLR.NET Common Language Runtime nedir? Yönetilebilir kodun özellikleri SQL Server - CLR Entegrasyonu Ne zaman Managed? Ne zaman T-SQL Bir Assembly nasıl register edilir? Bir yönetilebilir kod kullanan veritabanı nesnesi nasıl oluşturulur? 3
.NET CLR Mimarisi.NET Framework Class Library Support Thread Support Type Checker Security Engine COM Marshaler Exception Manager Debug Engine MSIL to Native Compilers Code Manager Class Loader Garbage Collector 4
Yönetilebilir Kodun özellikleri Özellik Dil Seçeneği Tip Güvenliği Güvenlik Hızlı geliştirme Uyumluluk Bir çok dil seçeneği Açıklama common type system temelli tip güvenliği Rol temelli kod kaynak erişimi Kodlama süresi açısından hazır temel kütüphaneler avantaj sağlar Managed-Unmanaged kod uyumluluğu 5
SQL Server - CLR Entegrasyonu SQL CLR içerisinde.net assembly lerine erişim ve çalıştırma T-SQL in tamamlayıcısı, CLR!!! managed stored procedures, triggers, userdefined functions, user-defined types ve aggregates kodlanabilir. Entegrasyonun Sağladıkları: Gelişmiş bir programlama modeli Gelişmiş bir güvenlik ve sağlamlık Bilindik bir geliştirme ortamı Performans ve ölçeklenebilirlik 6
Ne zaman.net dilleri vs. Transact-SQL.NET Dilleri Komplike mantıkları kodlamak gerektiğinde.net Framework kütüphanesi gerektiğinde CPU yoğun işlemler gerektiğinde T-SQL Veri erişimi ile ilgili genel konularda. 7
Var olan bir assembly nasıl yüklenir? 1 2 3 Assembly için bir veritabanı ismi verin Assembly nin yolunu verin Assembly için bir güvenlik seviyesi belirtin CREATE ASSEMBLY HelperLibrary FROM '\\Server1\Private\AProject\bin\HelperLibrary.dll' WITH PERMISSION_SET SAFE -- default value CREATE ASSEMBLY Contacts FROM 'C:\AProject\bin\Contacts.dll' WITH PERMISSION_SET EXTERNAL_ACCESS 8
Managed Code kullanan DB Nesnesi Tanımlama 1 2 3 Bilindik şekilde CREATE ifadesini kullan Assembly e bağla Bilindik şekilde db nesnesini kullan CREATE PROCEDURE Person.UpdatePhoneList AS EXTERNAL NAME Contacts.PhoneList.SaveList GO EXEC Person.UpdatePhoneList 9
Pratik-1 Bir assembly i kaydetmek Bir veritabanı öğesi olarak kullanmak 10
Ders: SQL Server da.net Rutinleri Kodlamak Visual Studio içerisinde SQL Server Projesi ile çalışmak System.Data.SqlClient ve Microsoft.SqlServer.Server Namespace leri ile çalışmak Managed Stored Procedures Managed Triggers Managed User-Defined Functions Managed Aggregates Managed User-Defined Data Types Visual Studio ile DB ye Nesne Kaydı 11
Visual Studio da SQL Server projeleri Veritabanı nesneleri oluşturmak için geliştirme ortamı desteği Gerekli dll leri otomatik olarak referans eder System.Data.dll Her bir nesne türü için hazır şablon Stored procedure Trigger User-defined function User-defined type Aggregate Doğrudan SQL Server a kurma desteği sağlar 12
System.Data.SqlClient ve Microsoft.SqlServer.Server SqlContext* SqlConnection SqlCommand SqlParameter SqlPipe* SqlDataReader SqlDataRecord* SqlTransaction SqlTriggerContext * Üstünde çalışılan SQL Server ile ilgili ortama erişim sağlayan sınıf Üstünde çalışılan veya uzaktaki bir SQL Server'a bağlantı sağlamak için kullanılan sınıf Bir bağlantı üstünden T-SQL ifadeleri ve Stored Procedure gibi öğelere erişim ifadesi barındıran ve çalıştırmaya yarayan sınıf Bir Command nesnesine özelliklerini ve değerini tayin ederek parametre aktarmaya veya Command nesnesinin T-SQL çalıştırmasının ardında parametrik sonuçlara erişim sağlayan sınıf SQL Server istemcisine mesaj veya veri göndermek için kullanılan kanal. Stored Procedure'lerin tabular sonuç döndürmesinde de kullanılır Bir sorgunun sonucuna tek yönlü ve okunabilir akıntı erişimi sağlayan sınıf Bir tek satır ve satırın her bir alanına ait özellikleri tutan bir sınıftır. Üstünde çalışılan SQL Server içerisinde geçerli olmak üzere Transaction yönetimi sağlayan sınıf Herhangi bir trigger tetiklenmesinde, tetikleyen olay ve ortama erişimi sağlayan sınıf 13
Managed Stored Procedure Oluşturmak 1 2 3 Bir sınıf içerisinde public static metod tanımla SqlProcedure niteliğini ata managed stored procedure mantığını kodla public class ContactCode { [SqlProcedure(Name="GetContactNames")] public static void GetContactNames() { using( SqlConnection conn = new SqlConnection("context connection=true")) { conn.open(); SqlCommand cmd = new SqlCommand("DELETE FROM person.contact WHERE contactid=2",conn); cmd.executenonquery(); 14
Managed Trigger Kodlamak 1 2 3 Bir sınıf içerisinde public static metod tanımla SqlTrigger niteliğini deployment için tayin et Managed trigger mantığını kodla public class ContactCode { [SqlTrigger(Name="ContactUpdTrg", Target="Person.Contact", Event="FOR UPDATE")] public static void ChangeEmail() { SqlTriggerContext trg = SqlContext.TriggerContext; if (trg.triggeraction == TriggerAction.Update) { if (trg.columnsupdated[7] == true) //send e-mail to each new contact 15
Managed User-Defined Functions Kodlamak 1 2 3 Bir sınıf içerisinde public static metod tanımla SqlFunction niteliklerini tayin et managed function ı kodla public class MyFunctions { [SqlFunction(Name="GetLongDate" )] public static SqlString GetLongDate(SqlDateTime DateVal) { // Return the date as a long string return DateVal.Value.ToLongDateString(); 16
Managed Aggregate Kodlamak 1 2 3 Bir public class oluştur Serializable ve SqlUserDefinedAggregate niteliklerini ver Init, Accumulate, Merge ve Terminate methodlarını kodla [Serializable, SqlUserDefinedAggregate( )] public class CommaDelimit { public void Init() { public void Accumulate(SqlString Value) { public void Merge(CommaDelimit Group) { public SqlString Terminate() { 17
Managed User-Defined Data Type Kodlamak 1 2 3 4 5 Public bir class veya struct tanımla Serializable ve SqlUserDefinedType niteliklerini ver NULL olma durumlarını ele al String dönüşümünü tanımla Private data erişimi için public metodlar ver 18
VS.NET Deployment 1 Managed nesneler kodlarken nitelikleri kullanın [SqlProcedure(Name="ProcName")] public static void Proc ( ) 2 Deploy menu seçeneği ile veritabanına aktarın 19
Ödev www.verivizyon.com 20
Sonuç www.verivizyon.com 21