Türü Belirtilmiş DataSet'in TableAdapter’ları için Yeni Saklı Yordam Oluşturma (VB)

tarafından Scott Mitchell

PDF’yi İndir

Önceki öğreticilerde kodumuzda SQL deyimleri oluşturmuş ve deyimlerini yürütülecek veritabanına geçirmişizdir. Alternatif bir yaklaşım, SQL deyimlerinin veritabanında önceden tanımlandığı saklı yordamları kullanmaktır. Bu öğreticide TableAdapter Sihirbazı'nın bizim için yeni saklı yordamlar oluşturmasını nasıl sağlandığı hakkında bilgi edineceğiz.

Giriş

Bu öğreticiler için Veri Erişim Katmanı (DAL), Türü Yazılan Veri Kümeleri'ni kullanır. Veri Erişim Katmanı Oluşturma öğreticisinde açıklandığı gibi, Türü Belirlenmiş Veri Kümeleri kesin türe sahip DataTable'lar ve TableAdapters'lardan oluşur. DataTable'lar sistemdeki mantıksal varlıkları temsil ederken, veri erişim işini gerçekleştirmek için TableAdapters arabirimi temel alınan veritabanıyla birlikte kullanılır. Bu, DataTable'ları verilerle doldurmayı, skaler veri döndüren sorguları yürütmeyi ve veritabanından kayıt eklemeyi, güncelleştirmeyi ve silmeyi içerir.

TableAdapters tarafından yürütülen SQL komutları, gibi SELECT columnList FROM TableNamegeçici SQL deyimleri veya saklı yordamlar olabilir. Mimarimizdeki TableAdapters geçici SQL deyimlerini kullanır. Ancak birçok geliştirici ve veritabanı yöneticisi, güvenlik, bakım ve güncelleştirilebilirlik nedenleriyle geçici SQL deyimleri yerine saklı yordamları tercih eder. Diğerleri esneklikleri için geçici SQL deyimlerini tercih eder. Kendi çalışmamda geçici SQL deyimleri yerine saklı yordamları tercih ediyorum, ancak önceki öğreticileri basitleştirmek için geçici SQL deyimlerini kullanmayı tercih ediyorum.

TableAdapter tanımlarken veya yeni yöntemler eklerken, TableAdapter sihirbazı yeni saklı yordamlar oluşturmayı veya var olan saklı yordamları geçici SQL deyimlerini kullanmak kadar kolay hale getirir. Bu öğreticide TableAdapter sihirbazının saklı yordamları otomatik olarak oluşturmasını sağlamayı inceleyeceğiz. Sonraki öğreticide TableAdapter yöntemlerinin mevcut veya el ile oluşturulmuş saklı yordamları kullanacak şekilde nasıl yapılandırılacağına bakacağız.

Not

Saklı yordamların ve geçici SQL'in artıları ve eksileri hakkında canlı bir tartışma için Rob Howard'ın blog girdisi Henüz Saklı Yordamları Kullanma ? ve Frans Bouma'nın saklı Yordamlar Kötü, M Kay? adlı blog girdisine bakın.

Saklı Yordam Temelleri

İşlevler, tüm programlama dillerinde ortak olan bir yapıdır. İşlev, işlev çağrıldığında yürütülen deyimlerden oluşan bir koleksiyondur. İşlevler giriş parametrelerini kabul edebilir ve isteğe bağlı olarak bir değer döndürebilir. Saklı yordamlar , programlama dillerindeki işlevlerle birçok benzerliği paylaşan veritabanı yapılarıdır. Saklı yordam, saklı yordam çağrıldığında yürütülen bir dizi T-SQL deyiminden oluşur. Saklı yordam, birçok giriş parametresine sıfırı kabul edebilir ve sorgulardan SELECT skaler değerler, çıkış parametreleri veya en yaygın olarak sonuç kümeleri döndürebilir.

Not

Saklı yordamlar genellikleprocs veya SP olarak adlandırılır.

Saklı yordamlar T-SQL deyimi kullanılarak CREATE PROCEDURE oluşturulur. Örneğin, aşağıdaki T-SQL betiği adlı bir saklı yordam oluşturur ve adlı GetProductsByCategoryID@CategoryID tek bir parametre alır ve tablodaki Products eşleşen CategoryID değere sahip bu sütunların , ProductName, UnitPriceve Discontinued alanlarını döndürürProductID:

CREATE PROCEDURE GetProductsByCategoryID
(
    @CategoryID int
)
AS
SELECT ProductID, ProductName, UnitPrice, Discontinued
FROM Products
WHERE CategoryID = @CategoryID

Bu saklı yordam oluşturulduktan sonra aşağıdaki söz dizimi kullanılarak çağrılabilir:

EXEC GetProductsByCategory categoryID

Not

Sonraki öğreticide Visual Studio IDE aracılığıyla saklı yordamlar oluşturmayı inceleyeceğiz. Ancak bu öğretici için TableAdapter sihirbazının saklı yordamları otomatik olarak oluşturmasına izin edelim.

Yalnızca veri döndürmeye ek olarak, saklı yordamlar genellikle tek bir işlem kapsamında birden çok veritabanı komutu gerçekleştirmek için kullanılır. Örneğin, adlı DeleteCategorysaklı yordam bir @CategoryID parametre alabilir ve iki DELETE deyim gerçekleştirebilir: birincisi, ilgili ürünleri silmek için bir tane ve belirtilen kategoriyi silmek için ikinci bir deyim. Saklı yordam içindeki birden çok deyim, bir işlem içinde otomatik olarak sarmalanmaz . Saklı yordamın birden çok komutuna atomik işlem olarak davranıldığından emin olmak için ek T-SQL komutlarının verilmesi gerekir. Sonraki öğreticide saklı yordam komutlarının işlem kapsamında nasıl sarmalandığını göreceğiz.

Bir mimaride saklı yordamları kullanırken, Veri Erişim Katmanı'nın yöntemleri geçici bir SQL deyimi yerine belirli bir saklı yordamı çağırır. Bu, yürütülen SQL deyimlerinin (veritabanında) konumunu uygulama mimarisinde tanımlanmadan merkezileştirir. Bu merkezileştirme, sorguları bulmayı, analiz etmeyi ve ayarlamayı muhtemelen kolaylaştırır ve veritabanının nerede ve nasıl kullanıldığına ilişkin çok daha net bir resim sağlar.

Saklı yordam temelleri hakkında daha fazla bilgi için bu öğreticinin sonundaki Daha Fazla Bilgi bölümündeki kaynaklara bakın.

1. Adım: Gelişmiş Veri Erişim Katmanı Senaryoları Web Sayfaları Oluşturma

Saklı yordamları kullanarak DAL oluşturma tartışmamıza başlamadan önce, web sitesi projemizde bunun için ihtiyacımız olacak ASP.NET sayfalarını ve sonraki birkaç öğreticiyi oluşturmak için biraz zaman ayıralım. başlangıç olarak adlı AdvancedDALyeni bir klasör ekleyin. Ardından, her sayfayı ana sayfayla Site.master ilişkilendirdiğinizden emin olarak aşağıdaki ASP.NET sayfalarını bu klasöre ekleyin:

  • Default.aspx
  • NewSprocs.aspx
  • ExistingSprocs.aspx
  • JOINs.aspx
  • AddingColumns.aspx
  • ComputedColumns.aspx
  • EncryptingConfigSections.aspx
  • ManagedFunctionsAndSprocs.aspx

Gelişmiş Veri Erişim Katmanı Senaryoları Öğreticileri için ASP.NET Sayfaları Ekleme

Şekil 1: Gelişmiş Veri Erişim Katmanı Senaryoları için ASP.NET Sayfaları Ekleme Öğreticileri

Diğer klasörlerde olduğu gibi klasöründe Default.aspx de AdvancedDAL bölümündeki öğreticiler listelenir. Kullanıcı Denetimi'nin SectionLevelTutorialListing.ascx bu işlevi sağladığını hatırlayın. Bu nedenle, bu Kullanıcı Denetimini Default.aspx Çözüm Gezgini sayfanın Tasarım görünümüne sürükleyerek öğesine ekleyin.

SectionLevelTutorialListing.ascx Kullanıcı Denetimini Default.aspx ekleme

