Veri Erişim Katmanını Oluşturma (VB)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide, veritabanındaki bilgilere erişmek için en baştan başlayacağız ve yazılan DataSets kullanarak Veri Erişim Katmanı'nı (DAL) oluşturacağız.

Giriş

Web geliştiricileri olarak hayatlarımız verilerle çalışma etrafında döner. Verileri depolamak için veritabanları, almak ve değiştirmek için kod ve bunları toplamak ve özetlemek için web sayfaları oluştururuz. Bu, ASP.NET 2.0'da bu yaygın desenleri uygulamaya yönelik teknikleri keşfedecek uzun bir serideki ilk öğreticidir. Typed DataSets kullanarak Veri Erişim Katmanından (DAL) oluşan bir yazılım mimarisi , özel iş kurallarını zorunlu kılan bir İş Mantığı Katmanı (BLL) ve ortak bir sayfa düzenini paylaşan ASP.NET sayfalardan oluşan bir sunu katmanı oluşturmayla başlayacağız. Bu arka uç temel çalışması yapıldıktan sonra, bir web uygulamasındaki verilerin nasıl görüntüleneceğini, özetleneceğini, toplandığını ve doğrulandığını gösteren raporlamaya geçeceğiz. Bu öğreticiler kısa olacak şekilde hazırlandı ve işlemde görsel olarak size yol gösterirken birçok ekran görüntüsüyle birlikte adım adım yönergeler sağlar. Her öğretici C# ve Visual Basic sürümlerinde kullanılabilir ve kullanılan kodun tamamının indirilmesini içerir. (Bu ilk öğretici oldukça uzundur, ancak gerisi çok daha sindirilebilir öbekler halinde sunulur.)

Bu öğreticiler için dizine yerleştirilen App_Data Northwind veritabanının Microsoft SQL Server 2005 Express Sürüm sürümünü kullanacağız. Veritabanı dosyasına ek olarak, App_Data farklı bir veritabanı sürümü kullanmak istemeniz durumunda, klasör veritabanını oluşturmaya yönelik SQL betiklerini de içerir. Northwind veritabanının farklı bir SQL Server sürümünü kullanıyorsanız, uygulamanın Web.config dosyasındaki ayarı güncelleştirmeniz NORTHWNDConnectionString gerekir. Web uygulaması, dosya sistemi tabanlı bir Web sitesi projesi olarak Visual Studio 2005 Professional Edition kullanılarak oluşturulmuştu. Ancak tüm öğreticiler Visual Studio 2005, Visual Web Developer'ın ücretsiz sürümüyle aynı derecede iyi çalışır.

Bu öğreticide en baştan başlayacağız ve Veri Erişim Katmanı'nı (DAL) oluşturacak, ardından ikinci öğreticide İş Mantığı Katmanı 'nı (BLL) oluşturacak ve üçüncü öğreticide sayfa düzeni ve gezinti üzerinde çalışacağız. Üçüncüden sonraki öğreticiler, ilk üçte atılan temeli temel alır. Bu ilk öğreticide ele alacağımız çok şey var, bu nedenle Visual Studio'yu başlatın ve başlayalım!

1. Adım: Web Projesi Oluşturma ve Veritabanına Bağlanma

Veri Erişim Katmanımızı (DAL) oluşturabilmek için önce bir web sitesi oluşturmamız ve veritabanımızı kurmamız gerekir. Başlangıç olarak yeni bir dosya sistemi tabanlı ASP.NET web sitesi oluşturun. Bunu yapmak için Dosya menüsüne gidin ve Yeni Web Sitesi'ni seçerek Yeni Web Sitesi iletişim kutusunu görüntüleyin. ASP.NET Web Sitesi şablonunu seçin, Konum açılan listesini Dosya Sistemi olarak ayarlayın, web sitesini yerleştirmek için bir klasör seçin ve dili Visual Basic olarak ayarlayın.

Web Sitesi System-Based Yeni Dosya Oluşturma

Şekil 1: Web Sitesi System-Based Yeni Dosya Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu, ASP.NET sayfası, klasörü ve dosyası olan Default.aspx yeni bir App_DataWeb.config web sitesi oluşturur.

Web sitesi oluşturulduğunda, sonraki adım Visual Studio'nun Sunucu Gezgini'nde veritabanına bir başvuru eklemektir. Sunucu Gezgini'ne veritabanı ekleyerek, Visual Studio'dan tablolar, saklı yordamlar, görünümler vb. ekleyebilirsiniz. Ayrıca tablo verilerini görüntüleyebilir veya Sorgu Oluşturucusu aracılığıyla el ile veya grafik olarak kendi sorgularınızı oluşturabilirsiniz. Ayrıca, DAL için Yazılan Veri Kümeleri'ni oluştururken Visual Studio'yu, Türü Belirtilen Veri Kümelerinin oluşturulması gereken veritabanına işaret etmemiz gerekir. Bu bağlantı bilgilerini o anda sağlayabildiğimiz halde Visual Studio, Sunucu Gezgini'nde kayıtlı olan veritabanlarının açılan listesini otomatik olarak doldurur.

Northwind veritabanını Sunucu Gezgini'ne ekleme adımları, klasördeki App_Data SQL Server 2005 Express Sürüm veritabanını kullanmak isteyip istemediğinize veya bunun yerine kullanmak istediğiniz bir Microsoft SQL Server 2000 veya 2005 veritabanı sunucusu kurulumunuz olup olmadığına bağlıdır.

Klasörde VeritabanıApp_DataKullanma

Bağlanacak SQL Server 2000 veya 2005 veritabanı sunucunuz yoksa veya veritabanını bir veritabanı sunucusuna eklemek zorunda kalmak istemiyorsanız, indirilen web sitesinin App_Data klasöründe (NORTHWND.MDF ) bulunan Northwind veritabanının SQL Server 2005 Express Sürüm sürümünü kullanabilirsiniz.

Klasöre App_Data yerleştirilen bir veritabanı otomatik olarak Sunucu Gezgini'ne eklenir. Makinenizde SQL Server 2005 Express Sürüm yüklü olduğunu varsayarsak NORTHWND adlı bir düğüm görmeniz gerekir. Sunucu Gezgini'nde tablolarını, görünümlerini, saklı yordamı vb. genişletip keşfedebileceğiniz MDF (bkz. Şekil 2).

