Ek DataTable Sütunları Ekleme (VB)
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 öğreticide, ek DataTable sütunlarına ihtiyacımız olduğunda saklı yordamların neden önerileceği hakkında bilgi edineceğ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üyorsa, DataTable'da A, B ve C adlı karşılık gelen üç sütun olur. 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 GetProductByProductID(productID)
gibi GetProductsByCategoryID(categoryID)
yöntemleri 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 iyi sonuçlanır. TableAdapter yönteminin ek veri alanları döndürmesi gerekiyorsa DataTable şemasını buna göre genişletmemiz gerekir. Details DataList ile Madde İşaretli Ana/Ayrıntı Listesi Kullanma öğreticisinde, ana sorguda tanımlanan , CategoryName
ve Description
veri alanlarını artı olarak NumberOfProducts
döndüren ve her kategoriyle ilişkili ürün sayısını bildiren ek bir veri alanı döndüren bir yöntem CategoriesTableAdapter
CategoryID
ekledik. Bu yeni yöntemden veri alanı değerini yakalamak NumberOfProducts
için öğesine el ile yeni bir sütun CategoriesDataTable
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 büyük özen gösterilmelidir. 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ılırken bu sorun ortaya çıkmaz.
Bu öğreticide, DataTable şemasını ek sütunlar içerecek şekilde genişletmeyi inceleyeceğiz. Geçici SQL deyimleri kullanılırken TableAdapter'ın kırılganlığı nedeniyle, bu öğreticide saklı yordamları kullanacağız. TableAdapter'ı saklı yordamları kullanmak üzere yapılandırma hakkında daha fazla bilgi için, Türü Belirlenmiş DataSet'in TableAdapers'ı 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 adlı NorthwindWithSprocs
bir Türlenmiş Veri Kümesi 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 sorguGetProductsByCategoryID(categoryID)
- belirtilen kategori kimliğine sahip tüm ürünleri döndürür.GetProductByProductID(productID)
- belirtilen productID değerine 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 alanı kümesini döndürür. ya da tablolarından ilişkili verileri çeken bağıntılı Categories
alt sorgu JOIN
yokSuppliers
. Bu nedenle, tablosundaki ProductsDataTable
her alan Products
için karşılık gelen bir sütun vardır.
Bu öğretici için, adlı GetProductsWithPriceQuartile
öğesine ProductsTableAdapter
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örttebirlik değere 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'e düşenler 4 değerine sahip olur. Ancak bu bilgileri döndürmek için saklı yordamı oluşturma konusunda endişelenmeden önce, yöntem kullanıldığında sonuçları GetProductsWithPriceQuartile
tutacak PriceQuartile
bir sütun içerecek şekilde güncelleştirmemiz ProductsDataTable
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: Öğesine Yeni Sütun ProductsDataTable
Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu, DataTable'a türünde System.String
Column1 adlı 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. ve içinde ProductsDataTable
yeni eklenen sütunu seçin ve Özellikler penceresi özelliğini PriceQuartile ve DataType
özelliğini olarak System.Int32
ayarlayınName
.
Ş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
sütunu içerecek PriceQuartile
şekilde güncelleştirildiğinden, yöntemini oluşturmaya GetProductsWithPriceQuartile
hazırız. TableAdapter'a sağ tıklayıp bağlam menüsünden Sorgu Ekle'yi seçerek başlayın. Bu, ilk olarak geçici SQL deyimlerini mi yoksa yeni veya mevcut bir saklı yordamı mı kullanmak istediğimizi soran TableAdapter Sorgu Yapılandırması 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 Saklı Yordamı Oluşturma Talimatı Verme (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. yöntemi tablodaki GetProductsWithPriceQuartile
tüm sütunları ve kayıtları Products
döndüreceğinden, Satırları döndüren SEÇ seçeneğini belirleyin 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 sorgu istenir 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, SQL Server 2005'in yeni NTILE
işlevini kullanarak sonuçları grupların azalan düzende sıralanan değerlere göre UnitPrice
belirlendiği dört gruba böler.
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.
Not
NTILE ve SQL Server 2005'in diğer derecelendirme işlevleri hakkında daha fazla bilgi için SQL Server 2005 Çevrimiçi Kitaplar bölümündeki ROW_NUMBER (Transact-SQL) ve Derecelendirme İşlevleri bölümüne bakın.
Sorguyu SELECT
girdikten ve İ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 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)
Sorgu belirtildi SELECT
, saklı yordam ve TableAdapter yöntemleri adlı, sihirbazı tamamlamak için Son'a 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 yoksayılabilir.
Sihirbazı tamamladıktan sonra, TableAdapter ve GetProductsWithPriceQuartile
yöntemlerini içermeli FillWithPriceQuartile
ve veritabanı adlı Products_SelectWithPriceQuartile
bir saklı yordam içermelidir. TableAdapter'ın gerçekten de 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)
Not
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 saklı yordamı görüntüleyin Products_SelectWithPriceQuartile
. Sütun listesinin değiştirilmediğini unutmayın. Geçici SQL deyimlerini 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 döndürülür ve böylece ntile deyimi yöntemi tarafından GetProductsWithPriceQuartile
kullanılan sorgudan kaldırılırdı.
Veri Erişim Katmanı GetProductsWithPriceQuartile
yöntemi çağrıldığında TableAdapter saklı yordamı yürütür Products_SelectWithPriceQuartile
ve döndürülen her kayıt için öğesine ProductsDataTable
bir satır ekler. Saklı yordam tarafından döndürülen veri alanları s sütunlarıyla ProductsDataTable
eşlenir. Saklı yordamdan döndürülen bir PriceQuartile
veri alanı olduğundan, değeri s PriceQuartile
sütununa ProductsDataTable
atanır.
Sorguları veri PriceQuartile
alanı döndürmeyen TableAdapter yöntemleri için sütunun PriceQuartile
değeri özelliği tarafından DefaultValue
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. S sütunu (sütun System.Int32
için) göz önünde bulundurulduğunda değerin PriceQuartile
geçerli olduğundan emin olunDefaultValue
.DataType
Bu noktada, DataTable'a ek sütun eklemek için gerekli adımları uyguladık. 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 yapmadan önce İş Mantığı Katmanı'nı DAL GetProductsWithPriceQuartile
yöntemini ç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
içindeki ProductsBLLWithSprocs
GetProductsWithPriceQuartile
diğer veri alma yöntemleri gibi yöntemi de DAL'nin karşılık gelen GetProductsWithPriceQuartile
yöntemini çağırır ve sonuçlarını döndürür.
4. Adım: Fiyat Dörttebirlik Bilgilerini ASP.NET Bir Web Sayfasında Görüntüleme
BLL ekleme işlemi tamamlandıktan sonra her ürün için dörttebirlik fiyatı gösteren bir ASP.NET sayfası oluşturmaya hazırız. Klasördeki AdvancedDAL
sayfayı AddingColumns.aspx
açın ve Toolbox'tan bir GridView'ı Tasarım Aracı sürükleyerek özelliğini olarak Products
ayarlayınID
. GridView'un akıllı etiketinden bunu adlı ProductsDataSource
yeni bir ObjectDataSource'a bağlayın. ObjectDataSource'ı sınıfın ProductsBLLWithSprocs
GetProductsWithPriceQuartile
yöntemini kullanacak şekilde yapılandırın. Bu salt okunur bir kılavuz 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 PriceQuartile
biri, 1. Adımda öğesine eklediğimiz ProductsDataTable
sütundur.
GridView alanlarını düzenleyerek , UnitPrice
ve PriceQuartile
BoundField'ler dışında ProductName
tüm alanları kaldırın. BoundField değerini UnitPrice
para birimi olarak biçimlendirecek ve UnitPrice
ve PriceQuartile
BoundField değerlerini sırasıyla sağa ve ortaya hizalı olacak şekilde 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'un 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, her ürüne uygun PriceQuartile
bir değer atandığında, ürünlerin fiyatlarına göre azalan düzende sıralandığını unutmayın. Tabii ki bu veriler, Fiyat Dörttebirliği sütun değeriyle diğer ölçütlere göre sıralanabilir ve fiyat açısından ürünün derecelendirmesini yansıtmaya devam eder (bkz. Şekil 12).
Şekil 11: Ürünler Fiyatlarına Göre Sipariş Edilir (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 görüntüyü görüntülemek için tıklayın)
Not
Birkaç kod satırıyla GridView'ı ürün satırlarını PriceQuartile
değerlerine göre renklendirmesi için genişletebiliriz. Bu ürünleri ilk dörttebirde açık yeşil, ikinci dörtte birindekileri açık sarı ve benzeri renklendirmeler yapabiliriz. Bu işlevi eklemek için biraz zaman ayırmanızı tavsiye ederim. 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 hecelenenler dışında veri alanları döndüren bir yöntem eklerken, DataTable'a karşılık gelen sütunları ekleyebiliriz. Ancak bu tür 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 sütununu PriceQuartile
ProductsDataTable
öğesine eklemek yerine (yalnızca yöntemi tarafından GetProductsWithPriceQuartile
kullanılır), dataset'e ana sorgusu olarak saklı yordamı kullanan Products_SelectWithPriceQuartile
adlı ProductsWithPriceQuartileTableAdapter
ek bir TableAdapter ekleyebilirdik. Fiyat dörttebirliği ProductsWithPriceQuartileTableAdapter
ile ürün bilgilerini almak için gereken ASP.NET sayfalarda kullanılırken, kullanmaya devam etmeye devam etmeyenler ProductsTableAdapter
kullanılır.
Yeni bir TableAdapter ekleyerek DataTable'lar untarnished olarak kalır ve sütunları TableAdapter yöntemleri tarafından döndürülen veri alanlarını tam olarak yansıtır. Ancak, ek TableAdapters yinelenen görevler ve işlevlere neden olabilir. Örneğin, sütunu görüntüleyen PriceQuartile
ASP.NET sayfaları ekleme, güncelleştirme ve silme desteği sağlamak için de gerekliyse, öğesinin ProductsWithPriceQuartileTableAdapter
, UpdateCommand
ve DeleteCommand
özelliklerinin düzgün yapılandırılması InsertCommand
gerekir. Bu özellikler s değerlerini yansıtsa ProductsTableAdapter
da, bu yapılandırma ek bir adım sağlar. Ayrıca artık ve ProductsWithPriceQuartileTableAdapter
sınıfları aracılığıyla bir ürünü güncelleştirmenin, silmenin veya veritabanına eklemenin ProductsTableAdapter
iki yolu vardır.
Bu öğreticinin indirilmesi, DataSet'te NorthwindWithSprocs
bu alternatif yaklaşımı gösteren bir ProductsWithPriceQuartileTableAdapter
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 gereken zamanlar olabilir. Örneğin, Ayrıntılar Veri Listesi ile Ana/Ayrıntı Madde İşaretli Bir Ana Kayıt Listesi Kullanma öğreticisinde, ana sorgunun veri alanlarına ek olarak, her kategoriyle ilişkili ürün sayısını bildiren bir alan döndüren bir NumberOfProducts
yöntem CategoriesTableAdapter
ekledik. Bu öğreticide ProductsTableAdapter
, içinde ana sorgunun veri alanlarına ek olarak bir alan döndüren bir PriceQuartile
yöntem eklemeyi 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ı yordamlara genişletilmez, bu nedenle bunlar önerilir ve bu öğreticide kullanılmıştır.
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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. 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çirenleri Randy Schmidt, Jacky Goor, Bernadette Leigh ve Hilton Giesenow oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.