Şekil 2: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascxDefault.aspx (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, bu sayfaları dosyaya Web.sitemap girdi olarak ekleyin. Özellikle, Toplu Verilerle <siteMapNode>Çalışma'nın ardından aşağıdaki işaretlemeyi ekleyin:

<siteMapNode url="~/AdvancedDAL/Default.aspx" 
    title="Advanced DAL Scenarios" 
    description="Explore a number of advanced Data Access Layer scenarios.">
    
    <siteMapNode url="~/AdvancedDAL/NewSprocs.aspx" 
        title="Creating New Stored Procedures for TableAdapters" 
        description="Learn how to have the TableAdapter wizard automatically 
            create and use stored procedures." />
    <siteMapNode url="~/AdvancedDAL/ExistingSprocs.aspx" 
        title="Using Existing Stored Procedures for TableAdapters" 
        description="See how to plug existing stored procedures into a 
            TableAdapter." />
    <siteMapNode url="~/AdvancedDAL/JOINs.aspx" 
        title="Returning Data Using JOINs" 
        description="Learn how to augment your DataTables to work with data 
            returned from multiple tables via a JOIN query." />
    <siteMapNode url="~/AdvancedDAL/AddingColumns.aspx" 
        title="Adding DataColumns to a DataTable" 
        description="Master adding new columns to an existing DataTable." />
    <siteMapNode url="~/AdvancedDAL/ComputedColumns.aspx" 
        title="Working with Computed Columns" 
        description="Explore how to work with computed columns when using 
            Typed DataSets." />
    <siteMapNode url="~/AdvancedDAL/EncryptingConfigSections.aspx" 
        title="Protected Connection Strings in Web.config" 
        description="Protect your connection string information in 
            Web.config using encryption." />
    <siteMapNode url="~/AdvancedDAL/ManagedFunctionsAndSprocs.aspx" 
        title="Creating Managed SQL Functions and Stored Procedures" 
        description="See how to create SQL functions and stored procedures 
            using managed code." />
</siteMapNode>

güncelleştirdikten Web.sitemapsonra, öğreticiler web sitesini bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın. Sol taraftaki menü artık gelişmiş DAL senaryoları öğreticilerine yönelik öğeleri içerir.

Site Haritası Artık Gelişmiş DAL Senaryoları Öğreticileri için Girdiler Içeriyor

Şekil 3: Site Haritası Artık Gelişmiş DAL Senaryoları Öğreticileri için Girdiler Içeriyor

2. Adım: TableAdapter'ı Yeni Saklı Yordamlar Oluşturacak Şekilde Yapılandırma

Geçici SQL deyimleri yerine saklı yordamlar kullanan bir Veri Erişim Katmanı oluşturmayı göstermek için adlı NorthwindWithSprocs.xsdklasörde yeni bir Türlenmiş DataSet ~/App_Code/DAL oluşturalım. Önceki öğreticilerde bu süreci ayrıntılı olarak incelediğimizden, buradaki adımlarda hızlı bir şekilde ilerleyeceğiz. Takılı kaldıysanız veya Yazılan Veri Kümesini oluşturma ve yapılandırma konusunda daha fazla adım adım yönergeye ihtiyacınız varsa Veri Erişim Katmanı Oluşturma öğreticisine geri bakın.

Klasöre sağ tıklayıp DAL Yeni Öğe Ekle'yi seçerek ve Şekil 4'te gösterildiği gibi DataSet şablonunu seçerek projeye yeni bir DataSet ekleyin.

NorthwindWithSprocs.xsd Adlı Projeye Yeni Bir Türü Belirlenmiş Veri Kümesi Ekleme

Şekil 4: Adlı NorthwindWithSprocs.xsd Projeye Yeni Yazılan Veri Kümesi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu işlem yeni Yazılan DataSet'i oluşturur, Tasarım Aracı açar, yeni bir TableAdapter oluşturur ve TableAdapter Yapılandırma Sihirbazı'nı başlatır. TableAdapter Yapılandırma Sihirbazı'nın ilk adımı, birlikte çalışacak veritabanını seçmemizi ister. Northwind veritabanına bağlantı dizesi açılan listede listelenmelidir. Bunu seçin ve İleri'ye tıklayın.

Bu sonraki ekranda TableAdapter'ın veritabanına nasıl erişeceğini seçebiliriz. Önceki öğreticilerde sql deyimlerini kullan seçeneğini belirledik. Bu öğretici için ikinci seçenek olan Yeni saklı yordamlar oluştur'u seçin ve İleri'ye tıklayın.

TableAdapter'a Yeni Saklı Yordamlar Oluşturma Talimatı Verme

Şekil 5: TableAdapter'a Yeni Saklı Yordamlar Oluşturma Talimatı Verme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Geçici SQL deyimlerini kullanırken olduğu gibi, aşağıdaki adımda TableAdapter ana sorgusu için deyimini sağlamamız SELECT istenir. Ancak, doğrudan geçici bir sorgu gerçekleştirmek için buraya girilen deyimini kullanmak SELECT yerine TableAdapter sihirbazı bu SELECT sorguyu içeren bir saklı yordam oluşturur.

Bu TableAdapter için aşağıdaki SELECT sorguyu kullanın:

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products

SELECT Sorgusunu Girin

Şekil 6: Sorguyu SELECT Girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Yukarıdaki sorgu, Türü Belirtilen Veri Kümesindeki ana sorgusundan ProductsTableAdapterNorthwind biraz farklıdır. Typed DataSet içindeki öğesinin ProductsTableAdapterNorthwind , her ürünün kategorisi ve sağlayıcısı için kategori adını ve şirket adını geri getirmek için iki bağıntılı alt sorgu içerdiğini hatırlayın. Yaklaşan TableAdapter'ı JOIN'leri Kullanacak Şekilde Güncelleştirme öğreticisinde, bu ilişkili verileri bu TableAdapter'a ekleme konusuna bakacağız.

Biraz zaman ayırıp Gelişmiş Seçenekler düğmesine tıklayın. Burada sihirbazın TableAdapter için ekleme, güncelleştirme ve silme deyimleri oluşturup oluşturmayacağını, iyimser eşzamanlılık kullanıp kullanmayacağını ve ekleme ve güncelleştirmelerden sonra veri tablosunun yenilenip yenilenmeyeceğini belirtebiliriz. Ekleme, Güncelleştirme ve Silme deyimleri oluştur seçeneği varsayılan olarak işaretlidir. Kontrol et. Bu öğretici için İyimser eşzamanlılık seçeneklerini kullan seçeneğini işaretsiz bırakın.

Saklı yordamlar TableAdapter sihirbazı tarafından otomatik olarak oluşturulurken, Veri tablosunu yenile seçeneğinin yoksayıldığı görünür. Bu onay kutusunun işaretli olup olmadığına bakılmaksızın, sonuçta elde edilen ekleme ve güncelleştirme saklı yordamları, 3. Adımda göreceğimiz gibi, yeni eklenen veya yalnızca güncelleştirilmiş kaydı alır.

Ekle, Güncelleştir ve Sil deyimleri Oluştur Seçeneğini İşaretli Bırakın

Şekil 7: Ekle, Güncelleştir ve Sil deyimleri Oluştur Seçeneğini İşaretli Bırakın

Not

İyimser eşzamanlılık kullan seçeneği işaretliyse, sihirbaz yan tümcesine WHERE başka alanlarda değişiklik olduğunda verilerin güncelleştirilmesini engelleyen ek koşullar ekler. TableAdapter'ın yerleşik iyimser eşzamanlılık denetimi özelliğini kullanma hakkında daha fazla bilgi için İyimser Eşzamanlılık Uygulama öğreticisine geri bakın.

Sorguyu SELECT girdikten ve Ekle, Güncelleştir ve Sil deyimleri oluştur seçeneğinin işaretli olduğunu onayladıktan sonra İleri'ye tıklayın. Şekil 8'de gösterilen bu sonraki ekranda, sihirbazın verileri seçmek, eklemek, güncelleştirmek ve silmek için oluşturacağı saklı yordamların adları sorulur. Bu saklı yordam adlarını Products_Select, Products_Insert, Products_Updateve Products_Deleteolarak değiştirin.

Saklı Yordamları Yeniden Adlandırma

Şekil 8: Saklı Yordamları Yeniden Adlandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter sihirbazının dört saklı yordamı oluşturmak için kullanacağı T-SQL'i görmek için SQL Betiğini Önizle düğmesine tıklayın. SQL Betiğini Önizleme iletişim kutusundan betiği bir dosyaya kaydedebilir veya panoya kopyalayabilirsiniz.

Saklı Yordamları Oluşturmak için Kullanılan SQL Betiğini Önizleme

Şekil 9: Saklı Yordamları Oluşturmak için Kullanılan SQL Betiğini Önizleme

Saklı yordamları adlandırdıktan sonra, TableAdapter'a karşılık gelen yöntemleri adlandırmak için İleri'ye tıklayın. Geçici SQL deyimlerini kullanırken olduğu gibi, var olan bir DataTable'ı dolduran veya yeni bir tane döndüren yöntemler oluşturabiliriz. TableAdapter'ın kayıtları eklemek, güncelleştirmek ve silmek için DB-Direct desenini ekleyip eklemeyeceğini de belirtebiliriz. Üç onay kutusunun tümünü de işaretli bırakın, ancak Return a DataTable yöntemini GetProducts olarak yeniden adlandırın (Şekil 10'da gösterildiği gibi).

Yöntemleri Fill ve GetProducts olarak adlandırın

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

Sihirbazın gerçekleştireceği adımların özetini görmek için İleri'ye tıklayın. Son düğmesine tıklayarak sihirbazı tamamlayın. Sihirbaz tamamlandıktan sonra DataSet'in Tasarım Aracı döndürülür ve bu da artık öğesini ProductsDataTableiçermelidir.

DataSet'in Tasarım Aracı Yeni Eklenen ÜrünlerDataTable'ını gösterir

Şekil 11: DataSet s Tasarım Aracı Yeni Eklenenleri ProductsDataTable Gösterir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: Yeni Oluşturulan Saklı Yordamları inceleme

2. Adımda kullanılan TableAdapter sihirbazı verileri seçmek, eklemek, güncelleştirmek ve silmek için saklı yordamları otomatik olarak oluşturmuştur. Bu saklı yordamlar, Sunucu Gezgini'ne gidip veritabanının Saklı Yordamlar klasöründe detaya gidilerek Visual Studio aracılığıyla görüntülenebilir veya değiştirilebilir. Şekil 12'de gösterildiği gibi Northwind veritabanı dört yeni saklı yordam içerir: Products_Delete, Products_Insert, Products_Selectve Products_Update.

2. Adımda Oluşturulan Dört Saklı Yordam Veritabanının Saklı Yordamlar Klasöründe Bulunabilir

Şekil 12: 2. Adımda Oluşturulan Dört Saklı Yordam, Veritabanının Saklı Yordamlar Klasöründe Bulunabilir

Not

Sunucu Gezgini'ni görmüyorsanız Görünüm menüsüne gidin ve Sunucu Gezgini seçeneğini belirleyin. 2. Adım'dan ürünle ilgili saklı yordamları görmüyorsanız Saklı Yordamlar klasörüne sağ tıklayıp Yenile'yi seçmeyi deneyin.

Saklı yordamı görüntülemek veya değiştirmek için Sunucu Gezgini'nde adına çift tıklayın veya alternatif olarak saklı yordama sağ tıklayıp Aç'ı seçin. Şekil 13'de Products_Delete açıldığında saklı yordam gösterilmektedir.

Saklı Yordamlar Visual Studio İçinden Açılabilir ve Değiştirilebilir

Şekil 13: Saklı Yordamlar Visual Studio İçinden Açılabilir ve Değiştirilebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Hem hem Products_Select de Products_Delete saklı yordamların içeriği oldukça basittir. Products_InsertProducts_Update Ve saklı yordamları ise ve deyimlerinden UPDATEINSERT sonra bir deyim gerçekleştirdikleri için daha yakın bir SELECT incelemeyi garanti eder. Örneğin, aşağıdaki SQL saklı yordamı oluşturur Products_Insert :

ALTER PROCEDURE dbo.Products_Insert
(
    @ProductName nvarchar(40),
    @SupplierID int,
    @CategoryID int,
    @QuantityPerUnit nvarchar(20),
    @UnitPrice money,
    @UnitsInStock smallint,
    @UnitsOnOrder smallint,
    @ReorderLevel smallint,
    @Discontinued bit
)
AS
    SET NOCOUNT OFF;
INSERT INTO [Products] ([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], 
    [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) 
VALUES (@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, 
    @UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued);
    
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, 
    UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 
FROM Products 
WHERE (ProductID = SCOPE_IDENTITY())

Saklı yordam, TableAdapter sihirbazında belirtilen sorgu tarafından SELECT döndürülen sütunları giriş parametreleri Products olarak kabul eder ve bu değerler bir INSERT deyimde kullanılır. deyiminin INSERT ardından, yeni eklenen kaydın Products sütun değerlerini (dahil) ProductIDdöndürmek için bir SELECT sorgu kullanılır. Bu yenileme özelliği, yeni eklenen ProductRow örnek ProductID özelliklerini veritabanı tarafından atanan otomatik olarak artan değerlerle otomatik olarak güncelleştirdiğinden Batch Update düzenini kullanarak yeni bir kayıt eklerken kullanışlıdır.

Aşağıdaki kodda bu özellik gösterilmektedir. Yazılan Veri Kümesi için NorthwindWithSprocs oluşturulan ve ProductsTableAdapterProductsDataTable öğesini içerir. Bir örnek oluşturarak, değerlerini sağlayarak ve tableAdapter Update yöntemini çağırarak veritabanına yeni bir ProductsRow ürün eklenir ve değerini geçirirProductsDataTable. TableAdapter Update yöntemi dahili olarak, geçirilen DataTable'daki örnekleri numaralandırır ProductsRow (bu örnekte yalnızca bir tane vardır - yeni eklediğimiz yöntem) ve uygun ekleme, güncelleştirme veya silme komutunu gerçekleştirir. Bu durumda, tabloya Products_Insert yeni bir kayıt ekleyen ve yeni eklenen kaydın Products ayrıntılarını döndüren saklı yordam yürütülür. Ardından ProductsRow örneğin ProductID değeri güncelleştirilir. Update Yöntem tamamlandıktan sonra yeni eklenen kaydın s ProductID değerine s ProductID özelliği aracılığıyla ProductsRow erişebiliriz.

' Create the ProductsTableAdapter and ProductsDataTable
Dim productsAPI As New NorthwindWithSprocsTableAdapters.ProductsTableAdapter 
Dim products As New NorthwindWithSprocs.ProductsDataTable
' Create a new ProductsRow instance and set its properties
Dim product As NorthwindWithSprocs.ProductsRow = products.NewProductsRow()
product.ProductName = "New Product"
product.CategoryID = 1  ' Beverages
product.Discontinued = False
' Add the ProductsRow instance to the DataTable
products.AddProductsRow(product)
' Update the DataTable using the Batch Update pattern
productsAPI.Update(products)
' At this point, we can determine the value of the newly-added record's ProductID
Dim newlyAddedProductIDValue as Integer = product.ProductID

Saklı Products_Update yordam benzer şekilde deyiminden UPDATE sonra bir SELECT deyim içerir.

ALTER PROCEDURE dbo.Products_Update
(
    @ProductName nvarchar(40),
    @SupplierID int,
    @CategoryID int,
    @QuantityPerUnit nvarchar(20),
    @UnitPrice money,
    @UnitsInStock smallint,
    @UnitsOnOrder smallint,
    @ReorderLevel smallint,
    @Discontinued bit,
    @Original_ProductID int,
    @ProductID int
)
AS
    SET NOCOUNT OFF;
UPDATE [Products] 
SET [ProductName] = @ProductName, [SupplierID] = @SupplierID, 
    [CategoryID] = @CategoryID, [QuantityPerUnit] = @QuantityPerUnit, 
    [UnitPrice] = @UnitPrice, [UnitsInStock] = @UnitsInStock, 
    [UnitsOnOrder] = @UnitsOnOrder, [ReorderLevel] = @ReorderLevel, 
    [Discontinued] = @Discontinued 
WHERE (([ProductID] = @Original_ProductID));
    
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, 
    UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 
FROM Products 
WHERE (ProductID = @ProductID)

Bu saklı yordamın için ProductIDiki giriş parametresi içerdiğini unutmayın: @Original_ProductID ve @ProductID. Bu işlevsellik, birincil anahtarın değiştirilebileceği senaryolara olanak tanır. Örneğin, bir çalışan veritabanında her çalışan kaydı, birincil anahtarı olarak çalışanın sosyal güvenlik numarasını kullanabilir. Mevcut bir çalışanın sosyal güvenlik numarasını değiştirmek için hem yeni sosyal güvenlik numarası hem de orijinali sağlanmalıdır. Tablo için Products bu tür işlevler gerekli değildir çünkü ProductID sütun bir IDENTITY sütundur ve hiçbir zaman değiştirilmemelidir. Aslında saklı UPDATE yordamdaki Products_Update deyimi sütun listesindeki sütunu içermez ProductID . Bu nedenle, deyimi s WHERE yan tümcesinde UPDATE kullanılırken@Original_ProductID, tablo için Products gereksizdir ve parametresiyle @ProductID değiştirilebilir. Saklı yordam parametrelerini değiştirirken, bu saklı yordamı kullanan TableAdapter yöntemlerinin de güncelleştirilmiş olması önemlidir.

4. Adım: Saklı Yordam Parametrelerini Değiştirme ve TableAdapter'ı Güncelleştirme

@Original_ProductID Parametresi gereksiz olduğundan, bunu saklı yordamdan Products_Update tamamen kaldıralım. Products_Update saklı yordamı açın, parametresini @Original_ProductID silin ve deyiminin UPDATE yan tümcesinde WHERE parametresinin adını olarak @Original_ProductID@ProductIDdeğiştirin. Bu değişiklikleri yaptıktan sonra saklı yordam içindeki T-SQL aşağıdaki gibi görünmelidir:

ALTER PROCEDURE dbo.Products_Update
(
    @ProductName nvarchar(40),
    @SupplierID int,
    @CategoryID int,
    @QuantityPerUnit nvarchar(20),
    @UnitPrice money,
    @UnitsInStock smallint,
    @UnitsOnOrder smallint,
    @ReorderLevel smallint,
    @Discontinued bit,
    @ProductID int
)
AS
    SET NOCOUNT OFF;
UPDATE [Products] SET [ProductName] = @ProductName, [SupplierID] = @SupplierID, 
    [CategoryID] = @CategoryID, [QuantityPerUnit] = @QuantityPerUnit, 
    [UnitPrice] = @UnitPrice, [UnitsInStock] = @UnitsInStock, 
    [UnitsOnOrder] = @UnitsOnOrder, [ReorderLevel] = @ReorderLevel, 
    [Discontinued] = @Discontinued 
WHERE (([ProductID] = @ProductID));
    
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, 
    UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 
FROM Products 
WHERE (ProductID = @ProductID)

Bu değişiklikleri veritabanına kaydetmek için araç çubuğundaki Kaydet simgesine tıklayın veya Ctrl+S tuşlarına basın. Bu noktada saklı Products_Update yordam bir @Original_ProductID giriş parametresi beklemez, ancak TableAdapter böyle bir parametreyi geçirecek şekilde yapılandırılır. DataSet Tasarım Aracı TableAdapter'ı seçip Özellikler penceresi gidip s koleksiyonundaki üç noktaya tıklayarak TableAdapter'ın UpdateCommandParameters saklı yordama göndereceği Products_Update parametreleri görebilirsiniz. Bu, Şekil 14'te gösterilen Parametre Koleksiyonu Düzenleyici iletişim kutusunu açar.

Parameters Koleksiyonu Products_Update Saklı Yordamına Geçirilen Parametreleri Düzenleyici Listeler

Şekil 14: Saklı Yordama Geçirilen Products_Update Parametreler Düzenleyici Listeler Parametre Koleksiyonu

Üye listesinden parametreyi @Original_ProductID seçip Kaldır düğmesine tıklayarak bu parametreyi buradan kaldırabilirsiniz.

Alternatif olarak, Tasarım Aracı TableAdapter'a sağ tıklayıp Yapılandır'ı seçerek tüm yöntemler için kullanılan parametreleri yenileyebilirsiniz. Bu, tableAdapter Yapılandırma sihirbazını getirir ve saklı yordamların almayı beklediği parametrelerle birlikte seçme, ekleme, güncelleştirme ve silme için kullanılan saklı yordamları listeler. Güncelleştir açılan listesine tıklarsanız, artık içermeyen @Original_ProductID saklı yordamların beklenen giriş parametrelerini görebilirsiniz Products_Update (bkz. Şekil 15). TableAdapter tarafından kullanılan parametre koleksiyonunu otomatik olarak güncelleştirmek için Son'a tıklamanız yeterlidir.

Alternatif olarak TableAdapter Yapılandırma Sihirbazı'nı Kullanarak Yöntemlerini Parametre Koleksiyonlarını Yenileyebilirsiniz

Şekil 15: Alternatif olarak TableAdapter Yapılandırma Sihirbazı'nı Kullanarak Yöntemlerinin Parametre Koleksiyonlarını Yenileyebilirsiniz (Tam boyutlu görüntüyü görüntülemek için tıklayın)

5. Adım: Ek TableAdapter Yöntemleri Ekleme

Adım 2'de gösterildiği gibi, yeni bir TableAdapter oluştururken ilgili saklı yordamların otomatik olarak oluşturulması kolaydır. TableAdapter'a ek yöntemler eklerken de aynı durum geçerlidir. Bunu göstermek için 2. Adımda oluşturulan öğesine ProductsTableAdapter bir GetProductByProductID(productID) yöntem ekleyelim. Bu yöntem bir ProductID değer girişi olarak alır ve belirtilen ürünle ilgili ayrıntıları döndürür.

TableAdapter'a sağ tıklayıp bağlam menüsünden Sorgu Ekle'yi seçerek başlayın.

TableAdapter'a Yeni Sorgu Ekleme

Şekil 16: TableAdapter'a Yeni Sorgu Ekleme

Bu, TableAdapter Sorgu Yapılandırması sihirbazını başlatır ve ilk olarak TableAdapter'ın veritabanına nasıl erişeceğini sorar. Yeni bir saklı yordam oluşturmak için Yeni saklı yordam oluştur seçeneğini belirleyin ve İleri'ye tıklayın.

Yeni saklı yordam oluştur Seçeneğini belirleyin

Şekil 17: Yeni saklı yordam oluştur Seçeneğini belirleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekran, yürütülecek sorgunun türünü tanımlamamızı ister; bunun bir satır kümesi mi yoksa tek bir skaler değer mi döndüreceğini ya da bir UPDATE, INSERTveya DELETE deyimini gerçekleştirmesini ister. GetProductByProductID(productID) Yöntemi bir satır döndüreceğinden, satır döndüren SEÇ seçeneğini seçili bırakın ve İleri'ye basın.

Satır seçeneğini döndüren SEÇ'i seçin

Şekil 18: Satır seçeneğini döndüren SELECT'i seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekranda TableAdapter ana sorgusu görüntülenir ve bu sorgu yalnızca saklı yordamın (dbo.Products_Select) adını listeler. Saklı yordam adını, belirtilen bir ürünün tüm ürün alanlarını döndüren aşağıdaki SELECT deyimle değiştirin:

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products
WHERE ProductID = @ProductID

Saklı Yordam Adını SELECT Sorgusuyla Değiştirme

Şekil 19: Saklı Yordam Adını Sorguyla SELECT Değiştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekran, oluşturulacak saklı yordamı adlandırmanızı ister. Adı Products_SelectByProductID girin ve İleri'ye tıklayın.

Yeni Saklı Yordamı Products_SelectByProductID Adlandırın

Şekil 20: Yeni Saklı Yordamı Products_SelectByProductID Adlandırın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbazın son adımı, oluşturulan yöntem adlarını değiştirmemize ve DataTable doldurma deseninin mi, DataTable deseninin mi yoksa her ikisinin mi kullanılacağını belirtmemize olanak tanır. Bu yöntem için her iki seçeneği de işaretli bırakın, ancak yöntemleri ve GetProductByProductIDolarak FillByProductID yeniden adlandırın. Sihirbazın gerçekleştireceği adımların özetini görüntülemek için İleri'ye tıklayın ve sonra sihirbazı tamamlamak için Son'a tıklayın.

TableAdapter Yöntemlerini FillByProductID ve GetProductByProductID olarak yeniden adlandırın

Şekil 21: TableAdapter Yöntemlerini ve GetProductByProductID olarak yeniden adlandırın FillByProductID (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbazı tamamladıktan sonra TableAdapter'ın yeni bir yöntemi vardır GetProductByProductID(productID) . Bu yöntem çağrıldığında yeni oluşturulan saklı yordamı yürütür Products_SelectByProductID . Saklı Yordamlar klasörünü açıp açarak Products_SelectByProductID (görmüyorsanız Saklı Yordamlar klasörüne sağ tıklayıp Yenile'yi seçerek) bu yeni saklı yordamı Sunucu Gezgini'nden görüntülemek için biraz zaman ayırın.

Saklı yordamın SelectByProductID bir giriş parametresi olarak aldığını @ProductID ve sihirbaza girdiğimiz deyimini yürüttüğüne SELECT dikkat edin.

ALTER PROCEDURE dbo.Products_SelectByProductID
(
    @ProductID int
)
AS
    SET NOCOUNT ON;
SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products
WHERE ProductID = @ProductID

6. Adım: İş Mantığı Katmanı Sınıfı Oluşturma

Öğretici serisi boyunca, Sunu Katmanı'nın tüm çağrılarını İş Mantığı Katmanı'na (BLL) yaptığı katmanlı bir mimariyi korumaya çalışıyoruz. Bu tasarım kararına uymak için, Sunu Katmanı'ndan ürün verilerine erişebilmek için önce yeni Türü Belirlenmiş DataSet için bir BLL sınıfı oluşturmamız gerekir.

klasöründe adlı ProductsBLLWithSprocs.vb~/App_Code/BLL yeni bir sınıf dosyası oluşturun ve bu dosyaya aşağıdaki kodu ekleyin:

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class ProductsBLLWithSprocs
    Private _productsAdapter As ProductsTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As ProductsTableAdapter
        Get
            If _productsAdapter Is Nothing Then
                _productsAdapter = New ProductsTableAdapter()
            End If
            Return _productsAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetProducts() As NorthwindWithSprocs.ProductsDataTable
        Return Adapter.GetProducts()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, False)> _
    Public Function GetProductByProductID(ByVal productID As Integer) _
        As NorthwindWithSprocs.ProductsDataTable
        Return Adapter.GetProductByProductID(productID)
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Insert, True)> _
    Public Function AddProduct _
        (ByVal productName As String, ByVal supplierID As Nullable(Of Integer), _
         ByVal categoryID As Nullable(Of Integer), ByVal quantityPerUnit As String, _
         ByVal unitPrice As Nullable(Of Decimal), _
         ByVal unitsInStock As Nullable(Of Short), _
         ByVal unitsOnOrder As Nullable(Of Short), _
         ByVal reorderLevel As Nullable(Of Short), _
         ByVal discontinued As Boolean) _
         As Boolean
         
        ' Create a new ProductRow instance
        Dim products As New NorthwindWithSprocs.ProductsDataTable()
        Dim product As NorthwindWithSprocs.ProductsRow = products.NewProductsRow()
        product.ProductName = productName
        If Not supplierID.HasValue Then 
            product.SetSupplierIDNull() 
        Else 
            product.SupplierID = supplierID.Value 
        End If
        If Not categoryID.HasValue Then 
            product.SetCategoryIDNull() 
        Else 
            product.CategoryID = categoryID.Value 
        End If
        If quantityPerUnit Is Nothing Then 
            product.SetQuantityPerUnitNull() 
        Else 
            product.QuantityPerUnit = quantityPerUnit 
        End If
        If Not unitPrice.HasValue Then 
            product.SetUnitPriceNull() 
        Else 
            product.UnitPrice = unitPrice.Value 
        End If
        If Not unitsInStock.HasValue Then 
            product.SetUnitsInStockNull() 
        Else 
            product.UnitsInStock = unitsInStock.Value 
        End If
        If Not unitsOnOrder.HasValue Then 
            product.SetUnitsOnOrderNull() 
        Else 
            product.UnitsOnOrder = unitsOnOrder.Value 
        End If
        If Not reorderLevel.HasValue Then 
            product.SetReorderLevelNull() 
        Else 
            product.ReorderLevel = reorderLevel.Value 
        End If
        product.Discontinued = discontinued
        ' Add the new product
        products.AddProductsRow(product)
        Dim rowsAffected As Integer = Adapter.Update(products)
        ' Return true if precisely one row was inserted, otherwise false
        Return rowsAffected = 1
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateProduct
        (ByVal productName As String, ByVal supplierID As Nullable(Of Integer), _
         ByVal categoryID As Nullable(Of Integer), ByVal quantityPerUnit As String, _
         ByVal unitPrice As Nullable(Of Decimal), _
         ByVal unitsInStock As Nullable(Of Short), _
         ByVal unitsOnOrder As Nullable(Of Short), _
         ByVal reorderLevel As Nullable(Of Short), _
         ByVal discontinued As Boolean, ByVal productID As Integer) _
         As Boolean
         
        Dim products As NorthwindWithSprocs.ProductsDataTable = _
            Adapter.GetProductByProductID(productID)
        If products.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim product As NorthwindWithSprocs.ProductsRow = products(0)
        product.ProductName = productName
        If Not supplierID.HasValue Then 
            product.SetSupplierIDNull() 
        Else 
            product.SupplierID = supplierID.Value 
        End If
        If Not categoryID.HasValue Then 
            product.SetCategoryIDNull() 
        Else 
            product.CategoryID = categoryID.Value 
        End If
        If quantityPerUnit Is Nothing Then 
            product.SetQuantityPerUnitNull() 
        Else 
            product.QuantityPerUnit = quantityPerUnit 
        End If
        If Not unitPrice.HasValue Then 
            product.SetUnitPriceNull() 
        Else 
            product.UnitPrice = unitPrice.Value 
        End If
        If Not unitsInStock.HasValue Then 
            product.SetUnitsInStockNull() 
        Else 
            product.UnitsInStock = unitsInStock.Value 
        End If
        If Not unitsOnOrder.HasValue Then 
            product.SetUnitsOnOrderNull() 
        Else 
            product.UnitsOnOrder = unitsOnOrder.Value 
        End If
        If Not reorderLevel.HasValue Then 
            product.SetReorderLevelNull() 
        Else 
            product.ReorderLevel = reorderLevel.Value 
        End If
        product.Discontinued = discontinued
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(product)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Delete, True)> _
    Public Function DeleteProduct(ByVal productID As Integer) As Boolean
        Dim rowsAffected As Integer = Adapter.Delete(productID)
        ' Return true if precisely one row was deleted, otherwise false
        Return rowsAffected = 1
    End Function
End Class

Bu sınıf, önceki öğreticilerdeki ProductsBLL sınıf semantiğini taklit eder, ancak DataSet'ten NorthwindWithSprocs ve ProductsDataTable nesnelerini kullanırProductsTableAdapter. Örneğin, sınıf dosyasının başında olduğu gibi ProductsBLL bir Imports NorthwindTableAdapters deyiminin olması yerine sınıfı ProductsBLLWithSprocs kullanırImports NorthwindWithSprocsTableAdapters. Benzer şekilde, ProductsDataTable bu sınıfta kullanılan ve ProductsRow nesnelerine ad alanı ön eki eklenir NorthwindWithSprocs . ProductsBLLWithSprocs sınıfı, tek bir ürün örneğini eklemek, GetProducts güncelleştirmek ve GetProductByProductIDsilmek için ve olmak üzere iki veri erişim yöntemi ve yöntemi sağlar.

7. Adım: Sunu KatmanındanNorthwindWithSprocsDataSet ile Çalışma

Bu noktada, temel alınan veritabanı verilerine erişmek ve bunları değiştirmek için saklı yordamları kullanan bir DAL oluşturduk. Ayrıca tüm ürünleri veya belirli bir ürünü alma yöntemlerinin yanı sıra ürün ekleme, güncelleştirme ve silme yöntemleriyle birlikte ilkel bir BLL de oluşturacağız. Bu öğreticiyi kapatmak için kayıtları görüntülemek, güncelleştirmek ve silmek için BLL ProductsBLLWithSprocs sınıfını kullanan bir ASP.NET sayfası oluşturalım.