KlasörApp_Data, SQL Server benzerleri gibi sunucu gezginine otomatik olarak eklenen Microsoft Access .mdb dosyalarını da barındırabilir. SQL Server seçeneklerinden herhangi birini kullanmak istemiyorsanız, her zaman Northwind Traders veritabanını ve uygulamalarını yükleyebilir ve dizine App_Data bırakabilirsiniz. Bununla birlikte, Access veritabanlarının SQL Server kadar zengin özelliklere sahip olmadığını ve web sitesi senaryolarında kullanılmak üzere tasarlanmamış olduğunu unutmayın. Ayrıca, 35'inden fazla öğreticiden birkaçı Access tarafından desteklenmeyen bazı veritabanı düzeyinde özellikleri kullanır.

Microsoft SQL Server 2000 veya 2005 Veritabanı Sunucusunda Veritabanına Bağlanma

Alternatif olarak, bir veritabanı sunucusunda yüklü bir Northwind veritabanına bağlanabilirsiniz. Veritabanı sunucusunda Northwind veritabanı yüklü değilse, önce bu öğreticinin indirmesine dahil edilen yükleme betiğini çalıştırarak bunu veritabanı sunucusuna eklemeniz gerekir.

Veritabanını yükledikten sonra Visual Studio'da Sunucu Gezgini'ne gidin, Veri Connections düğümüne sağ tıklayın ve Bağlantı Ekle'yi seçin. Sunucu Gezgini'ni görmüyorsanız Görünüm / Sunucu Gezgini'ne gidin veya Ctrl+Alt+S tuşlarına basın. Bu, bağlanılacak sunucuyu, kimlik doğrulama bilgilerini ve veritabanı adını belirtebileceğiniz Bağlantı Ekle iletişim kutusunu açar. Veritabanı bağlantı bilgilerini başarıyla yapılandırdıktan ve Tamam düğmesine tıkladığınızda veritabanı, Veri Connections düğüm altına düğüm olarak eklenir. Tablolarını, görünümlerini, saklı yordamlarını vb. keşfetmek için veritabanı düğümünü genişletebilirsiniz.

Veritabanı Sunucunuzun Northwind Veritabanına Bağlantı Ekleme

Şekil 2: Veritabanı Sunucunuzun Northwind Veritabanına Bağlantı Ekleme

2. Adım: Veri Erişim KatmanıNı Oluşturma

Verilerle çalışırken tek seçenek, verilere özgü mantığı doğrudan sunu katmanına eklemektir (web uygulamasında, ASP.NET sayfalar sunu katmanını oluşturur). Bu, ASP.NET sayfasının kod bölümüne ADO.NET kod yazma veya işaretleme bölümünden SqlDataSource denetimini kullanma biçiminde olabilir. Her iki durumda da, bu yaklaşım veri erişim mantığını sunu katmanıyla sıkı bir şekilde bağlar. Ancak önerilen yaklaşım, veri erişim mantığını sunu katmanından ayırmaktır. Bu ayrı katman Veri Erişim Katmanı, kısaca DAL olarak adlandırılır ve genellikle ayrı bir Sınıf Kitaplığı projesi olarak uygulanır. Bu katmanlı mimarinin avantajları iyi belgelenmiştir (bu avantajlar hakkında bilgi edinmek için bu öğreticinin sonundaki "Daha Fazla Okuma" bölümüne bakın) ve bu seride alacağımız yaklaşımdır.

Veritabanına bağlantı oluşturma, verme INSERT, SELECT, UPDATEve DELETE komutları gibi temel alınan veri kaynağına özgü tüm kodlar DAL'de bulunmalıdır. Sunu katmanı bu tür veri erişim koduna başvuru içermemelidir, bunun yerine tüm veri istekleri için DAL'ye çağrı yapmalıdır. Veri Erişim Katmanları genellikle temel alınan veritabanı verilerine erişmek için yöntemler içerir. Örneğin Northwind veritabanında, satışa sunulan ürünleri ve ait oldukları kategorileri kaydeden ve Categories tabloları vardırProducts. DAL'mizde şu yöntemlere sahip olacağız:

  • GetCategories(), tüm kategoriler hakkında bilgi döndürecek
  • GetProducts(), tüm ürünlerle ilgili bilgileri döndürür
  • GetProductsByCategoryID(categoryID), belirtilen bir kategoriye ait tüm ürünleri döndürür
  • GetProductByProductID(productID), belirli bir ürünle ilgili bilgileri döndürür

Bu yöntemler çağrıldığında veritabanına bağlanır, uygun sorguyu gönderir ve sonuçları döndürür. Bu sonuçları nasıl döndürebileceğimiz önemlidir. Bu yöntemler yalnızca veritabanı sorgusu tarafından doldurulan bir DataSet veya DataReader döndürebilir, ancak ideal olarak bu sonuçların kesin olarak yazılan nesneler kullanılarak döndürülmesi gerekir. Kesin olarak türü belirlenmiş bir nesne, şeması derleme zamanında katı bir şekilde tanımlanmış olan nesnedir; bunun tersi, gevşek türemiş bir nesne ise çalışma zamanına kadar şeması bilinmeyen bir nesnedir.

Örneğin, DataReader ve DataSet (varsayılan olarak) gevşek türemiş nesnelerdir çünkü şemaları bunları doldurmak için kullanılan veritabanı sorgusu tarafından döndürülen sütunlar tarafından tanımlanır. Gevşek türe sahip bir DataTable'dan belirli bir sütuna erişmek için şu söz dizimini kullanmamız gerekir: DataTable.Rows(index)("columnName"). DataTable'ın bu örnekteki gevşek yazması, sütun adına bir dize veya sıralı dizin kullanarak erişmemiz gerektiği gerçeğiyle ortaya konur. Güçlü türe sahip bir DataTable ise sütunlarının her birinin özellik olarak uygulanmasına ve bunun sonucunda şuna benzer bir kod elde edilir: DataTable.Rows(index).columnName.

Kesin olarak yazılan nesneleri döndürmek için geliştiriciler kendi özel iş nesnelerini oluşturabilir veya Türü Belirlenmiş Veri Kümeleri kullanabilir. İş nesnesi, geliştirici tarafından özellikleri genellikle iş nesnesinin temsil ettiği temel veritabanı tablosunun sütunlarını yansıtan bir sınıf olarak uygulanır. Türü Belirlenmiş DataSet, veritabanı şemasına dayalı olarak Visual Studio tarafından sizin için oluşturulan ve üyeleri bu şemaya göre kesin olarak yazılan bir sınıftır. Typed DataSet'in kendisi ADO.NET DataSet, DataTable ve DataRow sınıflarını genişleten sınıflardan oluşur. Türü kesin olarak belirlenmiş DataTable'lara ek olarak, Yazılan Veri Kümeleri artık DataSet'in DataTable'larını doldurma ve DataTable'lar içindeki değişiklikleri veritabanına geri yayma yöntemlerine sahip olan TableAdapters'ı da içerir.

