Türü Belirtilmiş DataSet'in TableAdapter’ları için Yeni Saklı Yordam Oluşturma (VB)
tarafından Scott Mitchell
Ö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 TableName
geç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
, UnitPrice
ve 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ı DeleteCategory
saklı 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ı AdvancedDAL
yeni 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
Ş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.
Şekil 2: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascx
Default.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.sitemap
sonra, öğ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.
Ş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.xsd
klasö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.
Ş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.
Ş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
Ş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 ProductsTableAdapter
Northwind
biraz farklıdır. Typed DataSet içindeki öğesinin ProductsTableAdapter
Northwind
, 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.
Ş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_Update
ve Products_Delete
olarak değiştirin.
Ş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.
Ş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).
Ş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 ProductsDataTable
içermelidir.
Ş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_Select
ve Products_Update
.
Ş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.
Ş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_Insert
Products_Update
Ve saklı yordamları ise ve deyimlerinden UPDATE
INSERT
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) ProductID
dö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 ProductsTableAdapter
ProductsDataTable
öğ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 ProductID
iki 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
@ProductID
değ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 UpdateCommand
Parameters
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.
Ş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.
Ş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.
Ş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.
Ş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
, INSERT
veya 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.
Ş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
Ş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.
Ş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 GetProductByProductID
olarak 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.
Ş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 GetProductByProductID
silmek için ve olmak üzere iki veri erişim yöntemi ve yöntemi sağlar.
7. Adım: Sunu KatmanındanNorthwindWithSprocs
DataSet 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ı ProductsDataSource
yeni 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.
Ş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.
Ş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.
Ş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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin