Aracılığıyla paylaş


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

tarafından Scott Mitchell

PDF'i indirin

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 hayatımız verilerle çalışma etrafında dönüyor. Verileri depolamak için veritabanları, bunları 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 serinin ilk öğreticisidir. Türemiş Veri Kümelerini, özel iş kurallarını zorunlu kılan bir İş Mantığı Katmanını (BLL) ve ortak sayfa düzenini paylaşan ASP.NET sayfalardan oluşan bir sunu katmanını kullanarak Veri Erişim Katmanından (DAL) oluşan bir yazılım mimarisi oluşturmakla başlayacağız. Bu arka uç temel çalışması hazırlandıktan sonra raporlamaya geçeceğiz ve web uygulamasından verileri görüntüleme, özetleme, toplama ve doğrulama adımlarını göstereceğ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ü içeren 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 geri kalanı ç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 NORTHWNDConnectionString dosyasındaki Web.config ayarı güncelleştirmeniz 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 eşit derecede iyi çalışacaktı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ü öğreticiden 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.

Yeni Dosya Sistemi Tabanlı Web Sitesi Oluşturma

Şekil 1: Yeni Bir Dosya Sistemi Tabanlı Web Sitesi 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 Türemiş Veri Kümeleri 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 zaten 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 kurulumunun olup olmadığına bağlıdır.

Klasörde VeritabanıApp_DataKullanma

Bağlanacak bir SQL Server 2000 veya 2005 veritabanı sunucunuz yoksa veya veritabanını bir veritabanı sunucusuna eklemek zorunda kalmamak istiyorsanı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ör App_Data , SQL Server karşılıkları gibi Sunucu Gezgini'ne 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. Ancak Access veritabanlarının SQL Server kadar özellik açısından zengin 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 belirli veritabanı düzeyindeki özellikleri kullanır.

Microsoft SQL Server 2000 veya 2005 Veritabanı Sunucusu'nda 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 Bağlantıları 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 Bağlantıları düğümünü 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ı Oluşturma

Verilerle çalışırken bir 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ünde 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 bir arada kullanır. 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 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, SELECT, INSERT, UPDATEve DELETE komutları verme 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 hiçbir başvuru içermemeli, bunun yerine tüm veri istekleri için DAL'ye çağrılar 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 Products ait oldukları kategorileri kaydeden ve tabloları vardırCategories. 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, 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 kesin olarak tanımlanmış olan nesnedir; bunun tam tersi, gevşek türdeki bir nesne ise çalışma zamanına kadar şeması bilinmeyen 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ürde 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 yazma işlemi, bir dize veya sıra dizini kullanarak sütun adına erişmemiz gerektiği gerçeğiyle ortaya konur. Öte yandan, kesin olarak türlenmiş bir DataTable, 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 belirlenmiş nesneler döndürmek için geliştiriciler kendi özel iş nesnelerini oluşturabilir veya Türlenmiş Veri Kümeleri kullanabilir. İş nesnesi, geliştirici tarafından genellikle iş nesnesinin temsil ettiği temel veritabanı tablosunun sütunlarını yansıtan bir sınıf olarak uygulanır. Türlenmiş Veri Kümesi, visual studio tarafından bir veritabanı şemasına dayalı olarak sizin için oluşturulan ve üyeleri bu şemaya göre kesin olarak yazılan bir sınıftır. Türü Belirtilen DataSet'in kendisi DataSet, DataTable ve DataRow sınıflarını genişleten ADO.NET sınıflardan oluşur. Kesin olarak yazılan DataTable'lara ek olarak, Yazılan DataSet'ler artık DataSet'in DataTable'larını doldurma ve DataTable'lar içindeki değişiklikleri veritabanına geri yayma yöntemlerine sahip sınıflar olan TableAdapters'ı da içerir.

Not

Türemiş Veri Kümelerini kullanmanın özel iş nesneleriyle karşı karşıya kullanmanın avantajları ve dezavantajları hakkında daha fazla bilgi için bkz. Veri Katmanı Bileşenleri Tasarlama ve KatmanlarDan Veri Geçirme.

Bu öğreticilerin mimarisi için kesin türemiş 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 Devredildi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Türlenmiş Veri Kümesi 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ımcı görüntülenir ve TableAdapter Yapılandırma Sihirbazı başlatılır ve ilk TableAdapter'ınızı Yazılan Veri Kümesine eklemenize olanak tanır.

Türlenmiş Veri Kümesi, kesin olarak türlenmiş bir veri koleksiyonu işlevi görür; her biri kesin olarak türü 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 belirlenmiş bir DataTable oluşturacağız. Şimdi tablo için Products bir DataTable oluşturarak başlayalım.

Kesin olarak yazılan DataTable'ların, temel alınan veritabanı tablolarındaki verilere nasıl erişeceklerine ilişkin hiçbir bilgi içermediğini unutmayın. DataTable'ı dolduracak verileri almak için, Veri Erişim Katmanımız olarak işlev gösteren bir TableAdapter sınıfı kullanırız. DataTable'ımız Products için TableAdapter, sunu katmanından çağıracağımız , GetProducts()vb. yöntemlerini GetProductByCategoryID(categoryID)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, bunu yapmak için şu anda Yeni Bağlantı düğmesine tıklayabilirsiniz.

Açılan Listeden Northwind Veritabanı'nı seçin

Şekil 5: Açılan Listeden 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ına sabit kodlanmış olmasını önlersiniz; bu da gelecekte bağlantı dizesi bilgilerin değişmesi durumunda işleri basitleştirir. bağlantı dizesi yapılandırma dosyasına kaydetmeyi tercih ederseniz, bu bölüme yerleştirilir<connectionStrings>; gelişmiş güvenlik için isteğe bağlı olarak şifrelenebilir veya daha sonra YÖNETICILER için daha ideal olan IIS GUI Yönetim Aracı'ndaki yeni ASP.NET 2.0 Özellik Sayfası aracılığıyla değiştirilebilir.

Bağlantı Dizesini Web.config'e kaydetme

Ş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 olarak belirlenmiş ilk DataTable için şemayı tanımlamamız ve kesin türe sahip DataSet'i doldurma sırasında TableAdapter'ımız için kullanılacak ilk yöntemi sağlamamız gerekir. Bu iki adım, DataTable'ımıza 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 olarak 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:

SQL Sorgusunu Metin Kutusuna Girin

Ş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şturur.

Sorgu Düzenleyicisi aracılığıyla Sorguyu Grafik olarak oluşturma

Şekil 9: Sorgu Düzenleyicisi aracılığıyla Sorguyu 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 varsayılan olarak seçilen tek gelişmiş seçenek "Ekle, Güncelleştir ve Sil deyimleri oluştur" seçeneğidir; 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. Şimdilik "İyimser eşzamanlılık kullan" seçeneğini işaretsiz bırakın. Gelecek öğreticilerde iyimser eşzamanlılığı inceleyeceğiz.

Yalnızca Ekle, Güncelleştir ve Sil 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 doldurun 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üğü şekilde döndürdüğü bu yaklaşımla bir DataTable döndürür.

TableAdapter'ın bu desenlerden birini veya her ikisini de gerçekleştirmesini sağlayabilirsiniz. Burada sağlanan yöntemleri de yeniden adlandırabilirsiniz. Bu öğreticiler boyunca yalnızca ikinci deseni 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" adlı son onay kutusu TableAdapter için , Insert()ve Update() yöntemlerini oluştururDelete(). 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 deyimlerini oluştur" seçeneğinin işaretini kaldırdıysanız bu onay kutusunun ayarı 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ştirme (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 Designer'a geri döneriz. DataTable'da (Products, vb.) sütunların ProductID listesini ve (ProductName ve ProductsTableAdapter) yöntemlerini Fill()GetProducts()görebilirsiniz.