Not

Yazılan Veri Kümelerini ve özel iş nesnelerini kullanmanın avantajları ve dezavantajları hakkında daha fazla bilgi için Bkz. Veri Katmanı Bileşenleri Tasarlama ve Verileri KatmanlarDan Geçirme.

Bu öğreticilerin mimarisi için kesin olarak türlenmiş DataSets kullanacağız. Şekil 3'de, Bir uygulamanın Typed DataSets kullanan farklı katmanları arasındaki iş akışı gösterilmektedir.

Tüm Veri Erişim Kodu DAL'ye Relegated

Şekil 3: Tüm Veri Erişim Kodu DAL'ye Relegated (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Türlenmiş DataSet ve Tablo Bağdaştırıcısı Oluşturma

DAL'mizi oluşturmaya başlamak için, projemize Bir Türlenmiş Veri Kümesi ekleyerek başlayacağız. Bunu yapmak için Çözüm Gezgini proje düğümüne sağ tıklayın ve Yeni Öğe Ekle'yi seçin. Şablon listesinden DataSet seçeneğini belirleyin ve olarak adlandırın Northwind.xsd.

Projenize Yeni Veri Kümesi Eklemeyi Seçin

Şekil 4: Projenize Yeni Veri Kümesi Eklemeyi Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ekle'ye tıkladıktan sonra, DataSet'i App_Code klasöre eklemeniz istendiğinde Evet'i seçin. Daha sonra, Yazılan Veri Kümesi için Tasarım Aracı görüntülenir ve TableAdapter Yapılandırma Sihirbazı başlatılır; böylece, Yazılan Veri Kümesine ilk TableAdapter'ınızı ekleyebilirsiniz.

Türü Belirlenmiş Veri Kümesi, kesin olarak türü belirlenmiş bir veri koleksiyonu görevi görür; her biri kesin olarak belirlenmiş DataRow örneklerinden oluşan, kesin türe sahip DataTable örneklerinden oluşur. Bu öğreticiler serisinde birlikte çalışmamız gereken temel alınan veritabanı tablolarının her biri için kesin olarak türlenmiş bir DataTable oluşturacağız. Tablo için Products bir DataTable oluşturarak başlayalım.

Kesin olarak türü belirlenmiş DataTable'ların, temel alınan veritabanı tablolarındaki verilere nasıl erişeceklerine ilişkin herhangi bir bilgi içermediğini unutmayın. DataTable'ı doldurmak üzere verileri almak için, Veri Erişim Katmanımız olarak işlev gören bir TableAdapter sınıfı kullanırız. DataTable'ımız Products için TableAdapter, sunu katmanından çağıracağımız , GetProductByCategoryID(categoryID)vb. yöntemlerini GetProducts()içerir. DataTable'ın rolü, katmanlar arasında veri geçirmek için kullanılan kesin olarak belirlenmiş nesneler olarak görev yapmaktır.

TableAdapter Yapılandırma Sihirbazı, hangi veritabanıyla çalışabileceğinizi seçmenizi isteyip istemediğinizi sorarak başlar. Açılan listede bu veritabanları Sunucu Gezgini'nde gösterilir. Northwind veritabanını Sunucu Gezgini'ne eklemediyseniz, şu anda Yeni Bağlantı düğmesine tıklayarak bunu yapabilirsiniz.

Drop-Down Listesinden Northwind Veritabanı'nı seçin

Şekil 5: Drop-Down Listesinden Northwind Veritabanı'nı seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veritabanını seçip İleri'ye tıkladıktan sonra, bağlantı dizesi Web.config dosyaya kaydetmek isteyip istemediğiniz sorulur. bağlantı dizesi kaydederek TableAdapter sınıflarında sabit kodlanmış olmasını önlersiniz, bu da gelecekte bağlantı dizesi bilgiler değişirse işleri basitleştirir. bağlantı dizesi yapılandırma dosyasına <connectionStrings> kaydetmeyi tercih ederseniz, daha iyi güvenlik için isteğe bağlı olarak şifrelenebilir veya daha sonra YÖNETICILER için daha ideal olan IIS GUI Yönetici Aracı içindeki yeni ASP.NET 2.0 Özellik Sayfası aracılığıyla değiştirilebilir.

Bağlantı Dizesini Web.configkaydetme

Şekil 6: Bağlantı Dizesini Web.config kaydetme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Daha sonra, kesin olarak türü kesin belirlenmiş ilk DataTable için şemayı tanımlamamız ve kesin olarak türü belirlenmiş DataSet'i doldurarak TableAdapter'ımız için kullanılacak ilk yöntemi sağlamamız gerekir. Bu iki adım, DataTable'ımızdaki yansıtılmasını istediğimiz tablodaki sütunları döndüren bir sorgu oluşturularak aynı anda gerçekleştirilir. Sihirbazın sonunda bu sorguya bir yöntem adı vereceğiz. Bu işlem tamamlandıktan sonra bu yöntem sunu katmanımızdan çağrılabilir. yöntemi tanımlı sorguyu yürütür ve kesin türü belirlenmiş bir DataTable'ı doldurur.

SQL sorgusunu tanımlamaya başlamak için önce TableAdapter'ın sorguyu nasıl yayınlamasını istediğimizi belirtmemiz gerekir. Geçici bir SQL deyimi kullanabilir, yeni bir saklı yordam oluşturabilir veya mevcut bir saklı yordamı kullanabiliriz. Bu öğreticiler için geçici SQL deyimlerini kullanacağız.

Geçici SQL Deyimi Kullanarak Verileri Sorgulama

Şekil 7: Geçici SQL Deyimi Kullanarak Verileri Sorgulama (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada SQL sorgusunu el ile yazabiliriz. TableAdapter'da ilk yöntemi oluştururken genellikle sorgunun ilgili DataTable'da ifade edilmesi gereken sütunları döndürmesini istersiniz. Bunu, tablodaki Products tüm sütunları ve tüm satırları döndüren bir sorgu oluşturarak gerçekleştirebiliriz:

Metin Kutusuna SQL Sorgusu Girme

Şekil 8: Metin Kutusuna SQL Sorgusu Girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Alternatif olarak, Şekil 9'da gösterildiği gibi Sorgu Oluşturucusu'nu kullanın ve sorguyu grafik olarak oluştur.

Sorgu Düzenleyicisi aracılığıyla Grafiksel Sorgu oluşturma

Şekil 9: sorguyu Sorgu Düzenleyicisi aracılığıyla Grafik olarak oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sorguyu oluşturduktan sonra, ancak sonraki ekrana geçmeden önce Gelişmiş Seçenekler düğmesine tıklayın. Web Sitesi Projelerinde, "Ekle, Güncelleştir ve Sil deyimleri oluştur" varsayılan olarak seçilen tek gelişmiş seçenektir; Bu sihirbazı bir Sınıf Kitaplığı veya Windows Projesi'nden çalıştırırsanız "İyimser eşzamanlılık kullan" seçeneği de seçilir. "İyimser eşzamanlılık kullan" seçeneğini şimdilik işaretsiz bırakın. Gelecek öğreticilerde iyimser eşzamanlılığı inceleyeceğiz.

Yalnızca Ekleme, Güncelleştirme ve Silme deyimleri Oluştur Seçeneğini Belirleyin

Şekil 10: Yalnızca Ekle, Güncelleştir ve Sil deyimleri Oluştur Seçeneğini belirleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)

Gelişmiş seçenekleri doğruladıktan sonra, son ekrana geçmek için İleri'ye tıklayın. Burada TableAdapter'a hangi yöntemlerin ekleneceğini seçmeniz istenir. Verileri doldurmaya yönelik iki desen vardır:

  • DataTable'ı bu yaklaşımla doldurma DataTable'ı parametre olarak alan ve sorgunun sonuçlarına göre dolduran bir yöntem oluşturulur. Örneğin ADO.NET DataAdapter sınıfı, yöntemiyle bu deseni Fill() uygular.
  • Yöntemin sizin için DataTable'ı oluşturup doldurduğu ve yöntem değer döndürdüğünde döndürdüğü bu yaklaşımla bir DataTable döndürür.

TableAdapter'ın bu desenlerden birini veya her ikisini birden gerçekleştirmesini sağlayabilirsiniz. Burada sağlanan yöntemleri de yeniden adlandırabilirsiniz. Bu öğreticiler boyunca yalnızca ikinci düzeni kullansak bile her iki onay kutusunu da işaretli bırakalım. Ayrıca, oldukça genel GetData yöntemi GetProductsolarak yeniden adlandıralım.

İşaretlenirse, "GenerateDBDirectMethods" son onay kutusu TableAdapter için , Update()ve Delete() yöntemlerini oluştururInsert(). Bu seçeneği işaretsiz bırakırsanız, tüm güncelleştirmelerin TableAdapter'ın Typed DataSet, DataTable, tek bir DataRow veya DataRows dizisini alan tek Update() yöntemi aracılığıyla yapılması gerekir. (Şekil 9'daki gelişmiş özelliklerden "Ekle, Güncelleştir ve Sil deyimleri oluştur" seçeneğinin işaretini kaldırdıysanız, bu onay kutusunun ayarının hiçbir etkisi olmaz.) Bu onay kutusunu seçili bırakalım.

GetData olan Yöntem Adını GetProducts olarak değiştirme

Şekil 11: Yöntem Adını olarak GetDataGetProducts değiştirin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son'a tıklayarak sihirbazı tamamlayın. Sihirbaz kapatıldıktan sonra, yeni oluşturduğumuz DataTable'ı gösteren DataSet Tasarım Aracı döndürülür. DataTable'da Products sütunların listesini (ProductID, ProductNamevb.) ve (Fill() ve GetProducts()) yöntemlerini ProductsTableAdapter görebilirsiniz.

Products DataTable ve ProductsTableAdapter, Türü Belirtilen Veri Kümesine Eklendi

Şekil 12: Products DataTable ve ProductsTableAdapter Yazılan Veri Kümesine Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada, tek bir DataTable (Northwind.Products) ve bir yöntemi olan kesin olarak belirlenmiş bir DataAdapter sınıfına () sahip GetProducts() Bir Türü Belirlenmiş DataSet'imiz vardırNorthwindTableAdapters.ProductsTableAdapter. Bu nesneler, aşağıdaki gibi kodlardan tüm ürünlerin listesine erişmek için kullanılabilir:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products as Northwind.ProductsDataTable
products = productsAdapter.GetProducts()
For Each productRow As Northwind.ProductsRow In products
    Response.Write("Product: " & productRow.ProductName & "<br />")
Next

Bu kod, veri erişimine özgü bir kod yazmamızı gerektirmez. Hiçbir ADO.NET sınıfı örneği oluşturmadık, bağlantı dizelerine, SQL sorgularına veya saklı yordamlara başvurmak zorunda değildik. Bunun yerine TableAdapter, bizim için alt düzey veri erişim kodunu sağlar.

Bu örnekte kullanılan her nesne kesin olarak türlenmiş olduğundan Visual Studio'ya IntelliSense ve derleme zamanı türü denetimi sağlanır. TableAdapter tarafından döndürülen tüm DataTable'ların en iyisi GridView, DetailsView, DropDownList, CheckBoxList ve diğerleri gibi ASP.NET veri Web denetimlerine bağlanabilir. Aşağıdaki örnekte, yöntemi tarafından GetProducts() döndürülen DataTable'ın olay işleyicisi içinde yalnızca taranmış üç kod satırı içinde Page_Load bir GridView'a bağlanması gösterilmektedir.

AllProducts.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="AllProducts.aspx.vb"
    Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View All Products in a GridView</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            All Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class AllProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource = productsAdapter.GetProducts()
        GridView1.DataBind()
    End Sub
End Class

Ürün Listesi GridView'da Görüntülenir

Şekil 13: Ürün Listesi GridView'da Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu örnek, ASP.NET sayfamızın Page_Load olay işleyicisine üç satır kod yazmamızı gerektirse de, gelecek öğreticilerde DAL'den verileri bildirimli olarak almak için ObjectDataSource'un nasıl kullanılacağını inceleyeceğiz. ObjectDataSource ile kod yazmamız gerekmeyecek ve sayfalama ve sıralama desteği de alacağız!

3. Adım: Veri Erişim Katmanına Parametreli Yöntemler Ekleme

Bu noktada sınıfımızda ProductsTableAdapter veritabanındaki tüm ürünleri döndüren tek bir yöntemi GetProducts()vardır. Tüm ürünlerle çalışabilmek kesinlikle yararlı olsa da belirli bir ürün veya belirli bir kategoriye ait tüm ürünler hakkında bilgi almak istediğimiz zamanlar olabilir. Veri Erişim Katmanımıza bu tür işlevler eklemek için TableAdapter'a parametreli yöntemler ekleyebiliriz.

