Yönetilen Kod ile Saklı Yordamlar ve Kullanıcı Tanımlı İşlevler Oluşturma (VB)

tarafından Scott Mitchell

PDF’yi İndir

Microsoft SQL Server 2005, geliştiricilerin yönetilen kod aracılığıyla veritabanı nesneleri oluşturmasına olanak sağlamak için .NET Ortak Dil Çalışma Zamanı ile tümleştirilir. Bu öğreticide, Visual Basic veya C# kodunuzla yönetilen saklı yordamların ve yönetilen kullanıcı tanımlı işlevlerin nasıl oluşturulacağı gösterilmektedir. Ayrıca bu Visual Studio sürümlerinin bu tür yönetilen veritabanı nesnelerinde hata ayıklamanıza nasıl olanak tanıyacaklarını da görüyoruz.

Giriş

Microsoft'un SQL Server 2005 gibi veritabanları veri eklemek, değiştirmek ve almak için Transact-Yapılandırılmış Sorgu Dili (T-SQL) kullanır. Çoğu veritabanı sistemi, daha sonra tek ve yeniden kullanılabilir bir birim olarak yürütülebilen bir dizi SQL deyimini gruplandırma yapıları içerir. Saklı yordamlar bir örnektir. Bir diğeri de 9. Adımda daha ayrıntılı bir şekilde inceleyebileceğimiz Kullanıcı Tanımlı İşlevler(UDF) yapısıdır.

Temel olarak SQL, veri kümeleriyle çalışmak için tasarlanmıştır. SELECT, UPDATEve DELETE deyimleri, karşılık gelen tablodaki tüm kayıtlara doğal olarak uygulanır ve yalnızca yan tümceleriyle WHERE sınırlıdır. Ancak aynı anda tek bir kayıtla çalışmak ve skaler verileri işlemek için tasarlanmış birçok dil özelliği vardır. CURSOR bir kayıt kümesinin tek tek döngüye alınmasına izin verir. , CHARINDEXve PATINDEX gibi LEFTdize işleme işlevleri skaler verilerle çalışır. SQL ayrıca ve WHILEgibi IF denetim akışı deyimlerini de içerir.

Microsoft SQL Server 2005'e kadar saklı yordamlar ve UDF'ler yalnızca T-SQL deyimleri koleksiyonu olarak tanımlanabilirdi. Ancak SQL Server 2005, tüm .NET derlemeleri tarafından kullanılan çalışma zamanı olan Common Language Runtime (CLR) ile tümleştirme sağlamak için tasarlanmıştır. Sonuç olarak, SQL Server 2005 veritabanındaki saklı yordamlar ve UDF'ler yönetilen kod kullanılarak oluşturulabilir. Diğer bir ifadeyle, Visual Basic sınıfında yöntem olarak bir saklı yordam veya UDF oluşturabilirsiniz. Bu, bu saklı yordamların ve UDF'lerin .NET Framework ve kendi özel sınıflarınızdan işlevselliği kullanmasına olanak tanır.

Bu öğreticide yönetilen saklı yordamların ve User-Defined İşlevlerinin nasıl oluşturulacağını ve bunların Northwind veritabanımızla nasıl tümleştirileceğini inceleyeceğiz. Haydi başlayalım!

Not

Yönetilen veritabanı nesneleri, SQL karşılıklarına göre bazı avantajlar sunar. Dil zenginliği ve aşinalığı ile mevcut kodu ve mantığı yeniden kullanabilme özelliği temel avantajlardır. Ancak yönetilen veritabanı nesneleri, çok fazla yordam mantığı içermeyen veri kümeleriyle çalışırken daha az verimli olabilir. Yönetilen kodu ve T-SQL'i kullanmanın avantajları hakkında daha kapsamlı bir tartışma için Veritabanı Nesneleri Oluşturmak için Yönetilen Kod Kullanmanın Avantajları'na göz atın.

1. Adım: Northwind Veritabanını App_Data Dışına Taşıma

Şimdiye kadarki tüm öğreticilerimiz web uygulaması App_Data klasöründe bir Microsoft SQL Server 2005 Express Sürüm veritabanı dosyası kullandı. Tüm dosyalar tek bir dizinde App_Data bulunduğundan ve öğreticiyi test etmek için ek yapılandırma adımı gerekmedığından, veritabanını basitleştirilmiş dağıtıma yerleştirme ve bu öğreticileri çalıştırma.

Ancak bu öğretici için Northwind veritabanını dışına App_Data taşıyalım ve SQL Server 2005 Express Sürüm veritabanı örneğine açıkça kaydedelim. Bu öğreticinin adımlarını klasöründeki App_Data veritabanıyla gerçekleştirebilirken, veritabanını SQL Server 2005 Express Sürüm veritabanı örneğine açıkça kaydederek bu adımların birkaçı çok daha basit hale getirilmiştir.

Bu öğreticinin indirmesinde adlı DataFilesbir klasöre yerleştirilen ve NORTHWND_log.LDF adlı iki veritabanı dosyası NORTHWND.MDF bulunur. Öğreticileri kendi uygulamanızla birlikte takip ediyorsanız, Visual Studio'yu kapatın ve ve NORTHWND_log.LDF dosyalarını web sitesinin klasöründen web sitesinin App_Data dışındaki bir klasöre taşıyınNORTHWND.MDF. Veritabanı dosyaları başka bir klasöre taşındıktan sonra Northwind veritabanını SQL Server 2005 Express Sürüm veritabanı örneğine kaydetmemiz gerekir. Bu işlem SQL Server Management Studio yapılabilir. Bilgisayarınızda Express dışı bir SQL Server 2005 Sürümü yüklüyse, büyük olasılıkla Zaten Management Studio yüklüdür. Bilgisayarınızda yalnızca SQL Server 2005 Express Sürüm varsa Microsoft SQL Server Management Studio indirip yüklemek için biraz zaman ayırın.

SQL Server Management Studio'yu başlatın. Şekil 1'de gösterildiği gibi, Management Studio hangi sunucuya bağlanacaklarını sorarak başlar. Sunucu adı olarak localhost\SQLExpress yazın, Kimlik Doğrulaması açılan listesinde Windows Kimlik Doğrulaması'nı seçin ve Bağlan'a tıklayın.

SQL Server Management Studio Sunucuya Bağlan penceresini gösteren ekran görüntüsü.

Şekil 1: Uygun Veritabanı Örneğine Bağlanma

Bağlandıktan sonra, Nesne Gezgini penceresinde veritabanı örnekleri, güvenlik bilgileri, yönetim seçenekleri gibi SQL Server 2005 Express Sürüm veritabanı örneğiyle ilgili bilgiler listelenir.

Klasöründeki DataFiles (veya taşıdığınız her yere) Northwind veritabanını SQL Server 2005 Express Sürüm veritabanı örneğine eklememiz gerekir. Veritabanları klasörüne sağ tıklayın ve bağlam menüsünden Ekle seçeneğini belirleyin. Bu, Veritabanı Ekle iletişim kutusunu açar. Ekle düğmesine tıklayın, uygun NORTHWND.MDF dosyaya gidin ve Tamam'a tıklayın. Bu noktada ekranınız Şekil 2'ye benzer görünmelidir.

Veritabanı MDF dosyasına ekleme işlemini gösteren Veritabanı Ekle penceresinin ekran görüntüsü.

Şekil 2: Uygun Veritabanı Örneğine Bağlanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Management Studio aracılığıyla SQL Server 2005 Express Sürüm örneğine bağlanırken, Veritabanları Ekle iletişim kutusu Belgelerim gibi kullanıcı profili dizinlerinde detaya gitmenize izin vermez. Bu nedenle, ve NORTHWND_log.LDF dosyalarını kullanıcı dışı bir profil dizinine yerleştirdiğinden NORTHWND.MDF emin olun.

