Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Typed DataSet oluşturmak için TableAdapter Sihirbazı kullanılırken, karşılık gelen DataTable ana veritabanı sorgusu tarafından döndürülen sütunları içerir. Ancak DataTable'ın ek sütunlar içermesi gereken durumlar vardır. Bu kılavuzda, ek DataTable sütunlarına ihtiyacımız olduğunda neden saklı yordamların önerildiğini öğreneceğiz.
Giriş
Typed DataSet'e TableAdapter eklerken, karşılık gelen DataTable şeması TableAdapter'ın ana sorgusu tarafından belirlenir. Örneğin, ana sorgu A, B ve C veri alanlarını döndürürse DataTable'da A, B ve C adlı karşılık gelen üç sütun bulunur. TableAdapter, ana sorgusuna ek olarak verilerin bir alt kümesini bazı parametrelere göre döndüren ek sorgular da içerebilir. Örneğin, tüm ürünler hakkında bilgi döndüren s ana sorgusuna ProductsTableAdapter
ek olarak, sağlanan parametreye göre belirli ürün bilgilerini döndüren ve GetProductsByCategoryID(categoryID)
gibi GetProductByProductID(productID)
yöntemler de içerir.
DataTable şemasına sahip olma modeli TableAdapter'ın ana sorgusunu yansıtır. Tüm TableAdapter yöntemlerinin ana sorguda belirtilenlerden aynı veya daha az veri alanı döndürmesi durumunda düzgün çalışır. TableAdapter yönteminin ek veri alanları döndürmesi gerekiyorsa DataTable şemasını buna göre genişletmemiz gerekir.
Master/Details DataList ile Ana Kayıtların Madde İşaretli Listesini Kullanma öğreticisinde, ana sorguda tanımlanan CategoriesTableAdapter
, CategoryID
, ve CategoryName
veri alanlarını ve her kategoriyle ilişkili ürün sayısını bildiren ek bir veri alanını döndüren bir yöntemi Description
içine ekledik. Yeni yöntemden CategoriesDataTable
veri alanı değerini yakalamak için NumberOfProducts
öğesine manuel olarak yeni bir sütun ekledik.
Dosyaları Karşıya Yükleme öğreticisinde açıklandığı gibi, geçici SQL deyimleri kullanan ve veri alanları ana sorguyla tam olarak eşleşmeyen yöntemleri olan TableAdapters ile çok dikkatli olunmalıdır. TableAdapter Yapılandırma sihirbazı yeniden çalıştırılırsa, tüm TableAdapter yöntemlerini güncelleştirerek veri alanı listesinin ana sorguyla eşleşmesini sağlar. Sonuç olarak, özelleştirilmiş sütun listelerine sahip tüm yöntemler ana sorgunun sütun listesine geri döner ve beklenen verileri döndürmez. Saklı yordamlar kullanıldığında bu sorun ortaya çıkmaz.
Bu öğreticide, bir DataTable şemasını ek sütunlar içerecek şekilde genişletmeyi inceleyeceğiz. Geçici SQL deyimlerini kullanırken TableAdapter'ın kırılganlığı nedeniyle bu öğreticide saklı yordamları kullanacağız. TableAdapter’ı saklı yordamları kullanacak şekilde yapılandırma hakkında daha fazla bilgi için, TableAdapters’ın Yazılan DataSet için Yeni Saklı Yordamlar Oluşturma ve Varolan Saklı Yordamları Kullanma öğreticilerine bakın.
1. Adım: Sütun EklemePriceQuartile
ProductsDataTable
Typed DataSet'in TableAdapters için Yeni Saklı Yordamlar Oluşturma öğreticisinde, NorthwindWithSprocs
adlı bir Türlenmiş DataSet oluşturduk. Bu DataSet şu anda iki DataTable içerir: ProductsDataTable
ve EmployeesDataTable
.
ProductsTableAdapter
aşağıdaki üç yönteme sahiptir:
-
GetProducts
- tablodan tüm kayıtlarıProducts
döndüren ana sorgu -
GetProductsByCategoryID(categoryID)
- belirtilen categoryID değerine sahip tüm ürünleri döndürür. -
GetProductByProductID(productID)
- belirtilen ürün kimliğine sahip belirli bir ürünü döndürür.
Ana sorgu ve ek iki yöntemin tümü, tablodaki tüm sütunlar Products
gibi aynı veri alanları kümesini döndürür. Bağıntılı alt sorgular veya JOIN
'ler Categories
veya Suppliers
tablolarından ilişkili veri çekmiyor. Bu nedenle, ProductsDataTable
tablosundaki her alan için Products
karşılık gelen bir sütun vardır.
Bu öğreticide, ProductsTableAdapter
adlı GetProductsWithPriceQuartile
öğesine tüm ürünleri döndüren bir yöntem ekleyelim. Standart ürün veri alanlarına ek olarak, GetProductsWithPriceQuartile
ürünün fiyatının hangi dörttebire düştüğünü gösteren bir PriceQuartile
veri alanı da içerecektir. Örneğin, fiyatları en pahalı 25% olan ürünlerin değeri 1 olurken PriceQuartile
, fiyatları en düşük 25% olan ürünlerin değeri 4 olur. Saklı yordamı bu bilgiyi döndürmek amacıyla oluşturmadan önce, yöntemi ProductsDataTable
kullanıldığında PriceQuartile
sonuçlarını tutacak bir sütun eklemek için GetProductsWithPriceQuartile
güncelleştirmemiz gerekir.
DataSet'i NorthwindWithSprocs
açın ve öğesine ProductsDataTable
sağ tıklayın. Bağlam menüsünden Ekle'yi ve ardından Sütun'u seçin.
Şekil 1: ProductsDataTable
Öğesine Yeni Bir Sütun Ekleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu, DataTable'a sütun1 System.String
türünde yeni bir sütun ekler. 1 ile 4 arasında bir sayıyı tutmak için kullanılacağından bu sütunun adını PriceQuartile ve türünü System.Int32
olarak güncelleştirmemiz gerekir. Yeni eklenen sütunu ProductsDataTable
içinde seçin ve Özellikler penceresi üzerinden Name
özelliğini PriceQuartile olarak, DataType
özelliğini ise System.Int32
olarak ayarlayın.
Şekil 2: Yeni Sütun ve Name
DataType
Özellikleri Ayarlama (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 2'de gösterildiği gibi, sütundaki değerlerin benzersiz olması gerekip gerekmediği, sütun otomatik artırma sütunuysa, veritabanı NULL
değerlerine izin verilip verilmeyeceği gibi ek özellikler ayarlanabilir. Bu değerleri varsayılan değerlerine ayarlanmış olarak bırakın.
2. Adım: Yöntemi OluşturmaGetProductsWithPriceQuartile
ProductsDataTable
şimdi PriceQuartile
sütununu içerecek şekilde güncellenmiştir, bu yüzden GetProductsWithPriceQuartile
yöntemini oluşturmaya hazırız. TableAdapter'a sağ tıklayıp bağlam menüsünden Sorgu Ekle'yi seçerek başlayın. Öncelikle ad-hoc SQL ifadeleri mi yoksa yeni veya mevcut bir saklı yordamı mı kullanmak istediğimizi soran TableAdapter Sorgu Yapılandırma sihirbazını getirir. Fiyat dörttebirlik verilerini döndüren bir saklı yordamımız olmadığından TableAdapter'ın bu saklı yordamı oluşturmasına izin verelim. Yeni saklı yordam oluştur seçeneğini belirleyin ve İleri'ye tıklayın.
Şekil 3: TableAdapter Sihirbazı'na bizim için saklı prosedürü oluşturması için talimat verin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 4'te gösterilen sonraki ekranda sihirbaz bize ne tür bir sorgu ekleneceğini sorar.
GetProductsWithPriceQuartile
metodunun Products
tablosundaki tüm sütunları ve kayıtları döndüreceğinden, satırları döndüren SELECT ifadesini seçin ve İleri'ye tıklayın.
Şekil 4: Sorgumuz Birden Çok Satır Döndüren Bir SELECT
Deyim Olacaktır (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ardından sorguyu girmemiz isteniyor SELECT
. Sihirbaza aşağıdaki sorguyu girin:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartile
FROM Products
Yukarıdaki sorgu, sonuçları grupların azalan düzende sıralanmış değerlere göre NTILE
belirlendiği dört gruba bölmek için SQL Server 2005'in yeni kullanır.
Ne yazık ki Sorgu Oluşturucusu anahtar sözcüğün OVER
nasıl ayrıştırılacağını bilmez ve yukarıdaki sorguyu ayrıştırırken bir hata görüntüler. Bu nedenle, Sorgu Oluşturucusu'nu kullanmadan yukarıdaki sorguyu doğrudan sihirbazdaki metin kutusuna girin.
Uyarı
NTILE ve SQL Server 2005'in diğer derecelendirme işlevleri hakkında daha fazla bilgi için SQL Server 2005 Books Online'ınROW_NUMBER (Transact-SQL) ve Derecelendirme İşlevleri bölümüne bakın.
Sorguyu SELECT
girip İleri'ye tıkladıktan sonra sihirbaz, oluşturacağı saklı yordam için bir ad sağlamamızı ister. Yeni saklı yordamı Products_SelectWithPriceQuartile
adlandırın ve İleri'ye tıklayın.
Şekil 5: Saklı Yordamı Products_SelectWithPriceQuartile
Adlandırın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Son olarak TableAdapter yöntemlerini adlandırmamız istenir. Hem DataTable Doldur hem de DataTable Döndür onay kutularını işaretli bırakın ve yöntemlerini FillWithPriceQuartile
ve GetProductsWithPriceQuartile
olarak adlandırın.
Şekil 6: TableAdapter Yöntemlerini Adlandırın ve Son'a Tıklayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Belirtilen SELECT
sorgu ile saklı yordam ve TableAdapter yöntemlerini adlandırdıktan sonra sihirbazı tamamlamak için Bitir'e tıklayın. Bu noktada sihirbazdan SQL yapısının veya deyiminin desteklenmediğini belirten OVER
bir veya iki uyarı alabilirsiniz. Bu uyarılar göz ardı edilebilir.
Sihirbazı tamamladıktan sonra, TableAdapter FillWithPriceQuartile
ve GetProductsWithPriceQuartile
yöntemlerini içermeli ve veritabanı Products_SelectWithPriceQuartile
adlı bir saklı yordam içermelidir. TableAdapter'ın gerçekten bu yeni yöntemi içerdiğini ve saklı yordamın veritabanına doğru şekilde eklendiğini doğrulamak için bir dakikanızı ayırın. Veritabanını denetlerken saklı yordamı görmüyorsanız Saklı Yordamlar klasörüne sağ tıklayıp Yenile'yi seçmeyi deneyin.
Şekil 7: TableAdapter'a Yeni Bir Yöntem Eklendiğini Doğrulama
Şekil 8: Veritabanının Saklı Yordamı İçerdiğinden Products_SelectWithPriceQuartile
Emin Olun (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Geçici SQL deyimleri yerine saklı yordamları kullanmanın avantajlarından biri, TableAdapter Yapılandırma sihirbazının yeniden çalıştırılmasının saklı yordamlar sütun listelerini değiştirmemesidir. TableAdapter'a sağ tıklayarak, sihirbazı başlatmak için bağlam menüsünden Yapılandır seçeneğini belirleyerek ve ardından tamamlamak için Son'a tıklayarak bunu doğrulayın. Ardından veritabanına gidin ve Products_SelectWithPriceQuartile
saklı yordamı görüntüleyin. Sütun listesinin değiştirilmediğini unutmayın. Geçici ad-hoc SQL ifadelerini kullansaydık, TableAdapter Yapılandırma sihirbazı yeniden çalıştırıldığında, bu sorgunun sütun listesi ana sorgu sütun listesiyle eşleşecek şekilde geri yüklenir ve böylece GetProductsWithPriceQuartile
yöntemi tarafından kullanılan sorgudan NTILE ifadesi kaldırılırdı.
Veri Erişim Katmanı'nın GetProductsWithPriceQuartile
yöntemi çağrıldığında, TableAdapter Products_SelectWithPriceQuartile
saklı yordamını çalıştırır ve döndürülen her kayıt için ProductsDataTable
'ye bir satır ekler. Saklı yordam tarafından döndürülen veri alanları, ProductsDataTable
s sütunlarına eşlenir. Saklı yordamdan döndürülen bir PriceQuartile
veri alanı olduğundan, değeri ProductsDataTable
s PriceQuartile
sütununa atanır.
Sorguları veri alanı döndürmeyen PriceQuartile
TableAdapter yöntemleri için PriceQuartile
sütununun değeri, DefaultValue
özelliği tarafından belirtilen değerdir. Şekil 2'de gösterildiği gibi, bu değer varsayılan olarak ayarlanır DBNull
. Farklı bir varsayılan değer tercih ederseniz, özelliği buna göre ayarlamanız DefaultValue
yeterlidir. Sadece DefaultValue
sütunu için DataType
(yani System.Int32
) verilen sütunlarda PriceQuartile
değerinin geçerli olduğundan emin olun.
Bu noktada, DataTable'a ek sütun eklemek için gerekli adımları gerçekleştirdik. Bu ek sütunun beklendiği gibi çalıştığını doğrulamak için, her ürünün adını, fiyatını ve fiyat dörtte birini görüntüleyen bir ASP.NET sayfası oluşturalım. Ancak bunu gerçekleştirmeden önce İş Mantığı Katmanı'nı DAL GetProductsWithPriceQuartile
yöntemine çağıran bir yöntem içerecek şekilde güncelleştirmemiz gerekir. 3. Adımda BLL'yi güncelleştirecek ve ardından 4. Adımda ASP.NET sayfasını oluşturacağız.
3. Adım: İş Mantığı Katmanını Artırma
Sunu Katmanı'ndan yeni GetProductsWithPriceQuartile
yöntemi kullanmadan önce BLL'ye karşılık gelen bir yöntem eklemeliyiz.
ProductsBLLWithSprocs
Sınıf dosyasını açın ve aşağıdaki kodu ekleyin:
<System.ComponentModel.DataObjectMethodAttribute_
(System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsWithPriceQuartile() As NorthwindWithSprocs.ProductsDataTable
Return Adapter.GetProductsWithPriceQuartile()
End Function
yöntemi, içindeki ProductsBLLWithSprocs
GetProductsWithPriceQuartile
diğer veri alma yöntemleri gibi DAL'nin ilgili GetProductsWithPriceQuartile
yöntemini çağırır ve sonuçlarını döndürür.
4. Adım: ASP.NET Web Sayfasında Fiyat Çeyrek Dilim Bilgilerini Görüntüleme
BLL ekleme tamamlandıktan sonra her ürün için fiyat dörttebirlik değerini gösteren bir ASP.NET sayfası oluşturmaya hazırız.
AddingColumns.aspx
klasöründeki AdvancedDAL
sayfasını açın ve Toolbox'tan bir GridView'ı Tasarımcı'ya sürükleyin, ardından ID
özelliğini Products
olarak ayarlayın. GridView'un akıllı etiketinden bunu adlı ProductsDataSource
yeni bir ObjectDataSource'a bağlayın.
ProductsBLLWithSprocs
sınıfını, GetProductsWithPriceQuartile
yöntemini kullanacak şekilde ObjectDataSource'ı yapılandırın. Bu salt okunur bir tablo olacağından, UPDATE, INSERT ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın.
Şekil 9: 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)
Şekil 10: Yöntemden GetProductsWithPriceQuartile
Ürün Bilgilerini Alma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Veri Kaynağını Yapılandırma sihirbazını tamamladıktan sonra Visual Studio, yöntemi tarafından döndürülen her veri alanı için GridView'a otomatik olarak bir BoundField veya CheckBoxField ekler. Bu veri alanlarından biri PriceQuartile
olup, 1. adımda ProductsDataTable
öğesine eklediğimiz sütundur.
GridView alanlarını düzenleyerek, ProductName
, UnitPrice
ve PriceQuartile
BoundField'ler dışındaki tüm alanları kaldırın.
UnitPrice
BoundField'i, değerini bir para birimi olarak biçimlendirmek ve UnitPrice
ve PriceQuartile
BoundField'leri sırasıyla sağa ve ortaya hizalamak üzere yapılandırın. Son olarak, kalan BoundFields HeaderText
özelliklerini sırasıyla Product, Price ve Price Quartile olarak güncelleştirin. Ayrıca GridView akıllı etiketinden Sıralamayı Etkinleştir onay kutusunu işaretleyin.
Bu değişikliklerden sonra GridView ve ObjectDataSource bildirim temelli işaretleme aşağıdaki gibi görünmelidir:
<asp:GridView ID="Products" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSource">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price" HtmlEncode="False"
SortExpression="UnitPrice">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="PriceQuartile" HeaderText="Price Quartile"
SortExpression="PriceQuartile">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProductsWithPriceQuartile"
TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>
Şekil 11'de tarayıcı üzerinden ziyaret edildiğinde bu sayfa gösterilmektedir. Başlangıçta, ürünlerin her ürüne uygun PriceQuartile
bir değer atanmış olarak azalan düzende fiyatlarına göre sıralandığını unutmayın. Elbette bu veriler, fiyat açısından ürünün derecelendirmesini yansıtan Fiyat Dörttebirliği sütun değeriyle diğer ölçütlere göre sıralanabilir (bkz. Şekil 12).
Şekil 11: Ürünler Fiyatlarına Göre Sıralanır (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 12: Ürünler Adlarına Göre Sıralanır (Tam boyutlu resmi görüntülemek için tıklayın)
Uyarı
Birkaç kod satırıyla GridView'u ürün satırlarını değerlerine PriceQuartile
göre renklendirmesi için genişletebiliriz. Bu ürünleri ilk dörttebirde açık yeşil, ikinci dörttebirindekileri açık sarı ve benzeri renklerle renklendirebiliriz. Bu işlevi eklemek için bir dakikanızı ayırın. GridView'ı biçimlendirme konusunda bir yenileyiciye ihtiyacınız varsa Verilere Dayalı Özel Biçimlendirme öğreticisine başvurun.
Alternatif Yaklaşım - Başka Bir TableAdapter Oluşturma
Bu öğreticide gördüğümüz gibi, bir TableAdapter'a ana sorgu tarafından yazılmış olanlar dışında veri alanları döndüren bir yöntem eklerken, DataTable'a karşılık gelen sütunları ekleyebiliriz. Ancak böyle bir yaklaşım yalnızca TableAdapter'da farklı veri alanları döndüren az sayıda yöntem varsa ve bu alternatif veri alanları ana sorgudan çok fazla farklılık göstermiyorsa iyi sonuç verir.
DataTable'a sütun eklemek yerine, dataset'e farklı veri alanları döndüren ilk TableAdapter'dan yöntemleri içeren başka bir TableAdapter ekleyebilirsiniz. Bu öğreticide, PriceQuartile
sütununu ProductsDataTable
öğesine eklemek yerine (bu sütun yalnızca GetProductsWithPriceQuartile
yöntemi tarafından kullanılır), ana sorgusu ProductsWithPriceQuartileTableAdapter
saklı yordamı olan Products_SelectWithPriceQuartile
adında başka bir TableAdapter'ı DataSet'e ekleyebilirdik. Fiyat dörttebirlik dilimiyle ürün bilgilerini alması gereken ASP.NET sayfaları ProductsWithPriceQuartileTableAdapter
kullanırken, buna ihtiyaç duymayanlar ProductsTableAdapter
kullanmaya devam edebilir.
Yeni bir TableAdapter ekleyerek DataTable'lar bozulmadan kalır ve sütunları TableAdapter'ın yöntemleri tarafından döndürülen veri alanlarını tam olarak yansıtır. Ancak, ek TableAdapters tekrarlayan görevler ve işlevler oluşturabilir. Örneğin, PriceQuartile
sütununu görüntüleyen bu ASP.NET sayfalarının ekleme, güncelleştirme ve silme desteği sağlaması gerekiyorsa, ProductsWithPriceQuartileTableAdapter
öğesinin InsertCommand
, UpdateCommand
ve DeleteCommand
özelliklerinin düzgün yapılandırılması gerekir. Bu özellikler ProductsTableAdapter
S'leri yansıtsa da, bu yapılandırma ek bir adım gerektirir. Ayrıca, artık ProductsTableAdapter
ve ProductsWithPriceQuartileTableAdapter
sınıfları aracılığıyla veritabanına bir ürünü güncelleştirmenin, silmenin veya eklemenin iki yolu vardır.
Bu öğretici ile birlikte gelen indirme, DataSet'teki ProductsWithPriceQuartileTableAdapter
alternatif yaklaşımı gösteren bir NorthwindWithSprocs
sınıfı içerir.
Özet
Çoğu senaryoda, TableAdapter'daki tüm yöntemler aynı veri alanı kümesini döndürür, ancak belirli bir veya iki yöntemin ek alan döndürmesi gerekebileceği zamanlar vardır. Örneğin, Ana Kayıtların Madde İşaretli Listesini Kullanarak Ana/Ayrıntı Veri Listesi öğreticisinde, ana sorgunun veri alanlarına ek olarak, her kategoriye bağlı ürün sayısını bildiren bir CategoriesTableAdapter
alanı döndüren bir yöntemi NumberOfProducts
'e ekledik. Bu öğreticide, ana sorgunun veri alanlarına ek olarak bir ProductsTableAdapter
alanı döndüren bir yöntem eklemeyi PriceQuartile
içinde inceledik. TableAdapter yöntemleri tarafından döndürülen ek veri alanlarını yakalamak için DataTable'a karşılık gelen sütunları eklememiz gerekir.
DataTable'a el ile sütun eklemeyi planlıyorsanız TableAdapter'ın saklı yordamları kullanması önerilir. TableAdapter geçici SQL deyimleri kullanıyorsa, TableAdapter Yapılandırma sihirbazı her çalıştırıldığında tüm yöntem veri alanı listeleri ana sorgu tarafından döndürülen veri alanlarına geri döner. Bu sorun saklı yordamları etkilemez. Bu yüzden bunlar önerilir ve bu öğreticide kullanıldılar.
Mutlu Programlama!
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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçirenleri Randy Schmidt, Jacky Goor, Bernadette Leigh ve Hilton Giesenow'dır. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.