Klasöründeki sayfayı NewSprocs.aspx açın ve Toolbox'tan AdvancedDAL bir GridView öğesini Tasarım Aracı sürükleyerek adlandırınProducts. GridView'un akıllı etiketinden bunu adlı ProductsDataSourceyeni bir ObjectDataSource'a bağlamayı seçin. Şekil 22'de gösterildiği gibi ObjectDataSource'u sınıfını kullanacak ProductsBLLWithSprocs şekilde yapılandırın.

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

Şekil 22: 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 açılan listede iki seçenek GetProducts vardır: ve GetProductByProductID. GridView'da tüm ürünleri görüntülemek istediğimizden GetProducts yöntemini seçin. UPDATE, INSERT ve DELETE sekmelerindeki açılan listelerin her birinde tek bir yöntem vardır. Bu açılan listelerin her birinin uygun yönteminin seçili olduğundan emin olun ve Son'a tıklayın.

ObjectDataSource sihirbazı tamamlandıktan sonra Visual Studio, ürün veri alanları için GridView'a BoundFields ve CheckBoxField ekler. Akıllı etikette bulunan Düzenlemeyi Etkinleştir ve Silmeyi Etkinleştir seçeneklerini işaretleyerek GridView'un yerleşik düzenleme ve silme özelliklerini açın.