Veritabanını eklemek için Tamam düğmesine tıklayın. Veritabanı Ekle iletişim kutusu kapatılır ve Nesne Gezgini artık yeni eklenen veritabanını listelemelidir. Northwind veritabanının gibi 9FE54661B32FDD967F51D71D0D5145CC_LINE ARTICLES\DATATUTORIALS\VOLUME 3\CSHARP\73\ASPNET_DATA_TUTORIAL_75_CS\APP_DATA\NORTHWND.MDFbir ada sahip olma olasılığı vardır. Veritabanına sağ tıklayıp Yeniden Adlandır'ı seçerek veritabanını Northwind olarak yeniden adlandırın.

Veritabanını Northwind olarak yeniden adlandırın

Şekil 3: Veritabanını Northwind olarak yeniden adlandırma

2. Adım: Visual Studio'da Yeni Çözüm Oluşturma ve Proje SQL Server

SQL Server 2005'te yönetilen saklı yordamlar veya UDF'ler oluşturmak için saklı yordamı ve UDF mantığını bir sınıfta Visual Basic kodu olarak yazacağız. Kod yazıldıktan sonra bu sınıfı bir derlemeye (bir .dll dosyaya) derlememiz, derlemeyi SQL Server veritabanına kaydetmemiz ve sonra veritabanında derlemedeki ilgili yöntemi işaret eden bir saklı yordam veya UDF nesnesi oluşturmamız gerekir. Bu adımların tümü el ile gerçekleştirilebilir. Kodu herhangi bir metin düzenleyicisinde oluşturabilir, Visual Basic derleyicisini ()vbc.exe kullanarak komut satırından derleyebilir, komutunu kullanarak CREATE ASSEMBLY veya Management Studio'dan veritabanına kaydedebilir ve benzer yollarla saklı yordamı veya UDF nesnesini ekleyebiliriz. Neyse ki Visual Studio'nun Professional ve Team Systems sürümleri, bu görevleri otomatik hale getiren bir SQL Server Project türü içerir. Bu öğreticide, yönetilen bir saklı yordam ve UDF oluşturmak için SQL Server Proje türünü kullanma adımlarını inceleyeceğiz.

Not

Visual Web Developer veya Visual Studio'nun Standard sürümünü kullanıyorsanız, bunun yerine el ile yaklaşımı kullanmanız gerekir. 13. Adım, bu adımları el ile gerçekleştirmeye yönelik ayrıntılı yönergeler sağlar. Bu adımlar, hangi Visual Studio sürümünü kullandığınızdan bağımsız olarak uygulanması gereken önemli SQL Server yapılandırma yönergelerini içerdiğinden, 13. Adımı okumadan önce 2. ve 12. adımları okumanızı öneririz.

Visual Studio'yu açarak başlayın. Dosya menüsünden Yeni Proje'yi seçerek Yeni Proje iletişim kutusunu görüntüleyin (bkz. Şekil 4). Veritabanı proje türüne gidin ve sağda listelenen Şablonlar'dan yeni bir proje SQL Server oluşturmayı seçin. Bu projeyi ManagedDatabaseConstructs adlandırmayı seçtim ve adlı Tutorial75bir Çözüme yerleştirdim.

Yeni SQL Server Projesi Oluşturma

Şekil 4: Yeni SQL Server Projesi Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Çözümü oluşturmak ve Projeyi SQL Server için Yeni Proje iletişim kutusundaki Tamam düğmesine tıklayın.

SQL Server Projesi belirli bir veritabanına bağlıdır. Sonuç olarak, yeni SQL Server Projesini oluşturduktan sonra hemen bu bilgileri belirtmemiz istenir. Şekil 5'te, 1. Adımda SQL Server 2005 Express Sürüm veritabanı örneğine kaydettiğimiz Northwind veritabanına işaret etmek için doldurulan Yeni Veritabanı Başvurusu iletişim kutusu gösterilmektedir.

SQL Server Projesini Northwind Veritabanı ile ilişkilendirme

Şekil 5: SQL Server Projesini Northwind Veritabanı ile ilişkilendirme

Bu projede oluşturacağımız yönetilen saklı yordamlarda ve UDF'lerde hata ayıklamak için bağlantı için SQL/CLR hata ayıklama desteğini etkinleştirmemiz gerekir. SQL Server Projesini yeni bir veritabanıyla ilişkilendirdiğinizde (Şekil 5'te yaptığımız gibi), Visual Studio bağlantıda SQL/CLR hata ayıklamasını etkinleştirmek isteyip istemediğinizi sorar (bkz. Şekil 6). Evet'e tıklayın.

SQL/CLR Hata Ayıklamasını Etkinleştirme

Şekil 6: SQL/CLR Hata Ayıklamasını Etkinleştirme

Bu noktada çözüme yeni SQL Server Projesi eklendi. Projede oluşturulan yönetilen veritabanı nesnelerinde hata ayıklamak için kullanılan adlı Test.sqldosyaya sahip bir klasör Test Scripts içerir. 12. Adımda hata ayıklamayı inceleyeceğiz.

Artık bu projeye yeni yönetilen saklı yordamlar ve UDF'ler ekleyebiliriz, ancak eklemeden önce mevcut web uygulamamızı Çözüme ekleyelim. Dosya menüsünden Ekle seçeneğini belirleyin ve Var Olan Web Sitesi'ni seçin. Uygun web sitesi klasörüne gidin ve Tamam'a tıklayın. Şekil 7'de gösterildiği gibi, çözüm iki proje içerecek şekilde güncelleştirilir: web sitesi ve ManagedDatabaseConstructs SQL Server Projesi.

Çözüm Gezgini şimdi iki proje içeriyor

Şekil 7: Çözüm Gezgini artık iki proje içeriyor

içindeki NORTHWNDConnectionStringWeb.config değeri şu anda klasördeki dosyaya NORTHWND.MDF başvurur App_Data . Bu veritabanını öğesinden App_Data kaldırdığımız ve SQL Server 2005 Express Sürüm veritabanı örneğine açıkça kaydettiğimiz için değeri buna karşılık olarak güncelleştirmemiz NORTHWNDConnectionString gerekir. Web.config Web sitesinde dosyasını açın ve değerini değiştirerek NORTHWNDConnectionString bağlantı dizesi okumasını sağlayın: Data Source=localhost\SQLExpress;Initial Catalog=Northwind;Integrated Security=True. Bu değişiklik sonrasında içindeki Web.config bölümünüz <connectionStrings> aşağıdakine benzer görünmelidir:

<connectionStrings>
    <add name="NORTHWNDConnectionString" connectionString=
        "Data Source=localhost\SQLExpress;Initial Catalog=Northwind;
            Integrated Security=True;Pooling=false"
        providerName="System.Data.SqlClient" />
</connectionStrings>

Not

Önceki öğreticide açıklandığı gibi, ASP.NET web sitesi gibi bir istemci uygulamasından SQL Server nesnesinde hata ayıklarken bağlantı havuzunu devre dışı bırakmamız gerekir. Yukarıda gösterilen bağlantı dizesi bağlantı havuzunu devre dışı bırakır ( Pooling=false ). yönetilen saklı yordamlarda ve UDF'lerde hata ayıklamayı ASP.NET web sitesinden planlamazsanız, bağlantı havuzunu etkinleştirin.

3. Adım: Yönetilen Saklı Yordam Oluşturma

Northwind veritabanına yönetilen saklı yordam eklemek için öncelikle saklı yordamı SQL Server Projesi'nde bir yöntem olarak oluşturmamız gerekir. Çözüm Gezgini proje adına sağ tıklayın ManagedDatabaseConstructs ve yeni öğe eklemeyi seçin. Bu, projeye eklenebilen yönetilen veritabanı nesnelerinin türlerini listeleyen Yeni Öğe Ekle iletişim kutusunu görüntüler. Şekil 8'de gösterildiği gibi, bunlara saklı yordamlar ve User-Defined İşlevleri dahildir.

İlk olarak, kullanımdan kaldırılan tüm ürünleri döndüren bir saklı yordam ekleyelim. Yeni saklı yordam dosyasını olarak adlandırın GetDiscontinuedProducts.vb.

GetDiscontinuedProducts.vb Adlı Yeni Bir Saklı Yordam Ekleme

Şekil 8: Adlı GetDiscontinuedProducts.vb Yeni Saklı Yordam Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu, aşağıdaki içeriğe sahip yeni bir Visual Basic sınıf dosyası oluşturur:

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public Class StoredProcedures
    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub  GetDiscontinuedProducts ()
        ' Add your code here
    End Sub
End Class

Saklı yordamın adlı StoredProceduresbir sınıf dosyası içinde Partial bir Shared yöntem olarak uygulandığını unutmayın. Ayrıca yöntemi, GetDiscontinuedProducts yöntemini saklı yordam olarak işaretleyen özniteliğiyleSqlProcedure süslenmiştir.

Aşağıdaki kod bir SqlCommand nesnesi oluşturur ve alanı CommandText 1'e eşit olan ürünler için tablodaki Products tüm sütunları döndüren Discontinued bir SELECT sorguya ayarlar. Ardından komutu yürütür ve sonuçları istemci uygulamasına geri gönderir. Bu kodu yöntemine GetDiscontinuedProducts ekleyin.

' Create the command
Dim myCommand As New SqlCommand()
myCommand.CommandText = _
    "SELECT ProductID, ProductName, SupplierID, CategoryID, " & _
    "       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, " & _
    "       ReorderLevel, Discontinued " & _
    "FROM Products " & _
    "WHERE Discontinued = 1"
' Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand)

Tüm yönetilen veritabanı nesneleri, çağıranın bağlamını temsil eden bir SqlContext nesneye erişebilir. özelliği SqlContext aracılığıyla Pipebir SqlPipe nesneye erişim sağlar. Bu SqlPipe nesne, SQL Server veritabanı ile çağıran uygulama arasında bilgi göndermek için kullanılır. Adından da anlaşılacağı gibi, yöntemi geçirilen SqlCommand bir nesneyi yürütür ve sonuçları istemci uygulamasına geri gönderir.ExecuteAndSend

Not

Yönetilen veritabanı nesneleri, küme tabanlı mantık yerine yordam mantığı kullanan saklı yordamlar ve UDF'ler için en uygundur. Yordamsal mantık, veri kümeleriyle satır satır çalışmayı veya skaler verilerle çalışmayı içerir. GetDiscontinuedProducts Ancak yeni oluşturduğumuz yöntemde yordam mantığı yoktur. Bu nedenle, ideal olarak bir T-SQL saklı yordamı olarak uygulanır. Yönetilen saklı yordamları oluşturmak ve dağıtmak için gerekli adımları göstermek için yönetilen bir saklı yordam olarak uygulanır.

4. Adım: Yönetilen Saklı Yordamı Dağıtma

Bu kod tamamlandıktan sonra Northwind veritabanına dağıtmaya hazırız. bir SQL Server Projesinin dağıtılması kodu bir derlemeye derler, derlemeyi veritabanına kaydeder ve veritabanında karşılık gelen nesneleri oluşturarak bunları derlemedeki uygun yöntemlere bağlar. Dağıt seçeneği tarafından gerçekleştirilen tam görev kümesi, 13. Adım'da daha hassas bir şekilde yazılır. Çözüm Gezgini proje adına sağ tıklayın ManagedDatabaseConstructs ve Dağıt seçeneğini belirleyin. Ancak, dağıtım şu hatayla başarısız olur: 'EXTERNAL' yakınında yanlış söz dizimi. Bu özelliği etkinleştirmek için geçerli veritabanının uyumluluk düzeyini daha yüksek bir değere ayarlamanız gerekebilir. Saklı yordam sp_dbcmptleveliçin yardım bölümüne bakın.

Bu hata iletisi, derleme northwind veritabanına kaydedilmeye çalışıldığında oluşur. Bir derlemeyi SQL Server 2005 veritabanına kaydetmek için veritabanının uyumluluk düzeyi 90 olarak ayarlanmalıdır. Varsayılan olarak, yeni SQL Server 2005 veritabanlarının uyumluluk düzeyi 90'dır. Ancak, Microsoft SQL Server 2000 kullanılarak oluşturulan veritabanları varsayılan uyumluluk düzeyi 80'e sahiptir. Northwind veritabanı başlangıçta bir Microsoft SQL Server 2000 veritabanı olduğundan, uyumluluk düzeyi şu anda 80 olarak ayarlanmıştır ve bu nedenle yönetilen veritabanı nesnelerini kaydetmek için 90'a yükseltilmesi gerekir.

Veritabanının uyumluluk düzeyini güncelleştirmek için Management Studio'da Yeni Sorgu penceresi açın ve şunu girin:

exec sp_dbcmptlevel 'Northwind', 90

Yukarıdaki sorguyu çalıştırmak için Araç Çubuğu'ndaki Yürüt simgesine tıklayın.

Northwind Veritabanı Uyumluluk Düzeyini Güncelleştirme

Şekil 9: Northwind Veritabanı Uyumluluk Düzeyini Güncelleştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Uyumluluk düzeyini güncelleştirdikten sonra SQL Server Projesini yeniden dağıtın. Bu kez dağıtım hatasız tamamlanmalıdır.

SQL Server Management Studio dönün, Nesne Gezgini Northwind veritabanına sağ tıklayın ve Yenile'yi seçin. Ardından Programlanabilirlik klasörünün detayına gidin ve Assemblies klasörünü genişletin. Şekil 10'da gösterildiği gibi Northwind veritabanı artık proje tarafından oluşturulan derlemeyi ManagedDatabaseConstructs içerir.

ManagedDatabaseConstructs Derlemesi Artık Northwind Veritabanı ile Kaydedildi

Şekil 10: Derleme ManagedDatabaseConstructs Artık Northwind Veritabanı ile Kayıtlı

Saklı Yordamlar klasörünü de genişletin. Burada adlı GetDiscontinuedProductsbir saklı yordam görürsünüz. Bu saklı yordam dağıtım işlemi tarafından oluşturulmuştur ve derlemedeki yöntemine GetDiscontinuedProductsManagedDatabaseConstructs işaret etmektedir. GetDiscontinuedProducts Saklı yordam yürütürken, sırayla yöntemini yürütürGetDiscontinuedProducts. Bu yönetilen bir saklı yordam olduğundan, Management Studio aracılığıyla düzenlenemez (bu nedenle saklı yordam adının yanındaki kilit simgesi).

GetDiscontinuedProducts Saklı Yordamı Saklı Yordamlar Klasöründe Listelenir

Şekil 11: GetDiscontinuedProducts Saklı Yordam Saklı Yordamlar Klasöründe Listelenir

Yönetilen saklı yordamı çağırmadan önce aşmamız gereken bir engel daha var: veritabanı yönetilen kodun yürütülmesini engelleyecek şekilde yapılandırıldı. Yeni bir sorgu penceresi açıp saklı yordamı yürüterek GetDiscontinuedProducts bunu doğrulayın. Şu hata iletisini alırsınız: .NET Framework kullanıcı kodunun yürütülmesi devre dışı bırakıldı. 'clr etkin yapılandırma seçeneğini etkinleştirin.

Northwind veritabanının yapılandırma bilgilerini incelemek için sorgu penceresine komutunu exec sp_configure girin ve yürütebilirsiniz. Bu, clr etkin ayarının şu anda 0 olarak ayarlandığını gösterir.

Clr özellikli Ayar Şu Anda 0 Olarak Ayarlanmış

Şekil 12: Clr özellikli Ayar Şu Anda 0 olarak ayarlanmıştır (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 12'deki her yapılandırma ayarının yanında dört değer listelendiğini unutmayın: en düşük ve en yüksek değerler ile yapılandırma ve çalıştırma değerleri. Clr özellikli ayarın yapılandırma değerini güncelleştirmek için aşağıdaki komutu yürütür:

exec sp_configure 'clr enabled', 1

öğesini exec sp_configure yeniden çalıştırırsanız yukarıdaki deyimin clr özellikli ayarın yapılandırma değerini 1 olarak güncelleştirdiğini ancak çalıştırma değerinin hala 0 olarak ayarlandığını görürsünüz. Bu yapılandırma değişikliğinin RECONFIGUREetkilenmesi için çalıştırma değerini geçerli yapılandırma değerine ayarlayacak komutu yürütmemiz gerekir. Sorgu penceresine girip RECONFIGURE Araç Çubuğu'ndaki Yürüt simgesine tıklamanız yeterlidir. Şimdi çalıştırırsanız exec sp_configure clr özellikli ayarın yapılandırması ve çalıştırma değerleri için 1 değerini görmeniz gerekir.

CLR etkinleştirilmiş yapılandırma tamamlandıktan sonra yönetilen GetDiscontinuedProducts saklı yordamı çalıştırmaya hazırız. Sorgu penceresinde komutunu execGetDiscontinuedProductsgirin ve yürütür. Saklı yordamı çağırmak, yöntemindeki ilgili yönetilen kodun GetDiscontinuedProducts yürütülmesine neden olur. Bu kod, sonlandırılan tüm ürünleri döndürmek için bir SELECT sorgu verir ve bu verileri bu örnekte SQL Server Management Studio çağıran uygulamaya döndürür. Management Studio bu sonuçları alır ve Sonuçlar penceresinde görüntüler.

GetDiscontinuedProducts Saklı Yordamı, Sonlandırılan Tüm Ürünleri Döndürür

Şekil 13: GetDiscontinuedProducts Saklı Yordam Tüm Sonlandırılan Ürünleri Döndürür (Tam boyutlu görüntüyü görüntülemek için tıklayın)

5. Adım: Giriş Parametrelerini Kabul Eden Yönetilen Saklı Yordamlar Oluşturma

Bu öğreticiler boyunca oluşturduğumuz sorguların ve saklı yordamların birçoğunda parametreler kullanılmıştır. Örneğin, Türü Belirlenmiş DataSet'in TableAdapters öğreticisi için Yeni Saklı Yordamlar Oluşturma öğreticisinde adlı GetProductsByCategoryID@CategoryIDbir giriş parametresi kabul eden adlı bir saklı yordam oluşturduk. Saklı yordam daha sonra, alanı sağlanan @CategoryID parametrenin değeriyle eşleşen tüm ürünleri CategoryID döndürdü.

Giriş parametrelerini kabul eden bir yönetilen saklı yordam oluşturmak için bu parametreleri yöntem tanımında belirtmeniz yeterlidir. Bunu göstermek için adlı projeye GetProductsWithPriceLessThanbaşka bir yönetilen saklı yordam ManagedDatabaseConstructs ekleyelim. Bu yönetilen saklı yordam, fiyat belirten bir giriş parametresi kabul eder ve alanı parametre değerinden küçük olan UnitPrice tüm ürünleri döndürür.

Projeye yeni bir saklı yordam eklemek için, proje adına sağ tıklayın ManagedDatabaseConstructs ve yeni bir saklı yordam eklemeyi seçin. Dosyayı GetProductsWithPriceLessThan.vb olarak adlandırın. 3. Adımda gördüğümüz gibi, bu, sınıfına Partial yerleştirilen adlı GetProductsWithPriceLessThan bir yöntemle yeni bir Visual Basic sınıf StoredProceduresdosyası oluşturur.

yönteminin GetProductsWithPriceLessThan tanımını, adlı price bir SqlMoney giriş parametresi kabul edilecek şekilde güncelleştirin ve sorgu sonuçlarını yürütecek ve döndürecek kodu yazın:

<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub GetProductsWithPriceLessThan(ByVal price As SqlMoney)
    'Create the command
    Dim myCommand As New SqlCommand()
    myCommand.CommandText = _
        "SELECT ProductID, ProductName, SupplierID, CategoryID, " & _
        "       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, " & _
        "       ReorderLevel, Discontinued " & _
        "FROM Products " & _
        "WHERE UnitPrice < @MaxPrice"
    myCommand.Parameters.AddWithValue("@MaxPrice", price)
    ' Execute the command and send back the results
    SqlContext.Pipe.ExecuteAndSend(myCommand)
End Sub

Yönteminin GetProductsWithPriceLessThan tanımı ve kodu, 3. Adımda oluşturulan yöntemin tanımına ve koduna GetDiscontinuedProducts benzer. Tek fark, yöntemin GetProductsWithPriceLessThan giriş parametresi ()price olarak kabul etme, s sorgusunun SqlCommand bir parametre ()@MaxPrice içermesi ve s Parameters koleksiyonuna SqlCommand bir parametre eklenmesi ve değişkenin değerine atanmadırprice.

Bu kodu ekledikten sonra SQL Server Projesini yeniden dağıtın. Ardından SQL Server Management Studio dönün ve Saklı Yordamlar klasörünü yenileyin. Yeni bir girdi görmeniz gerekir. GetProductsWithPriceLessThan Sorgu penceresinden komutunu girin ve çalıştırın. Bu komut exec GetProductsWithPriceLessThan 25, Şekil 14'ün gösterdiği gibi 25 TL'den küçük tüm ürünleri listeler.

25 ABD Dolarının Altındaki Ürünler Görüntüleniyor

Şekil 14: 25 ABD Doları Altındaki Ürünler Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

6. Adım: Veri Erişim Katmanından Yönetilen Saklı Yordamı Çağırma

Bu noktada projeye ve GetProductsWithPriceLessThan yönetilen saklı yordamlarını ManagedDatabaseConstructs ekledik GetDiscontinuedProducts ve bunları Northwind SQL Server veritabanına kaydettik. Ayrıca bu yönetilen saklı yordamları SQL Server Management Studio'den de çağırdık (bkz. Şekil 13 ve 14). Ancak ASP.NET uygulamamızın bu yönetilen saklı yordamları kullanabilmesi için bunları mimarideki Veri Erişimi ve İş Mantığı Katmanlarına eklememiz gerekir. Bu adımda, Türü Belirlenmiş DataSet'in TableAdapters öğreticisi için Yeni Saklı Yordamlar Oluşturma öğreticisinde oluşturulan Türü Belirlenmiş DataSet'e iki yeni yöntem ProductsTableAdapterNorthwindWithSprocs ekleyeceğiz. 7. Adımda BLL'ye karşılık gelen yöntemleri ekleyeceğiz.

NorthwindWithSprocs Visual Studio'da Yazılan Veri Kümesi'ni açın ve adlı GetDiscontinuedProductsöğesine ProductsTableAdapter yeni bir yöntem ekleyerek başlayın. TableAdapter'a yeni bir yöntem eklemek için, Tasarım Aracı TableAdapter adına sağ tıklayın ve bağlam menüsünde Sorgu Ekle seçeneğini belirleyin.

Not

Northwind veritabanını klasörden App_Data SQL Server 2005 Express Sürüm veritabanı örneğine taşıdığımızdan, Web.config ilgili bağlantı dizesi bu değişikliği yansıtacak şekilde güncelleştirilmiş olması şarttır. 2. Adımda içindeki Web.configdeğerin güncelleştirilmesi NORTHWNDConnectionString ele alınmıştı. Bu güncelleştirmeyi yapmayı unuttuysanız Sorgu eklenemedi hata iletisini görürsünüz. TableAdapter'a yeni bir yöntem eklemeye çalışırken iletişim kutusunda nesne Web.config bağlantısı NORTHWNDConnectionString bulunamıyor. Bu hatayı çözmek için Tamam'a Web.config tıklayın ve 2. Adımda açıklandığı gibi değerine gidin ve değeri güncelleştirin NORTHWNDConnectionString . Ardından yöntemini TableAdapter'a yeniden eklemeyi deneyin. Bu kez hatasız çalışması gerekir.

Yeni bir yöntem eklendiğinde, geçmiş öğreticilerde birçok kez kullandığımız TableAdapter Sorgu Yapılandırması sihirbazı başlatılır. İlk adım, TableAdapter'ın veritabanına nasıl erişeceğini belirtmemizi ister: geçici bir SQL deyimi veya yeni veya mevcut bir saklı yordam aracılığıyla. Yönetilen saklı yordamı önceden oluşturup veritabanına kaydettik GetDiscontinuedProducts , Var olan saklı yordamı kullan seçeneğini belirleyin ve İleri'ye basın.

Var olan saklı yordamı kullan Seçeneğini belirleyin

Şekil 15: Var olan saklı yordamı kullan Seçeneğini belirleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekranda yöntemin çağıracağı saklı yordam istenir. Açılan listeden GetDiscontinuedProducts yönetilen saklı yordamı seçin ve İleri'ye basın.

GetDiscontinuedProducts Yönetilen Saklı Yordamını seçin

Şekil 16: Yönetilen Saklı Yordamı seçin GetDiscontinuedProducts (tam boyutlu görüntüyü görüntülemek için tıklayın)

Ardından saklı yordamın satır mı, tek değer mi yoksa hiçbir şey mi döndüreceğini belirtmemiz istenir. GetDiscontinuedProducts Sonlandırılan ürün satırları kümesini döndürdüğünden, ilk seçeneği ( Tablo verileri ) seçin ve İleri'ye tıklayın.

Tablosal Veri Seçeneğini Belirleme

Şekil 17: Tablosal Veri Seçeneğini seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son sihirbaz ekranı, kullanılan veri erişim desenlerini ve sonuçta elde edilen yöntemlerin adlarını belirtmemize olanak tanır. Her iki onay kutusunu da işaretli bırakın ve ve yöntemlerini FillByDiscontinuedGetDiscontinuedProductsadlandırın. Sihirbazı tamamlamak için Son’a tıklayın.

FillByDiscontinued ve GetDiscontinuedProducts Yöntemlerini Adlandırın

Şekil 18: Yöntemleri FillByDiscontinued adlandırın ve GetDiscontinuedProducts (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Yönetilen saklı yordam için ve adlı FillByPriceLessThan yöntemleri GetProductsWithPriceLessThanProductsTableAdapter oluşturmak için GetProductsWithPriceLessThan bu adımları yineleyin.

Şekil 19'da ve GetProductsWithPriceLessThan yönetilen saklı yordamlar ProductsTableAdapter için GetDiscontinuedProducts yöntemleri ekledikten sonra DataSet Tasarım Aracı ekran görüntüsü gösterilmektedir.

ProductsTableAdapter, Bu Adımda Eklenen Yeni Yöntemleri Içerir

Şekil 19: Bu ProductsTableAdapter Adımda Eklenen Yeni Yöntemleri Içerir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

7. Adım: İş Mantığı Katmanına Karşılık Gelen Yöntemler Ekleme

Veri Erişim Katmanı'nı, 4. ve 5. Adımlarda eklenen yönetilen saklı yordamları çağırma yöntemlerini içerecek şekilde güncelleştirdiğimize göre, İş Mantığı Katmanı'na karşılık gelen yöntemleri eklememiz gerekir. Sınıfına aşağıdaki iki yöntemi ProductsBLLWithSprocs ekleyin:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetDiscontinuedProducts() As NorthwindWithSprocs.ProductsDataTable
    Return Adapter.GetDiscontinuedProducts()
End Function
<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsWithPriceLessThan(ByVal priceLessThan As Decimal) _
    As NorthwindWithSprocs.ProductsDataTable
    Return Adapter.GetProductsWithPriceLessThan(priceLessThan)
End Function

Her iki yöntem de tek yapmanız gereken karşılık gelen DAL yöntemini çağırmak ve örneği döndürmektir ProductsDataTable . Her yöntemin DataObjectMethodAttribute üzerindeki işaretleme, bu yöntemlerin ObjectDataSource'un Veri Kaynağını Yapılandırma sihirbazının SELECT sekmesindeki açılan listeye eklenmesine neden olur.

8. Adım: Yönetilen Saklı Yordamları Sunu Katmanından Çağırma

ve yönetilen saklı yordamları çağırma GetDiscontinuedProducts desteği içerecek şekilde genişletilmiş İş Mantığı ve GetProductsWithPriceLessThan Veri Erişim Katmanları ile artık bu saklı yordam sonuçlarını bir ASP.NET sayfası aracılığıyla görüntüleyebiliriz.

Klasördeki AdvancedDAL sayfayı ManagedFunctionsAndSprocs.aspx açın ve Araç Kutusu'ndan bir GridView'ı Tasarım Aracı sürükleyin. GridView s ID özelliğini DiscontinuedProducts akıllı etiketinden ve olarak ayarlayın, bunu adlı DiscontinuedProductsDataSourceyeni bir ObjectDataSource'a bağlayın. ObjectDataSource'ı, sınıfın ProductsBLLWithSprocsGetDiscontinuedProducts yönteminden verilerini çekecek şekilde yapılandırın.

ObjectDataSource'ı ProductsBLLWithSprocs Sınıfını Kullanacak Şekilde Yapılandırma

Şekil 20: ObjectDataSource'ı Sınıfı Kullanacak ProductsBLLWithSprocs Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

SELECT Sekmesindeki Drop-Down Listesinden GetDiscontinuedProducts Yöntemini seçin

Şekil 21: SELECT sekmesindeki GetDiscontinuedProducts Drop-Down Listesinden Yöntemi seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu kılavuz yalnızca ürün bilgilerini görüntülemek için kullanılacağından, UPDATE, INSERT ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın ve son'a tıklayın.

Sihirbazı tamamladıktan sonra, Visual Studio içindeki her veri alanı ProductsDataTableiçin otomatik olarak bir BoundField veya CheckBoxField ekler. ve Discontinueddışındaki tüm bu alanları kaldırmak için ProductName biraz zaman ayırın. Bu noktada GridView ve ObjectDataSource bildirim temelli işaretlemeniz aşağıdakine benzer görünmelidir:

<asp:GridView ID="DiscontinuedProducts" runat="server" 
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="DiscontinuedProductsDataSource">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
            SortExpression="ProductName" />
        <asp:CheckBoxField DataField="Discontinued" 
            HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="DiscontinuedProductsDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetDiscontinuedProducts" TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>

Bu sayfayı bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın. Sayfa ziyaret edildiğinde, ObjectDataSource sınıfın ProductsBLLWithSprocsGetDiscontinuedProducts yöntemini çağırır. 7. Adımda gördüğümüz gibi, bu yöntem saklı yordamı çağıran DAL ProductsDataTable sınıfının GetDiscontinuedProducts yöntemini çağırır GetDiscontinuedProducts . Bu saklı yordam yönetilen bir saklı yordamdır ve 3. Adımda oluşturduğumuz kodu yürütür ve sonlandırılan ürünleri döndürür.

Yönetilen saklı yordam tarafından döndürülen sonuçlar DAL tarafından bir ProductsDataTable içinde paketlenir ve ardından BLL'ye döndürülür ve bu sonuçlar GridView'a bağlanıp görüntülendiği Sunu Katmanına döndürülür. Beklendiği gibi kılavuzda, kullanımdan kaldırılan ürünler listelenir.

Sonlandırılan Ürünler Listelenir

Şekil 22: Sonlandırılan Ürünler Listeleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Daha fazla uygulama için, sayfaya bir TextBox ve başka bir GridView ekleyin. Bu GridView'un GetProductsWithPriceLessThan sınıfın yöntemini çağırarak TextBox'a girilen tutardan küçük ürünleri görüntülemesini ProductsBLLWithSprocs sağlayın.

9. Adım: T-SQL UDF'leri Oluşturma ve Çağırma

User-Defined İşlevleri veya UDF'ler, programlama dillerindeki işlevlerin semantiğini yakından taklit eden veritabanı nesneleridir. Visual Basic'teki bir işlev gibi UDF'ler de değişken sayıda giriş parametresi içerebilir ve belirli bir türde bir değer döndürebilir. UDF skaler verileri (dize, tamsayı vb.) veya tablosal verileri döndürebilir. Skaler veri türü döndüren bir UDF'den başlayarak her iki UDF türüne de hızlıca göz atalım.

Aşağıdaki UDF, belirli bir ürün için stokun tahmini değerini hesaplar. Bunu, belirli bir ürünün , UnitsInStockve Discontinued değerleri olmak üzere UnitPriceüç giriş parametresini alarak yapar ve türünde moneybir değer döndürür. ile çarparak UnitPriceUnitsInStockenvanterin tahmini değerini hesaplar. Sonlandırılan öğeler için bu değer yarıya indirilir.

CREATE FUNCTION udf_ComputeInventoryValue
(
    @UnitPrice money,
    @UnitsInStock smallint,
    @Discontinued bit
)
RETURNS money
AS
BEGIN
    DECLARE @Value decimal
    SET @Value = ISNULL(@UnitPrice, 0) * ISNULL(@UnitsInStock, 0)
    IF @Discontinued = 1
        SET @Value = @Value * 0.5
    
    RETURN @Value
END

Bu UDF veritabanına eklendikten sonra, Management Studio aracılığıyla Programlanabilirlik klasörünü, ardından İşlevler'i ve ardından Skaler değerli İşlevler'i genişleterek bulunabilir. Sorguda SELECT şu şekilde kullanılabilir:

SELECT ProductID, ProductName, dbo.udf_ComputeInventoryValue
    (UnitPrice, UnitsInStock, Discontinued) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC

UDF'yi udf_ComputeInventoryValue Northwind veritabanına ekledim; Şekil 23'de, Management Studio aracılığıyla görüntülendiğinde yukarıdaki SELECT sorgunun çıkışı gösterilmektedir. Ayrıca UDF'nin Nesne Gezgini Scalar-value functions klasörünün altında listelendiğini unutmayın.

Her Ürünün Stok Değerleri Listelenir

Şekil 23: Her Ürünün Stok Değerleri Listelenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

UDF'ler tablo verileri de döndürebilir. Örneğin, belirli bir kategoriye ait ürünleri döndüren bir UDF oluşturabiliriz:

CREATE FUNCTION dbo.udf_GetProductsByCategoryID
(    
    @CategoryID int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT ProductID, ProductName, SupplierID, CategoryID, 
           QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
           ReorderLevel, Discontinued
    FROM Products
    WHERE CategoryID = @CategoryID
)

udf_GetProductsByCategoryID UDF bir @CategoryID giriş parametresi kabul eder ve belirtilen SELECT sorgunun sonuçlarını döndürür. Oluşturulduktan sonra, bu UDF'ye sorgunun FROMSELECT (veya JOIN) yan tümcesinde başvurulabilir. Aşağıdaki örnek, içeceklerin ProductIDher biri için , ProductNameve CategoryID değerlerini döndürür.

SELECT ProductID, ProductName, CategoryID
FROM dbo.udf_GetProductsByCategoryID(1)

UDF'yi udf_GetProductsByCategoryID Northwind veritabanına ekledim; Şekil 24'de, Management Studio aracılığıyla görüntülendiğinde yukarıdaki SELECT sorgunun çıkışı gösterilmektedir. Tablosal veriler döndüren UDF'ler Nesne Gezgini Tablo değeri İşlevleri klasöründe bulunabilir.

Her İçecek için ProductID, ProductName ve CategoryID listelenir

Şekil 24: ProductID, ProductNameve CategoryID Her İçecek için Listelenmiştir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

UDF oluşturma ve kullanma hakkında daha fazla bilgi için bkz. User-Defined İşlevlerine Giriş. Ayrıca User-Defined İşlevlerinin Avantajları ve Dezavantajları'ne göz atın.

10. Adım: Yönetilen UDF Oluşturma

udf_ComputeInventoryValue Yukarıdaki örneklerde oluşturulan ve udf_GetProductsByCategoryID UDF'ler T-SQL veritabanı nesneleridir. SQL Server 2005, 3. ve 5. Adımlardan yönetilen saklı yordamlar gibi projeye eklenebilen ManagedDatabaseConstructs yönetilen UDF'leri de destekler. Bu adım için UDF'yi udf_ComputeInventoryValue yönetilen kodda uygulayalım.

Projeye yönetilen bir UDF eklemek içinManagedDatabaseConstructs, Çözüm Gezgini'da proje adına sağ tıklayın ve Yeni Öğe Ekle'yi seçin. Yeni Öğe Ekle iletişim kutusundan User-Defined Şablonunu seçin ve yeni UDF dosyasını udf_ComputeInventoryValue_Managed.vbadlandırın.

ManagedDatabaseConstructs Projesine Yeni Bir Yönetilen UDF Ekleme

Şekil 25: Projeye Yeni Bir Yönetilen UDF ManagedDatabaseConstructs Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

User-Defined İşlevi şablonu, adı sınıf dosyasının adıyla (udf_ComputeInventoryValue_Managedbu örnekte) aynı olan bir yöntemle adlı UserDefinedFunctions bir sınıf oluştururPartial. Bu yöntem, yöntemi yönetilen bir UDF olarak işaretleyen özniteliği kullanılarak SqlFunctiondekore edilmiştir.

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public Class UserDefinedFunctions
    <Microsoft.SqlServer.Server.SqlFunction()> _
    Public Shared Function udf_ComputeInventoryValue_Managed() As SqlString
        ' Add your code here
        Return New SqlString("Hello")
    End Function
End Class

udf_ComputeInventoryValue yöntemi şu anda bir nesne döndürür ve herhangi bir SqlString giriş parametresi kabul etmez. Yöntem tanımını, , UnitsInStockve Discontinued - UnitPriceüç giriş parametresi kabul edip bir SqlMoney nesne döndürecek şekilde güncelleştirmemiz gerekir. Envanter değerini hesaplama mantığı, T-SQL udf_ComputeInventoryValue UDF'dekiyle aynıdır.

<Microsoft.SqlServer.Server.SqlFunction()> _
Public Shared Function udf_ComputeInventoryValue_Managed _
    (UnitPrice As SqlMoney, UnitsInStock As SqlInt16, Discontinued As SqlBoolean) _
    As SqlMoney
    Dim inventoryValue As SqlMoney = 0
    If Not UnitPrice.IsNull AndAlso Not UnitsInStock.IsNull Then
        inventoryValue = UnitPrice * UnitsInStock
        If Discontinued = True Then
            inventoryValue = inventoryValue * New SqlMoney(0.5)
        End If
    End If
    Return inventoryValue
End Function

UDF yönteminin giriş parametrelerinin ilgili SQL türlerinden olduğunu unutmayın: SqlMoney alanı için UnitPrice , SqlInt16 için UnitsInStockve SqlBoolean için Discontinued. Bu veri türleri tabloda tanımlanan Products türleri yansıtır: UnitPrice sütun türündemoney, türündeki UnitsInStock sütun ve türündeki smallintDiscontinuedbitsütundur.

Kod, 0 değerine atanmış adlı inventoryValue bir SqlMoney örnek oluşturarak başlar. Tablo, Products ve UnitsInStock sütunlarında veritabanı NULL değerlerine UnitsInPrice izin verir. Bu nedenle, önce bu değerlerin s içerip içermediğini NULL denetlememiz gerekir ve bunu s IsNull özelliği aracılığıyla SqlMoney yaparız. Hem hem de UnitPriceUnitsInStock değeri olmayanNULL değerler içeriyorsa, değerini ikisinin ürünü olarak hesaplarız inventoryValue . Doğruysa Discontinued değeri yarıya indiriyoruz.

Not

SqlMoney nesnesi yalnızca iki SqlMoney örneğin birlikte çarpılmasına izin verir. Bir örneğin değişmez değer kayan nokta sayısıyla çarpılmasına izin SqlMoney vermez. Bu nedenle, yarıya inventoryValue inmek için 0,5 değerine sahip yeni SqlMoney bir örnekle çarpıyoruz.

11. Adım: Yönetilen UDF'yi Dağıtma

Yönetilen UDF oluşturulduğuna göre, bunu Northwind veritabanına dağıtmaya hazırız. 4. Adımda gördüğümüz gibi, bir SQL Server Projesindeki yönetilen nesneler, Çözüm Gezgini proje adına sağ tıklayıp bağlam menüsünden Dağıt seçeneği seçilerek dağıtılır.

Projeyi dağıttıktan sonra SQL Server Management Studio dönün ve Skaler değerli İşlevler klasörünü yenileyin. Şimdi iki giriş görmeniz gerekir:

  • dbo.udf_ComputeInventoryValue - 9. Adımda oluşturulan T-SQL UDF ve
  • dbo.udf ComputeInventoryValue_Managed - 10. Adımda oluşturulan ve yeni dağıtılan yönetilen UDF.

Bu yönetilen UDF'yi test etmek için Management Studio'dan aşağıdaki sorguyu yürütür:

SELECT ProductID, ProductName, 
       dbo.udf_ComputeInventoryValue_Managed(
                 UnitPrice, 
                 UnitsInStock, 
                 Discontinued
              ) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC

Bu komut T-SQL udf_ComputeInventoryValue UDF yerine yönetilen udf ComputeInventoryValue_Managed UDF'yi kullanır, ancak çıkış aynıdır. UDF çıktısının ekran görüntüsünü görmek için Şekil 23'e geri bakın.

12. Adım: Yönetilen Veritabanı Nesnesinde Hata Ayıklama

Saklı Yordamlarda Hata Ayıklama öğreticisinde Visual Studio aracılığıyla SQL Server hata ayıklamaya yönelik üç seçeneği ele aldık: SQL Server Projesinden Doğrudan Veritabanı Hata Ayıklama, Uygulama Hata Ayıklama ve Hata Ayıklama. Yönetilen veritabanı nesneleri Doğrudan Veritabanı Hata Ayıklama aracılığıyla hata ayıklanamaz, ancak bir istemci uygulamasından ve doğrudan SQL Server Projesi'nden hata ayıklanabilir. Ancak hata ayıklamanın çalışması için SQL Server 2005 veritabanının SQL/CLR hata ayıklamasına izin vermesi gerekir. Visual Studio projesini ManagedDatabaseConstructs ilk oluşturduğunuzda SQL/CLR hata ayıklamasını etkinleştirmek isteyip istemediğinizi sorduğunu hatırlayın (bkz. 2. Adımdaki Şekil 6). Bu ayar, Sunucu Gezgini penceresinden veritabanına sağ tıklayarak değiştirilebilir.

Veritabanının SQL/CLR Hata Ayıklamasına İzin Verdiğinden Emin Olun

Şekil 26: Veritabanının SQL/CLR Hata Ayıklamasına İzin Verdiğinden Emin Olun

Yönetilen saklı yordamın hatalarını ayıklamak istediğimizi GetProductsWithPriceLessThan düşünün. başlangıç olarak yönteminin kodu GetProductsWithPriceLessThan içinde bir kesme noktası ayarlayacağız.

GetProductsWithPriceLessThan Yönteminde Kesme Noktası Ayarlama

Şekil 27: Yöntemde GetProductsWithPriceLessThan Kesme Noktası Ayarlama (Tam boyutlu görüntüyü görüntülemek için tıklayın)

İlk olarak SQL Server Projesinden yönetilen veritabanı nesnelerinde hata ayıklamaya bakalım. Çözümümüz web sitemizle birlikte SQL Server Projesi olmak üzere iki proje ManagedDatabaseConstructs içerdiğinden, SQL Server Projesinden hata ayıklama yapmak için Visual Studio'ya hata ayıklamaya başladığımızda SQL Server Projesi'ni başlatmasını ManagedDatabaseConstructs emretmeliyiz. Çözüm Gezgini'da projeye sağ tıklayın ManagedDatabaseConstructs ve bağlam menüsünden Başlangıç Projesi Olarak Ayarla seçeneğini belirleyin.

ManagedDatabaseConstructs Proje hata ayıklayıcıdan başlatıldığında, klasöründe bulunan Test Scripts dosyasındaKI SQL deyimlerini Test.sql yürütür. Örneğin, yönetilen saklı yordamı test GetProductsWithPriceLessThan etmek için mevcut Test.sql dosya içeriğini 14,95 değerini geçiren @CategoryID yönetilen saklı yordamı çağıran GetProductsWithPriceLessThan aşağıdaki deyimle değiştirin:

exec GetProductsWithPriceLessThan 14.95

yukarıdaki betiği içine Test.sqlgirdikten sonra Hata Ayıklama menüsüne gidip Hata Ayıklamayı Başlat'ı seçerek veya Araç Çubuğu'ndaki F5'e veya yeşil oynatma simgesine tıklayarak hata ayıklamaya başlayın. Bu işlem, Projeleri Çözüm içinde oluşturur, yönetilen veritabanı nesnelerini Northwind veritabanına dağıtır ve ardından betiği yürütür Test.sql . Bu noktada kesme noktasına ulaşılır ve yönteminde GetProductsWithPriceLessThan adım adım ilerleyebilir, giriş parametrelerinin değerlerini inceleyebilir ve bu şekilde devam edebiliriz.

GetProductsWithPriceLessThan Yöntemindeki Kesme Noktasına Ulaşıldı

Şekil 28: Yöntemdeki GetProductsWithPriceLessThan Kesme Noktasına İsabet Edildi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

BIR SQL veritabanı nesnesinin bir istemci uygulaması aracılığıyla hata ayıklanması için, veritabanının uygulama hata ayıklamasını destekleyecek şekilde yapılandırılması zorunludur. Sunucu Gezgini'nde veritabanına sağ tıklayın ve Uygulama Hata Ayıklama seçeneğinin işaretli olduğundan emin olun. Ayrıca, ASP.NET uygulamasını SQL Hata Ayıklayıcısı ile tümleştirecek ve bağlantı havuzunu devre dışı bırakacak şekilde yapılandırmamız gerekir. Bu adımlar Saklı Yordamlarda Hata Ayıklama öğreticisinin 2. Adımında ayrıntılı olarak açıklandı.

ASP.NET uygulamasını ve veritabanını yapılandırdıktan sonra, ASP.NET web sitesini başlangıç projesi olarak ayarlayın ve hata ayıklamaya başlayın. Kesme noktası olan yönetilen nesnelerden birini çağıran bir sayfayı ziyaret ederseniz uygulama durdurulacak ve denetim hata ayıklayıcıya devredilecek ve burada Şekil 28'de gösterildiği gibi kodda adım adım ilerleyebilirsiniz.

13. Adım: Yönetilen Veritabanı Nesnelerini El ile Derleme ve Dağıtma

SQL Server Projeleri yönetilen veritabanı nesnelerini oluşturmayı, derlemeyi ve dağıtmayı kolaylaştırır. Ne yazık ki SQL Server Projeleri yalnızca Visual Studio'nun Professional ve Team Systems sürümlerinde kullanılabilir. Visual Web Developer veya Visual Studio Standard Edition kullanıyorsanız ve yönetilen veritabanı nesnelerini kullanmak istiyorsanız, bunları el ile oluşturup dağıtmanız gerekir. Bu dört adımdan oluşur:

  1. Yönetilen veritabanı nesnesinin kaynak kodunu içeren bir dosya oluşturun,
  2. nesnesini bir derlemede derleyin,
  3. Derlemeyi SQL Server 2005 veritabanına kaydedin ve
  4. SQL Server içinde derlemede uygun yöntemi işaret eden bir veritabanı nesnesi oluşturun.

Bu görevleri göstermek için, belirtilen değerden daha büyük olan ürünleri döndüren UnitPrice yeni bir yönetilen saklı yordam oluşturalım. Bilgisayarınızda adlı GetProductsWithPriceGreaterThan.vb yeni bir dosya oluşturun ve dosyaya aşağıdaki kodu girin (bunu yapmak için Visual Studio, Not Defteri veya herhangi bir metin düzenleyicisini kullanabilirsiniz):

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public Class StoredProcedures
    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub GetProductsWithPriceGreaterThan(ByVal price As SqlMoney)
        'Create the command
        Dim myCommand As New SqlCommand()
        myCommand.CommandText = _
            "SELECT ProductID, ProductName, SupplierID, CategoryID, " & _
            "       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, " & _
            "       ReorderLevel, Discontinued " & _
            "FROM Products " & _
            "WHERE UnitPrice > @MinPrice"
        myCommand.Parameters.AddWithValue("@MinPrice", price)
        ' Execute the command and send back the results
        SqlContext.Pipe.ExecuteAndSend(myCommand)
    End Sub
End Class

Bu kod, 5. Adımda oluşturulan yöntemle GetProductsWithPriceLessThan neredeyse aynıdır. Tek farklar yöntem adları, WHERE yan tümcesi ve sorguda kullanılan parametre adıdır. yöntemine GetProductsWithPriceLessThan geri döndüğünüzde yan tümcesi WHERE şu şekildedir: WHERE UnitPrice < @MaxPrice. Burada, içinde GetProductsWithPriceGreaterThanşunu kullanırız: WHERE UnitPrice > @MinPrice .

Şimdi bu sınıfı bir derlemede derlememiz gerekiyor. Komut satırından dosyayı kaydettiğiniz GetProductsWithPriceGreaterThan.vb dizine gidin ve C# derleyicisini (csc.exe) kullanarak sınıf dosyasını bir derlemeye derleyin:

vbc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.vb

içinde v bc.exe içeren klasör sistemin PATHiçinde değilse, yoluna tam olarak başvurmanız gerekir, %WINDOWS%\Microsoft.NET\Framework\version\örneğin:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vbc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.vb

derleme GetProductsWithPriceGreaterThan.vb derleme

Şekil 29: Derlemeye Derleme GetProductsWithPriceGreaterThan.vb (Tam boyutlu görüntüyü görüntülemek için tıklayın)

bayrağı, /t Visual Basic sınıf dosyasının bir DLL(yürütülebilir dosya yerine) olarak derlenmesi gerektiğini belirtir. bayrağı, /out sonuçta elde edilen derlemenin adını belirtir.

Not

Sınıf dosyasını komut satırından GetProductsWithPriceGreaterThan.vb derlemek yerine alternatif olarak Visual Basic Express Edition'ı kullanabilir veya Visual Studio Standard Edition'da ayrı bir Sınıf Kitaplığı projesi oluşturabilirsiniz. S ren Jacob Lauritsen, saklı yordam için GetProductsWithPriceGreaterThan kod ve 3, 5 ve 10. Adımlarda oluşturulan iki yönetilen saklı yordam ve UDF ile böyle bir Visual Basic Express Edition projesi sağlamıştır. S ren projesi, ilgili veritabanı nesnelerini eklemek için gereken T-SQL komutlarını da içerir.

Kod bir derlemede derlendiğinde, derlemeyi SQL Server 2005 veritabanına kaydetmeye hazırız. Bu, T-SQL aracılığıyla, komutu CREATE ASSEMBLYkullanılarak veya SQL Server Management Studio aracılığıyla gerçekleştirilebilir. Şimdi Management Studio'yu kullanmaya odaklanalım.

Management Studio'dan Northwind veritabanındaki Programmability klasörünü genişletin. Alt klasörlerinden biri Assemblies'dir. Veritabanına el ile yeni bir Derleme eklemek için Derlemeler klasörüne sağ tıklayın ve bağlam menüsünden Yeni Derleme'yi seçin. Bu, Yeni Derleme iletişim kutusunu görüntüler (bkz. Şekil 30). Gözat düğmesine tıklayın, derlediğimiz derlemeyi ManuallyCreatedDBObjects.dll seçin ve ardından Derlemeyi veritabanına eklemek için Tamam'a tıklayın. Derlemeyi ManuallyCreatedDBObjects.dll Nesne Gezgini görmemeniz gerekir.

ManuallyCreatedDBObjects.dll Derlemesini Veritabanına Ekleme

Şekil 30: Derlemeyi ManuallyCreatedDBObjects.dll Veritabanına Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ManuallyCreatedDBObjects.dll derlemesinin vurgulandığı Nesne Gezgini penceresinin ekran görüntüsü.

Şekil 31: ManuallyCreatedDBObjects.dll Nesne Gezgini

Derlemeyi Northwind veritabanına eklemiş olsak da, henüz bir saklı yordamı derlemedeki yöntemiyle GetProductsWithPriceGreaterThan ilişkilendirmedik. Bunu yapmak için yeni bir sorgu penceresi açın ve aşağıdaki betiği yürütebilirsiniz:

CREATE PROCEDURE [dbo].[GetProductsWithPriceGreaterThan] 
( 
    @price money 
) 
WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [ManuallyCreatedDBObjects].[StoredProcedures].[GetProductsWithPriceGreaterThan] 
GO

Bu, Northwind veritabanında adlı GetProductsWithPriceGreaterThan yeni bir saklı yordam oluşturur ve bunu yönetilen yöntemle GetProductsWithPriceGreaterThan ilişkilendirir (derlemesinde ManuallyCreatedDBObjectsolan sınıfındadırStoredProcedures).

Yukarıdaki betiği yürüttkten sonra, Nesne Gezgini Saklı Yordamlar klasörünü yenileyin. Yanında kilit simgesi bulunan yeni bir saklı yordam girdisi GetProductsWithPriceGreaterThan görmeniz gerekir. Bu saklı yordamı test etmek için sorgu penceresine aşağıdaki betiği girin ve çalıştırın:

exec GetProductsWithPriceGreaterThan 24.95

Şekil 32'de gösterildiği gibi, yukarıdaki komut 24,95 ABD dolarından büyük olan UnitPrice ürünlerin bilgilerini görüntüler.

24,95 TL'den büyük UnitPrice değerine sahip ürünleri görüntüleyen GetProductsWithPriceGreaterThan saklı yordamını gösteren Microsoft SQL Server Management Studio penceresinin ekran görüntüsü.

Şekil 32: Nesne Gezgini ManuallyCreatedDBObjects.dll Listelenir (Tam boyutlu resmi görüntülemek için tıklayın)

Özet

Microsoft SQL Server 2005, veritabanı nesnelerinin yönetilen kod kullanılarak oluşturulmasını sağlayan Common Language Runtime (CLR) ile tümleştirme sağlar. Daha önce, bu veritabanı nesneleri yalnızca T-SQL kullanılarak oluşturulabilirdi, ancak şimdi visual basic gibi .NET programlama dillerini kullanarak bu nesneleri oluşturabiliriz. Bu öğreticide iki yönetilen saklı yordam ve bir yönetilen User-Defined İşlevi oluşturduk.

Visual Studio'nun SQL Server Proje türü, yönetilen veritabanı nesnelerinin oluşturulmasını, derlenmesi ve dağıtılmasını kolaylaştırır. Ayrıca, zengin hata ayıklama desteği sunar. Ancak SQL Server Proje türleri yalnızca Visual Studio'nun Professional ve Team Systems sürümlerinde kullanılabilir. Visual Web Developer veya Visual Studio Standard Edition kullananlar için oluşturma, derleme ve dağıtım adımlarının 13. Adımda gördüğümüz gibi el ile gerçekleştirilmesi gerekir.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçireni S ren Jacob Lauritsen oldu. S ren, bu makaleyi gözden geçirmeye ek olarak, yönetilen veritabanı nesnelerini el ile derlemek için bu makalenin indirmesinde yer alan Visual C# Express Edition projesini de oluşturmuştur. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.