Products DataTable ve ProductsTableAdapter Türü Belirtilen DataSet'e 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 NorthwindTableAdapters.ProductsTableAdapter bir Türlenmiş DataSet'imiz vardırGetProducts(). 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 bit kod yazmamızı gerektirmez. hiçbir ADO.NET sınıfı örneği oluşturmamıza gerek yoktu, hiçbir bağlantı dizesi, SQL sorgusuna veya saklı yordama 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'nın IntelliSense ve derleme zamanı türü denetimi sağlamasına olanak sağlar. TableAdapter tarafından döndürülen tüm DataTable'ların en iyisi GridView, DetailsView, DropDownList, CheckBoxList gibi veri Web denetimlerini ASP.NET 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 bir GridView'a Page_Load 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üleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu örnekte, ASP.NET sayfamızın Page_Load olay işleyicisinde üç kod satırı yazmamız gerekse de, gelecek öğreticilerde, DAL'den verileri bildirimli olarak almak için ObjectDataSource'un nasıl kullanılacağını inceleyeceğiz. ObjectDataSource ile herhangi bir kod yazmamız gerekmeyecek ve disk belleği 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ızın 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.

Şimdi yöntemini ekleyelim GetProductsByCategoryID(categoryID) . DAL'ye yeni bir yöntem eklemek için DataSet Designer'a 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'a sağ tıklayın ve Sorgu Ekle'yi seçin

İlk olarak geçici bir SQL deyimi 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 olan tüm ürünleri döndürmek istediğimizden, satırları döndüren bir SELECT deyim yazmak istiyoruz.

Satır 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, ile aynı SELECT deyimi kullanıyorum ancak şu GetProducts() yan tümcesini ekliyorum: WHERE.WHERE CategoryID = @CategoryID @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 hangi veri erişim desenlerinin kullanılacağını seçebilir ve oluşturulan yöntemlerin adlarını özelleştirebiliriz. Dolgu deseni için, datatable dönüş deseni (FillByCategoryIDyöntemler) için adını GetX ve olarak değiştirelim, şimdi kullanalımGetProductsByCategoryID.

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ımcısı 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 Designer'dan 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 görüntüyü görüntülemek için tıklayın)

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

İçecekler.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