Yöntemini ekleyelim GetProductsByCategoryID(categoryID) . DAL'ye yeni bir yöntem eklemek için DataSet Tasarım Aracı dönün, bölüme ProductsTableAdapter sağ tıklayın ve Sorgu Ekle'yi seçin.

TableAdapter'a sağ tıklayın ve Sorgu Ekle'yi seçin

Şekil 14: TableAdapter'da Right-Click ve Sorgu Ekle'yi seçin

İlk olarak geçici bir SQL deyimini veya yeni veya mevcut bir saklı yordamı kullanarak veritabanına erişmek isteyip istemediğimiz sorulur. Geçici SQL deyimini yeniden kullanmayı seçelim. Ardından, ne tür BIR SQL sorgusu kullanmak istediğimiz sorulur. Belirtilen bir kategoriye ait tüm ürünleri döndürmek istediğimizden, satırları döndüren bir SELECT deyim yazmak istiyoruz.

Satırları Döndüren BIR SELECT Deyimi Oluşturmayı Seçin

Şekil 15: Satır Döndüren Bir SELECT Deyim Oluşturmayı Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki adım, verilere erişmek için kullanılan SQL sorgusunu tanımlamaktır. Yalnızca belirli bir kategoriye ait olan ürünleri döndürmek istediğimizden, 'den aynı SELECT deyimi kullanıyorum ama şu WHERE yan tümceyi ekliyorum: WHERE CategoryID = @CategoryID.GetProducts() @CategoryID parametresi TableAdapter sihirbazına, oluşturduğumuz yöntemin karşılık gelen türde bir giriş parametresi (null atanabilir bir tamsayı) gerektirdiğini belirtir.

Yalnızca Belirtilen Kategorideki Ürünleri Döndürmek için Bir Sorgu Girin

Şekil 16: Yalnızca Belirtilen Kategorideki Ürünleri Döndürmek için Bir Sorgu Girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son adımda kullanılacak veri erişim desenlerini seçebilir ve oluşturulan yöntemlerin adlarını özelleştirebiliriz. Dolgu deseni için datatable dönüş deseni (GetXyöntemler) için adını FillByCategoryID ve olarak değiştirelimGetProductsByCategoryID.

TableAdapter Yöntemlerinin Adlarını Seçin

Şekil 17: TableAdapter Yöntemlerinin Adlarını Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbazı tamamladıktan sonra DataSet Tasarım Aracı yeni TableAdapter yöntemlerini içerir.

Ürünler Artık Kategoriye Göre Sorgulanabilir

Şekil 18: Ürünler Artık Kategoriye Göre Sorgulanabilir

Aynı tekniği kullanarak bir GetProductByProductID(productID) yöntem eklemek için biraz zaman ayırın.

Bu parametreli sorgular doğrudan DataSet Tasarım Aracı test edilebilir. TableAdapter'da yöntemine sağ tıklayın ve Verileri Önizle'yi seçin. Ardından, parametreler için kullanılacak değerleri girin ve Önizleme'ye tıklayın.

İçecek Kategorisine Ait Ürünler Gösteriliyor

Şekil 19: İçecek Kategorisine Ait Ürünler Gösteriliyor (Tam boyutlu resmi görüntülemek için tıklayın)

GetProductsByCategoryID(categoryID) DAL'mizdeki yöntemiyle artık yalnızca belirli bir kategorideki ürünleri görüntüleyen bir ASP.NET sayfası oluşturabiliriz. Aşağıdaki örnek, 1 içeren İçecekler kategorisindeki CategoryID tüm ürünleri gösterir.

Beverages.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Beverages.aspx.vb"
    Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Beverages</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

Beverages.aspx.vb

Imports NorthwindTableAdapters
Partial Class Beverages
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource =
         productsAdapter.GetProductsByCategoryID(1)
        GridView1.DataBind()
    End Sub
End Class

İçecek Kategorisindeki Ürünler Görüntülenir

Şekil 20: İçecek Kategorisindeki Ürünler Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: Veri Ekleme, Güncelleştirme ve Silme

Veri eklemek, güncelleştirmek ve silmek için yaygın olarak kullanılan iki desen vardır. Veritabanı doğrudan desenini çağıracağım ilk desen, çağrıldığında, tek bir veritabanı kaydında çalışan veritabanına bir INSERT, UPDATEveya DELETE komutu veren yöntemler oluşturmayı içerir. Bu tür yöntemler genellikle eklenecek, güncelleştirilecek veya silinecek değerlere karşılık gelen bir dizi skaler değere (tamsayılar, dizeler, Boole değerleri, DateTimes vb.) geçirilir. Örneğin, tablo için Products bu desenle, delete yöntemi silinecek kaydın değerini belirten ProductID bir tamsayı parametresinde yer alırken, insert yöntemi için bir dize ProductName, için UnitPricebir ondalık , için bir tamsayı UnitsOnStockvb. alır.

Her Ekleme, Güncelleştirme ve Silme İsteği Veritabanına Hemen Gönderilir

Şekil 21: Her Ekleme, Güncelleştirme ve Silme İsteği Veritabanına Hemen Gönderilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Toplu güncelleştirme deseni olarak adlandıracağım diğer desen ise bir yöntem çağrısında DataSet, DataTable veya DataRows koleksiyonunun tamamını güncelleştirmektir. Bu desenle bir geliştirici DataTable'daki DataRow'ları siler, ekler ve değiştirir ve ardından bu DataRow'ları veya DataTable'ı bir güncelleştirme yöntemine geçirir. Bu yöntem daha sonra geçirilen DataRow'ları numaralandırır, değiştirilip değiştirilmediğini, eklenip eklenmediğini veya silinip silinmediğini belirler (DataRow'un RowState özellik değeri aracılığıyla) ve her kayıt için uygun veritabanı isteğini verir.

Güncelleştirme Yöntemi Çağrıldığında Tüm Değişiklikler Veritabanıyla Eşitlenir

Şekil 22: Güncelleştirme Yöntemi Çağrıldığında Tüm Değişiklikler Veritabanıyla Eşitleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter varsayılan olarak toplu güncelleştirme desenini kullanır, ancak veritabanı doğrudan desenini de destekler. TableAdapter'ımızı oluştururken Gelişmiş Özellikler'den "Ekle, Güncelleştir ve Sil deyimleri oluştur" seçeneğini belirlediğimizden, ProductsTableAdapter toplu güncelleştirme desenini uygulayan bir Update() yöntem içerir. Özellikle, TableAdapter Türü Belirlenmiş DataSet, kesin olarak belirlenmiş bir DataTable veya bir veya daha fazla DataRow geçirilebilen bir yöntem içerir Update() . TableAdapter'ı ilk kez oluştururken "GenerateDBDirectMethods" onay kutusunu işaretli bıraktıysanız, veritabanı doğrudan deseni , Update()ve Delete() yöntemleri aracılığıyla Insert()da uygulanır.