Sayfa Düzenleme ve Silme DesteğiNin Etkin Olduğu Bir GridView İçerir

Şekil 23: Sayfa Düzenleme ve Silme Desteği Etkin Bir GridView İçerir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Önceki öğreticilerde ele aldığımız gibi, ObjectDataSource sihirbazı tamamlandığında Visual Studio özelliği original_{0} olarak ayarlarOldValuesParameterFormatString. Veri değiştirme özelliklerinin BLL'mizdeki yöntemler tarafından beklenen parametrelere göre düzgün çalışması için bunun varsayılan değerine {0} geri döndürülmesi gerekir. Bu nedenle, özelliği {0} olarak ayarladığınızdan OldValuesParameterFormatString veya bildirim temelli söz diziminden tamamen kaldırdığınızdan emin olun.

Veri Kaynağını Yapılandırma sihirbazını tamamladıktan, GridView'da desteği düzenleyip sildikten ve ObjectDataSource özelliğini OldValuesParameterFormatString varsayılan değerine döndürdikten sonra sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:

<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
        <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
            InsertVisible="False" ReadOnly="True" 
            SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" 
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" 
            SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" 
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" 
            SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" 
            SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" 
            SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    DeleteMethod="DeleteProduct" InsertMethod="AddProduct" 
    SelectMethod="GetProducts" TypeName="ProductsBLLWithSprocs" 
    UpdateMethod="UpdateProduct">
    <DeleteParameters>
        <asp:Parameter Name="productID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
    </InsertParameters>