Şekil 20: İçecek Kategorisindeki Ürünler Görüntüleniyor (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 bir ondalık UnitPrice, 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, tek 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ı ile 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 oluştururken "GenerateDBDirectMethods" onay kutusunu işaretli bıraktıysanız, VERITABANı doğrudan deseni , Insert()ve Update() yöntemleri aracılığıyla Delete()da uygulanır.

Her iki veri değişikliği deseni de, , ve komutlarını InsertCommandveritabanına vermek için TableAdapter 'ın UpdateCommandDeleteCommand, INSERTve UPDATE özelliklerini kullanır.DELETE DataSet Designer'da InsertCommandTableAdapter'a tıklayıp Özellikler penceresi giderek , UpdateCommandve DeleteCommand özelliklerini inceleyebilir ve değiştirebilirsiniz. (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, , InsertCommandve UpdateCommand Özelliklerine sahiptir DeleteCommand(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 , INSERTve UPDATE Deyimlerini yapılandırma DELETE(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Aşağıdaki kod örneği, toplu güncelleştirme düzeninin, durdurulmayan ve stokta 25 birim veya daha az olan tüm ürünlerin fiyatını iki katına getirmek için 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 deseninin 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 birçok sütunu olan tablolar için biraz zahmetli olabilir. IntelliSense'in yardımı olmadan önceki kod örneğine baktığımızda, hangi tablo sütununun her giriş parametresiyle ve Products yöntemlerine Update() eşlediği özellikle net Insert() değildir. Yalnızca bir veya iki sütunu güncelleştirmek istediğimiz veya yeni eklenen kaydın Insert() (otomatik artırma) alanının değerini döndürecek özelleştirilmiş IDENTITY bir yöntem istediğimiz zamanlar olabilir.

Böyle bir özel yöntem oluşturmak için DataSet Designer'a 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 ekleyip yeni eklenen kaydın ProductIDdeğerini döndüren bir yöntem oluşturalım. Bu nedenle, sorgu INSERT oluşturmayı tercih edin.

Ürünler Tablosuna Yeni Satır Ekleme Yöntemi 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 'InsertCommandler CommandTextgörüntülenir. Sorgunun sonuna ekleyerek SELECT SCOPE_IDENTITY() bu sorguyu genişletin. Bu, aynı kapsamdaki bir IDENTITY sütuna eklenen son kimlik değerini döndürür. (@@IDENTITY yerine SCOPE_IDENTITY() kullanmak isteme SCOPE_IDENTITY().) 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öntemini InsertProductolarak adlandırın.

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

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

DataSet Designer'a döndüğünüzde öğesinin yeni bir yöntem ProductsTableAdapteriçerdiğini InsertProduct görürsünüz. Bu yeni yöntemin tablodaki Products her sütun için bir parametresi yoksa, deyimini noktalı virgülle sonlandırmayı INSERT unutma olasılığınız vardır. InsertProduct yöntemini yapılandırın ve ve INSERT deyimlerini sınırlandıran noktalı virgüle sahip olduğunuzdan SELECT 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 yapmak için yönteminin InsertProductExecuteMode özelliğini olarak Scalarayarlayın.

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

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

Aşağıdaki kod, bu yeni InsertProduct yöntemin ç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 ProductsTableAdapters tablodaki CategoryIDSupplierID ve Products değerlerini döndürdüğünü, ancak tablodaki CategoryName sütunu veya tablodaki Categories sütunu CompanyNameSuppliers 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. TableAdapter'ın ilk yönteminiGetProducts(), hem hem CategoryName de CompanyName sütun değerlerini içerecek şekilde genişletebiliriz. Bu, kesin olarak yazılmış 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 alır. 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ı Categories yerine alt Suppliers sorgular JOIN olarak eklemeye özen göstererek, verileri değiştirmek için bu yöntemleri yeniden düzenlemek zorunda kalmayacağı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

Yöntemdeki SELECT yan tümcesini GetProductsByCategoryID(categoryID) de güncelleştirmek için biraz zaman ayırın.

Söz dizimini GetProducts()SELECT kullanarak JOIN güncelleştirirseniz, DataSet Designer veritabanı verilerini doğrudan veritabanı desenini kullanarak ekleme, güncelleştirme ve silme yöntemlerini 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 TableAdapters'i ekleme

Şimdiye kadar tek bir veritabanı tablosu için 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 Bir DataSet 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. Yazılan Bir DataSet'e yeni bir TableAdapter eklemek için DataSet Designer'ı açın, Tasarımcı'ya 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 için birkaç dakika bekleyin. 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.

  • ÜrünlerTableAdapter

    • 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
      
  • KategorilerTabloAdaptörü

    • Almak Kategorileri:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • TedarikçilerTableAdapter

    • Tedarikçiler almak:

      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 (ÇalışanlarTablo Bağdaştırıcısı)

    • GetÇalışanlar:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • GetEmployeesByManager çalıştır:

      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ımcısı

Şekil 31: Dört TableAdapter Eklendikten Sonra DataSet Tasarımcısı (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ündeki 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 tasarım zamanında veya çalışma zamanında (gerekirse) 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 Oluşturulan Kodu İnceleme

Ş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 kazandırıcı olsa da, kod genellikle çok geneldir ve bir uygulamanın benzersiz gereksinimlerini karşılayacak şekilde özelleştirilmesi gerekir. Ancak otomatik olarak oluşturulan kodu genişletme riski, kodu oluşturan aracın özelleştirmelerinizi "yeniden oluşturmanın" ve üzerine yazmanın zamanına karar verebileceğidir. .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 GetProducts() bir SuppliersRow 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ğlayıcı sağlayabilir, bu nedenle GetProducts() belirtilen sağlayıcının ürünlerini döndürür. Bunu yapmak için adlı App_Code klasörde yeni bir sınıf dosyası SuppliersRow.vb 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 GetProducts()olarak listelendiğini görürsünüzNorthwind.SuppliersRow.

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ı olan 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 bir 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ıfına eklenen özel yöntemi kullanarak göstermek üzere Northwind.SuppliersRow tasarlanmıştır.

TedarikçilerVeÜrünler.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 Listelenmiştir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

DAL'yi oluşturan bir web uygulaması oluştururken, sunu katmanınızı oluşturmaya başlamadan önce gerçekleşen ilk adımlardan biri olmalıdır. Visual Studio ile, Yazılan Veri Kümelerini temel alan bir DAL oluşturmak, kod satırı yazmadan 10-15 dakika içinde gerçekleştirilebilecek bir görevdir. İleriye dönük öğreticiler bu DAL'nin üzerine inşa edilecek. 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 Konulara Yönelik 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ışı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 öğ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. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.