Her iki veri değişikliği deseni de, UpdateCommand, ve DeleteCommand komutlarını INSERTveritabanına vermek için TableAdapter'ın InsertCommand, UPDATEve DELETE özelliklerini kullanır. DataSet Tasarım Aracı TableAdapter'a tıklayıp Özellikler penceresi giderek , UpdateCommandve DeleteCommand özelliklerini inceleyebilir ve değiştirebilirsinizInsertCommand. (TableAdapter'ı seçtiğinizden ve nesnenin ProductsTableAdapter Özellikler penceresi açılan listesinde seçilen nesne olduğundan emin olun.)

TableAdapter InsertCommand, UpdateCommand ve DeleteCommand Özelliklerine sahiptir

Şekil 23: TableAdapter, , UpdateCommandve DeleteCommand Özelliklerine sahiptir InsertCommand(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu veritabanı komut özelliklerinden herhangi birini incelemek veya değiştirmek için, Sorgu Oluşturucusu'nu CommandText ortaya çıkaracak alt özelliğe tıklayın.

Sorgu Oluşturucusu'nda INSERT, UPDATE ve DELETE Deyimlerini yapılandırma

Şekil 24: Sorgu Oluşturucusu'nda , UPDATEve DELETE Deyimlerini yapılandırma INSERT(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Aşağıdaki kod örneği, üretimden kaldırılmayan ve stokta 25 veya daha az birim bulunan tüm ürünlerin fiyatını iki katına çıkarabilmek için toplu güncelleştirme düzeninin nasıl kullanılacağını gösterir:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products As Northwind.ProductsDataTable = productsAdapter.GetProducts()
For Each product As Northwind.ProductsRow In products
   If Not product.Discontinued AndAlso product.UnitsInStock <= 25 Then
      product.UnitPrice *= 2
   End if
Next
productsAdapter.Update(products)

Aşağıdaki kodda, belirli bir ürünü program aracılığıyla silmek, ardından bir ürünü güncelleştirmek ve ardından yeni bir ürün eklemek için VERITABANı doğrudan düzeninin nasıl kullanılacağı gösterilmektedir:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
productsAdapter.Delete(3)
productsAdapter.Update( _
    "Chai", 1, 1, "10 boxes x 20 bags", 18.0, 39, 15, 10, false, 1)
productsAdapter.Insert( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 15, 0, 10, false)

Özel Ekleme, Güncelleştirme ve Silme Yöntemleri Oluşturma

Insert()Veritabanı doğrudan yöntemi tarafından oluşturulan , Update()ve Delete() yöntemleri, özellikle de çok sütunlu tablolar için biraz hantal olabilir. IntelliSense'in yardımı olmadan önceki kod örneğine baktığımızda, hangi tablo sütununun ve yöntemlerine her giriş parametresiyle Update()Insert() eşlenip eşlenmediği özellikle net Products değildir. Yalnızca bir veya iki sütunu güncelleştirmek istediğimiz veya yeni eklenen kaydın IDENTITY (otomatik artırma) alanının değerini döndürecek özelleştirilmiş Insert() bir yöntem istediğimiz zamanlar olabilir.

Böyle bir özel yöntem oluşturmak için DataSet Tasarım Aracı dönün. TableAdapter'a sağ tıklayın ve TabloAdapter sihirbazına dönerek Sorgu Ekle'yi seçin. İkinci ekranda oluşturulacak sorgu türünü gösterebiliriz. Şimdi yeni bir ürün ekleyen ve ardından yeni eklenen kaydın ProductIDdeğerini döndüren bir yöntem oluşturalım. Bu nedenle, bir INSERT sorgu oluşturmayı tercih edin.

Ürünler Tablosuna Yeni Satır Eklemek için Yöntem Oluşturma

Şekil 25: Tabloya Yeni Satır Products Ekleme Yöntemi Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bir sonraki ekranda 'CommandTextler InsertCommandgörüntülenir. Sorgunun sonuna ekleyerek SELECT SCOPE_IDENTITY() bu sorguyu genişleterek aynı kapsamdaki bir IDENTITY sütuna eklenen son kimlik değerini döndürür. (@@IDENTITY SCOPE_IDENTITY() kullanmak isteme nedenleriniz hakkında SCOPE_IDENTITY() daha fazla bilgi için teknik belgelere bakın.) deyimini eklemeden önce deyimini INSERT noktalı virgülle sonlandırdığınızdan SELECT emin olun.

SCOPE_IDENTITY() Değerini Döndürmek için Sorguyu Artırma

Şekil 26: Değeri Döndürmek için Sorguyu SCOPE_IDENTITY() Artırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, yeni yöntemi InsertProductolarak adlandırın.

Yeni Yöntem Adı'nı InsertProduct olarak ayarlayın

Şekil 27: Yeni Yöntem Adı'nı olarak InsertProduct ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DataSet Tasarım Aracı döndüğünüzde, içinde ProductsTableAdapter yeni bir yöntem InsertProductolduğunu görürsünüz. Bu yeni yöntemin tablodaki Products her sütun için bir parametresi yoksa, deyimi noktalı virgülle sonlandırmayı INSERT unutmuş olma olasılığınız yüksektir. InsertProduct yöntemini yapılandırın ve ve SELECT deyimlerini sınırlandıran noktalı virgüle sahip olduğunuzdan INSERT emin olun.

Varsayılan olarak, ekleme yöntemleri sorgu dışı yöntemler verir, yani etkilenen satır sayısını döndürürler. Ancak yönteminin InsertProduct etkilenen satır sayısını değil sorgu tarafından döndürülen değeri döndürmesini istiyoruz. Bunu gerçekleştirmek için yönteminin InsertProductExecuteMode özelliğini olarak Scalarayarlayın.

ExecuteMode Özelliğini Scalar olarak değiştirme

Şekil 28: Özelliği Scalar olarak değiştirme ExecuteMode (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Aşağıdaki kod, bu yeni InsertProduct yöntemin nasıl çalıştığını gösterir:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim new_productID As Integer = Convert.ToInt32(productsAdapter.InsertProduct( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 10, 0, 10, false))
productsAdapter.Delete(new_productID)

5. Adım: Veri Erişim Katmanını Tamamlama

sınıfının tablodan ve değerlerini döndürdüğünüProductsTableAdapters, ancak tablodaki CategoryName sütunu veya CompanyName tablodaki Categories sütunu Suppliers içermediğini unutmayın; ancak bunlar büyük olasılıkla ürün bilgilerini gösterirken görüntülemek istediğimiz sütunlardır.ProductsSupplierIDCategoryID TableAdapter'ın ilk yöntemi GetProducts()olan öğesini hem hem CompanyName de CategoryName sütun değerlerini içerecek şekilde genişletebiliriz. Bu, kesin olarak türü belirlenmiş DataTable'ı da bu yeni sütunları içerecek şekilde güncelleştirir.

Ancak TableAdapter'ın veri ekleme, güncelleştirme ve silme yöntemleri bu ilk yöntemi temel alarak bir sorun oluşturabilir. Neyse ki, ekleme, güncelleştirme ve silme için otomatik olarak oluşturulan yöntemler yan tümcesindeki SELECT alt sorgulardan etkilenmez. Sorgularımızı alt sorgular CategoriesSuppliers olarak eklemek yerine JOIN alt sorgular olarak eklemeye dikkat ederek, verileri değiştirmek için bu yöntemleri yeniden çalışmaktan kaçınacağız. içinde yöntemine GetProducts() sağ tıklayın ve Yapılandır'ı ProductsTableAdapter seçin. Ardından yan tümcesini SELECT aşağıdaki gibi görünecek şekilde ayarlayın:

SELECT     ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories
WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM         Products

GetProducts() Yöntemi için SELECT Deyimini Güncelleştirme

Şekil 29: Yöntemin Deyimini SELECTGetProducts() Güncelleştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Yöntemi bu yeni sorguyu GetProducts() kullanacak şekilde güncelleştirdikten sonra DataTable iki yeni sütun içerir: CategoryName ve SupplierName.

Products DataTable'da İki Yeni Sütun Var

Şekil 30: DataTable'da Products İki Yeni Sütun Var

Bir dakika ayırarak yöntemindeki SELECT yan tümcesini de güncelleştirin GetProductsByCategoryID(categoryID) .

Söz dizimini GetProducts()SELECT kullanarak JOIN öğesini güncelleştirirseniz DataSet Tasarım Aracı veritabanı verilerini ekleme, güncelleştirme ve silme yöntemlerini veritabanı doğrudan desenini kullanarak otomatik olarak oluşturamaz. Bunun yerine, bunları bu öğreticinin önceki bölümlerindeki yöntemiyle yaptığımız gibi el ile InsertProduct oluşturmanız gerekir. Ayrıca, toplu güncelleştirme desenini InsertCommandkullanmak istiyorsanız , UpdateCommandve DeleteCommand özellik değerlerini el ile sağlamanız gerekir.

Kalan TableAdaplayıcıları Ekleme

Şimdiye kadar tek bir veritabanı tablosu için yalnızca tek bir TableAdapter ile çalışmayı inceledik. Ancak Northwind veritabanı, web uygulamamızda birlikte çalışmamız gereken birkaç ilişkili tablo içerir. Yazılan Veri Kümesi birden çok ilgili DataTable içerebilir. Bu nedenle DAL'mizi tamamlamak için bu öğreticilerde kullanacağımız diğer tablolar için DataTable'lar eklemeliyiz. Türü Belirlenmiş Bir DataSet'e yeni bir TableAdapter eklemek için DataSet Tasarım Aracı açın, Tasarım Aracı sağ tıklayın ve Ekle / TabloAdapter'ı seçin. Bu, yeni bir DataTable ve TableAdapter oluşturur ve bu öğreticinin önceki bölümlerinde incelediğimiz sihirbazda size yol gösterir.

Aşağıdaki sorguları kullanarak aşağıdaki TableAdapters ve yöntemlerini oluşturmak birkaç dakika sürer. içindeki ProductsTableAdapter sorguların, her ürünün kategorisini ve sağlayıcı adlarını almak için alt sorguları içerdiğini unutmayın. Ayrıca, takip ediyorsanız sınıfın ProductsTableAdapterGetProducts() ve GetProductsByCategoryID(categoryID) yöntemlerini zaten eklemişsinizdir.

  • ProductsTableAdapter

    • GetProducts:

      SELECT     ProductID, ProductName, SupplierID, 
      CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, 
      UnitsOnOrder, ReorderLevel, Discontinued, 
      (SELECT CategoryName FROM Categories WHERE
      Categories.CategoryID = Products.CategoryID) as 
      CategoryName, (SELECT CompanyName FROM Suppliers
      WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      
    • GetProductsByCategoryID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName,
      (SELECT CompanyName FROM Suppliers WHERE
      Suppliers.SupplierID = Products.SupplierID)
      as SupplierName
      FROM         Products
      WHERE      CategoryID = @CategoryID
      
    • GetProductsBySupplierID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE 
      Suppliers.SupplierID = Products.SupplierID) as SupplierName
      FROM         Products
      WHERE SupplierID = @SupplierID
      
    • GetProductByProductID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName 
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      WHERE ProductID = @ProductID
      
  • CategoriesTableAdapter

    • GetCategories:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • SuppliersTableAdapter

    • GetSuppliers:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      
    • GetSuppliersByCountry:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE Country = @Country
      
    • GetSupplierBySupplierID:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE SupplierID = @SupplierID
      
  • EmployeesTableAdapter

    • GetEmployees:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • GetEmployeesByManager:

      SELECT     EmployeeID, LastName, FirstName, Title, 
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE ReportsTo = @ManagerID
      
    • GetEmployeeByEmployeeID:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE EmployeeID = @EmployeeID
      

Dört TableAdapters Eklendikten Sonra DataSet Tasarım Aracı

Şekil 31: Dört TableAdapters Eklendikten Sonra DataSet Tasarım Aracı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DAL'ye Özel Kod Ekleme

Typed DataSet'e eklenen TableAdapters ve DataTable'lar bir XML Şema Tanımı dosyası ()Northwind.xsd olarak ifade edilir. Çözüm Gezgini dosyaya Northwind.xsd sağ tıklayıp Kodu Görüntüle'yi seçerek bu şema bilgilerini görüntüleyebilirsiniz.

Northwinds TürüNezilen DataSet için XML Şema Tanımı (XSD) Dosyası

Şekil 32: Northwinds Yazılan Veri Kümesi için XML Şema Tanımı (XSD) Dosyası (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu şema bilgileri, derlendiğinde veya çalışma zamanında (gerekirse) tasarım zamanında C# veya Visual Basic koduna çevrilir ve bu noktada hata ayıklayıcı ile adım adım ilerleyebilirsiniz. Otomatik olarak oluşturulan bu kodu görüntülemek için Sınıf Görünümü'ne gidin ve TableAdapter veya Typed DataSet sınıflarına gidin. Ekranınızda Sınıf Görünümü'nü görmüyorsanız, Görünüm menüsüne gidin ve buradan seçin veya Ctrl+Shift+C tuşlarına basın. Sınıf Görünümü'nden Typed DataSet ve TableAdapter sınıflarının özelliklerini, yöntemlerini ve olaylarını görebilirsiniz. Belirli bir yöntemin kodunu görüntülemek için Sınıf Görünümü'nde yöntem adına çift tıklayın veya sağ tıklayıp Tanıma Git'i seçin.

Sınıf Görünümünden Tanıma Git'i seçerek otomatik olarak oluşturulan kodu inceleyin

Şekil 33: Sınıf Görünümünden Tanıma Git'i seçerek Otomatik Oluşturulan Kodu İnceleme

Otomatik olarak oluşturulan kod harika bir zaman tasarrufu sağlayabilir ancak genellikle çok geneldir ve bir uygulamanın benzersiz gereksinimlerini karşılamak için özelleştirilmesi gerekir. Ancak otomatik olarak oluşturulan kodu genişletme riski, kodu oluşturan aracın özelleştirmelerinizi "yeniden oluşturma" ve üzerine yazma zamanına karar vermesine neden olabilir. .NET 2.0'ın yeni kısmi sınıf kavramıyla, bir sınıfı birden çok dosyaya bölmek kolaydır. Bu, Visual Studio'yu özelleştirmelerimizin üzerine yazma konusunda endişelenmenize gerek kalmadan otomatik olarak oluşturulan sınıflara kendi yöntemlerimizi, özelliklerimizi ve olaylarımızı eklememizi sağlar.

DAL'yi özelleştirmeyi göstermek için sınıfına SuppliersRow bir GetProducts() yöntem ekleyelim. SuppliersRow sınıfı tablodaki Suppliers tek bir kaydı temsil eder; her sağlayıcı birçok ürüne sıfır sağlayabilir, bu nedenle GetProducts() belirtilen sağlayıcının bu ürünlerini döndürür. Bunu yapmak için adlı SuppliersRow.vb klasörde yeni bir sınıf dosyası App_Code oluşturun ve aşağıdaki kodu ekleyin:

Imports NorthwindTableAdapters
Partial Public Class Northwind
    Partial Public Class SuppliersRow
        Public Function GetProducts() As Northwind.ProductsDataTable
            Dim productsAdapter As New ProductsTableAdapter
            Return productsAdapter.GetProductsBySupplierID(Me.SupplierID)
        End Function
    End Class
End Class

Bu kısmi sınıf derleyiciye sınıfı oluştururken Northwind.SuppliersRow az önce tanımladığımız yöntemi içermesini GetProducts() bildirir. Projenizi derleyip Sınıf Görünümü'ne dönerseniz artık yöntemi Northwind.SuppliersRowolarak listelendiğini görürsünüzGetProducts().

GetProducts() Yöntemi Artık Northwind.SuppliersRow Sınıfının Bir Parçasıdır

Şekil 34: GetProducts() Yöntem Artık Sınıfın Northwind.SuppliersRow Bir Parçasıdır

Yöntemi GetProducts() artık aşağıdaki kodda gösterildiği gibi belirli bir sağlayıcının ürün kümesini listelemek için kullanılabilir:

Dim suppliersAdapter As New NorthwindTableAdapters.SuppliersTableAdapter()
Dim suppliers As Northwind.SuppliersDataTable = suppliersAdapter.GetSuppliers()
For Each supplier As Northwind.SuppliersRow In suppliers
    Response.Write("Supplier: " & supplier.CompanyName)
    Response.Write("<ul>")
    Dim products As Northwind.ProductsDataTable = supplier.GetProducts()
    For Each product As Northwind.ProductsRow In products
        Response.Write("<li>" & product.ProductName & "</li>")
    Next
    Response.Write("</ul><p> </p>")
Next

Bu veriler herhangi bir ASP'de de görüntülenebilir. NET'in veri Web denetimleri. Aşağıdaki sayfada iki alan içeren bir GridView denetimi kullanılır:

  • Her sağlayıcının adını görüntüleyen bir BoundField ve
  • Her sağlayıcı için yöntemi tarafından GetProducts() döndürülen sonuçlara bağlı bir BulletedList denetimi içeren TemplateField.

Gelecek öğreticilerde bu tür ana ayrıntı raporlarının nasıl görüntüleneceğini inceleyeceğiz. Şimdilik, bu örnek sınıfa eklenen özel yöntemi kullanarak göstermek üzere Northwind.SuppliersRow tasarlanmıştır.

SuppliersAndProducts.aspx

<%@ Page Language="VB" CodeFile="SuppliersAndProducts.aspx.vb"
    AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Suppliers and Their Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             AutoGenerateColumns="False"
             CssClass="DataWebControlStyle">
                <HeaderStyle CssClass="HeaderStyle" />
                <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                <Columns>
                    <asp:BoundField DataField="CompanyName"
                      HeaderText="Supplier" />
                    <asp:TemplateField HeaderText="Products">
                        <ItemTemplate>
                            <asp:BulletedList ID="BulletedList1"
                             runat="server" DataSource="<%# CType(CType(Container.DataItem, System.Data.DataRowView).Row, Northwind.SuppliersRow).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class SuppliersAndProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim suppliersAdapter As New SuppliersTableAdapter
        GridView1.DataSource = suppliersAdapter.GetSuppliers()
        GridView1.DataBind()
    End Sub
End Class

Tedarikçinin Şirket Adı Sol Sütunda, Ürünleri Sağda Listelenir

Şekil 35: Sağlayıcının Şirket Adı Sol Sütunda, Ürünleri Sağda Listelenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

Bir web uygulaması oluştururken DAL,sunu katmanınızı oluşturmaya başlamadan önce ilk adımlarınızdan biri olmalıdır. Visual Studio ile, Yazılan Veri Kümelerini temel alan bir DAL oluşturmak, bir kod satırı yazmadan 10-15 dakika içinde gerçekleştirilebilecek bir görevdir. Bu DAL'nin üzerine ilerleyen öğreticiler eklenecektir. Sonraki öğreticide bir dizi iş kuralı tanımlayacak ve bunları ayrı bir İş Mantığı Katmanında nasıl uygulayacağımızı 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:

Bu Öğreticide Yer Alan Konularda Video Eğitimi

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çirenleri Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez ve Carlos Santos oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.