</asp:ObjectDataSource>

Bu noktada düzenleme arabirimini doğrulamayı içerecek şekilde özelleştirerek, ve SupplierID sütunlarının DropDownLists olarak işlenmesini sağlayarak CategoryID GridView'u toparlayabiliriz. Sil düğmesine istemci tarafı onayı da ekleyebiliriz ve bu geliştirmeleri uygulamak için zaman ayırabilirsiniz. Bu konular önceki öğreticilerde ele alındığından, bunları burada tekrar ele almayacağız.

GridView'u geliştirip geliştirmediğinizden bağımsız olarak, bir tarayıcıda sayfanın temel özelliklerini test edin. Şekil 24'te gösterildiği gibi, sayfada satır başına düzenleme ve silme özellikleri sağlayan bir GridView'daki ürünler listelenir.

Ürünler GridView'dan Görüntülenebilir, Düzenlenebilir ve Silinebilir

Şekil 24: Ürünler GridView'dan Görüntülenebilir, Düzenlenebilir ve Silinebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

Typed DataSet içindeki TableAdapters geçici SQL deyimlerini veya saklı yordamları kullanarak veritabanındaki verilere erişebilir. Saklı yordamlarla çalışırken, mevcut saklı yordamlar kullanılabilir veya TableAdapter sihirbazına sorguyu SELECT temel alan yeni saklı yordamlar oluşturma yönergesi verilebilir. Bu öğreticide saklı yordamların bizim için otomatik olarak nasıl oluşturulduğunu keşfettik.

Saklı yordamların otomatik olarak oluşturulması zaman kazanmanıza yardımcı olsa da, sihirbaz tarafından oluşturulan saklı yordamın kendi başımıza oluşturacağımız yordamlarla uyumlu olmadığı bazı durumlar vardır. Bir örnek, Products_Update parametre gereksiz olsa @Original_ProductID bile hem hem de @Original_ProductID@ProductID giriş parametrelerinin beklendiği saklı yordamdır.

Birçok senaryoda saklı yordamlar zaten oluşturulmuş olabilir veya saklı yordam komutları üzerinde daha hassas bir denetime sahip olmak için bunları el ile oluşturmak isteyebiliriz. Her iki durumda da TableAdapter'a yöntemleri için mevcut saklı yordamları kullanmasını bildirmek isteriz. Bunu nasıl gerçekleştirebileceğimizi bir sonraki öğreticide göreceğiz.

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 Hilton Geisenow oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.