TableAdapter’ı JOIN Kullanacak Biçimde Güncelleştirme (C#)

Scott Mitchell tarafından

Kodu indirin veya PDF 'yi indirin

Bir veritabanıyla çalışırken, birden çok tabloya yayılan veriler istemek yaygındır. İki farklı tablodan verileri almak için bağıntılı bir alt sorgu veya bir JOIN işlemi kullanabilirsiniz. Bu öğreticide, ana sorgusunda JOIN içeren bir TableAdapter oluşturmayı aramadan önce bağıntılı alt sorguları ve JOIN sözdizimini karşılaştırıyoruz.

Giriş

İlişkisel veritabanlarında, çalışma konusunda ilgilendiğiniz veriler genellikle birden çok tablo arasında yayılır. Örneğin, ürün bilgilerini görüntülerken her bir ürüne karşılık gelen her bir kategori ve sağlayıcı adını listelemek istiyoruz. Products tabloda CategoryID ve SupplierID değerleri bulunur, ancak gerçek kategori ve tedarikçi adları sırasıyla Categories ve Suppliers tablolarında bulunur.

Başka bir ilişkili tablodan bilgi almak için, bağıntılı alt sorgular veya JOINskullanabilirsiniz. Bağıntılı alt sorgu, dış sorgudaki sütunlara başvuran iç içe bir SELECT sorgusudur. Örneğin, veri erişim katmanı oluşturma öğreticisinde, her ürün için kategori ve Tedarikçi adlarını döndürmek üzere ProductsTableAdapter s ana sorgusunda iki bağıntılı alt sorgu kullandık. JOIN, iki farklı tablodan ilgili satırları birleştiren bir SQL yapısıdır. Her ürünle birlikte kategori bilgilerini göstermek için SqlDataSource denetim öğreticisi Ile verileri sorgulama JOIN kullandık.

JOIN s 'yi TableAdapters ile kullanmanın yanı sıra, ilişkili INSERT, UPDATEve DELETE deyimlerini otomatik olarak oluşturmak için TableAdapter s sihirbazının sınırlamalarından kaynaklanır. Daha belirgin bir şekilde, TableAdapter s ana sorgusu herhangi bir JOIN s içeriyorsa, TableAdapter InsertCommand, UpdateCommandve DeleteCommand özellikleri için geçici SQL deyimlerini veya saklı yordamları otomatik olarak oluşturamaz.

Bu öğreticide, ana sorgusunda JOIN s 'yi içeren bir TableAdapter oluşturmayı keşfetmeye başlamadan önce bağıntılı alt sorguları ve JOIN s 'leri daha fazla karşılaştıracağız.

Bağıntılı alt sorgular veJOIN s karşılaştırması ve karşıt

Northwind veri kümesindeki ilk öğreticide oluşturulan ProductsTableAdapter, her bir ürüne karşılık gelen her bir kategoriyi ve tedarikçi adını geri getirmek için bağıntılı alt sorguları kullandığını hatırlayın. ProductsTableAdapter s ana sorgusu aşağıda gösterilmiştir.

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

İki bağıntılı alt sorgu-(SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID) ve (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID)-, dış SELECT deyimlerinin sütun listesinde ek bir sütun olarak her ürün için tek bir değer döndüren SELECT sorgulardır.

Alternatif olarak, bir JOIN her ürün tedarikçisine ve kategori adına döndürmek için de kullanılabilir. Aşağıdaki sorgu yukarıdaki ile aynı çıktıyı döndürür, ancak alt sorgular yerine JOIN s kullanır:

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

JOIN, bir tablodaki kayıtları, bazı ölçütlere göre başka bir tablodaki kayıtlarla birleştirir. Yukarıdaki sorguda, örneğin, LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID her ürün kaydını CategoryID değeri ürün s CategoryID değeri ile eşleşen kategori kaydıyla birleştirmeye SQL Server söyler. Birleştirilmiş sonuç, her ürün için karşılık gelen kategori alanlarıyla (CategoryName) çalışmamızı sağlar.

Note

JOIN s 'ler, ilişkisel veritabanlarından veri sorgulanırken yaygın olarak kullanılır. JOIN söz dizimine yeni bir bit kullanıyorsanız veya kullanımı için bir bit kullanmanız gerekiyorsa, w3 okullarından SQL JOIN öğreticisini önerdim. Ayrıca, SQL Books Online'ın JOIN temel bilgiler ve alt sorgu temelleri bölümleri de okunuyor.

JOIN s ve bağıntılı alt sorgular her ikisi de diğer tablolardan ilgili verileri almak için kullanıldığından, birçok geliştirici kafa çekmesini ve hangi yaklaşımın kullanılacağını merak ediyor. En çok kabaca aynı şeyi söylediği için, daha önce sundum olan tüm SQL Gurus 'ları, SQL Server kabaca özdeş yürütme planları üretecektir. Bu durumda, sizin ve takımınızın en rahat olduğu tekniğin kullanılması önerilir. Bu uzmanlardan sonra bu uzmanlar, bağıntılı alt sorgular üzerinde JOIN s tercihini hemen ifade ettikten sonra ele aldığını belirtir.

Yazılan veri kümelerini kullanarak bir veri erişim katmanı oluştururken araçlar, alt sorgular kullanılırken daha iyi çalışır. Özellikle, TableAdapter s Sihirbazı, ana sorgu herhangi bir JOIN s içeriyorsa karşılık gelen INSERT, UPDATEve DELETE deyimlerini otomatik olarak oluşturmaz, ancak bağıntılı alt sorgular kullanıldığında bu deyimleri otomatik olarak oluşturur.

Bu eksiklikleri araştırmak için ~/App_Code/DAL klasöründe geçici olarak yazılmış bir veri kümesi oluşturun. TableAdapter Yapılandırma Sihirbazı sırasında, geçici SQL deyimlerini kullanmayı seçin ve aşağıdaki SELECT sorguyu girin (bkz. Şekil 1):

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

birleşimler Içeren bir ana sorgu girin

Şekil 1: JOIN s Içeren bir ana sorgu girin (tam boyutlu görüntüyü görüntülemek için tıklayın)

Varsayılan olarak TableAdapter, ana sorguya göre otomatik olarak INSERT, UPDATEve DELETE deyimlerini oluşturacaktır. Gelişmiş düğmesine tıklarsanız, bu özelliğin etkin olduğunu görebilirsiniz. Bu ayara rağmen, ana sorgu bir JOINiçerdiğinden TableAdapter INSERT, UPDATEve DELETE deyimlerini oluşturamayacak.

Birleşimler Içeren bir ana sorgu girin

Şekil 2: JOIN s Içeren bir ana sorgu girin

Sihirbazı tamamladığınızda son ' a tıklayın. Bu noktada, DataSet s Designer, SELECT Query s sütun listesinde döndürülen her bir alan için sütun içeren bir DataTable içeren tek bir TableAdapter içerir. Bu, Şekil 3 ' ün gösterdiği gibi CategoryName ve SupplierNameiçerir.

DataTable, sütun listesinde döndürülen her alan için bir sütun Içerir

Şekil 3: DataTable, sütun listesinde döndürülen her alan Için bir sütun içerir

DataTable uygun sütunlara sahip olsa da TableAdapter InsertCommand, UpdateCommandve DeleteCommand özellikleri için değerler eksiktir. Bunu onaylamak için, tasarımcıda TableAdapter 'a tıklayın ve ardından Özellikler penceresi gidin. InsertCommand, UpdateCommandve DeleteCommand özelliklerinin (None) olarak ayarlandığını görürsünüz.

InsertCommand, UpdateCommand ve DeleteCommand özellikleri (yok) olarak ayarlanır

Şekil 4: InsertCommand, UpdateCommandve DeleteCommand özellikleri (yok) olarak ayarlanır (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu eksiklikleri geçici olarak çözmek için, Özellikler penceresi aracılığıyla InsertCommand, UpdateCommandve DeleteCommand özelliklerinin SQL deyimlerini ve parametrelerini el ile sağlayabiliriz. Alternatif olarak, TableAdapter s ana sorgusunu hiçbir JOIN s 'yi içerecek şekilde yapılandırarak başlayabiliriz. Bu, INSERT, UPDATEve DELETE deyimlerinin ABD için otomatik olarak oluşturulmasını sağlar. Sihirbazı tamamladıktan sonra, JOIN sözdizimini içermesi için TableAdapter s SelectCommand Özellikler penceresi el ile güncelleştirebilirsiniz.

Bu yaklaşım çalışırken, TableAdapter s ana sorgusunun sihirbaz aracılığıyla yeniden yapılandırıldığı, otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerinin yeniden oluşturulduğu her seferinde geçici SQL sorguları kullanılırken çok Brittle. Diğer bir deyişle, TableAdapter 'a sağ tıklıyoruz, bağlam menüsünden Yapılandır ' ı seçip Sihirbazı yeniden tamamladıktan sonra, daha sonra yaptığımız tüm özelleştirmeler kaybedilir.

TableAdapter s otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerinin britttayeti, neyse ki geçici SQL deyimleriyle sınırlıdır. TableAdapter saklı yordamlar kullanıyorsa, SelectCommand, InsertCommand, UpdateCommandveya DeleteCommand saklı yordamları özelleştirebilir ve, saklı yordamların değiştirilmesini sağlamak zorunda kalmadan TableAdapter Yapılandırma Sihirbazı 'nı yeniden çalıştırabilirsiniz.

Sonraki birkaç adımda, başlangıçta, ilgili INSERT, Update ve delete saklı yordamlarının otomatik olarak üretilebilmesi için JOIN s 'yi atlayacak bir ana sorgu kullanan bir TableAdapter oluşturacağız. Daha sonra, ilgili tablolardan ek sütunları döndüren bir JOIN kullanması için SelectCommand güncelleştireceğiz. Son olarak, karşılık gelen bir Iş mantığı katman sınıfı oluşturacağız ve TableAdapter 'ı bir ASP.NET Web sayfasında kullanmayı gösteririz.

1. Adım: Basitleştirilmiş ana sorgu kullanarak TableAdapter oluşturma

Bu öğreticide, NorthwindWithSprocs veri kümesindeki Employees tablo için bir TableAdapter ve kesin olarak yazılmış bir DataTable ekleyeceğiz. Employees tablosu, çalışan s Manager 'ın EmployeeID belirtilen bir ReportsTo alanı içerir. Örneğin, çalışan Anne Dodsworth 'un, Steven Uludağ 'ın EmployeeID ReportTo değeri 5 ' tir. Sonuç olarak, Anne, Steven ve yöneticisini raporlar. Her çalışan ReportsTo değerini raporlamaya birlikte, yönetici adlarını da almak da isteyebilirsiniz. Bu, bir JOINkullanılarak gerçekleştirilebilir. Ancak, ilk olarak TableAdapter oluştururken bir JOIN kullanmak, sihirbazın ilgili ekleme, güncelleştirme ve silme yeteneklerini otomatik olarak oluşturmasını da ister. Bu nedenle, ana sorgusu hiç JOIN s içermeyen bir TableAdapter oluşturarak başlayacağız. Ardından, adım 2 ' de, yönetici adını bir JOINaracılığıyla almak için ana sorgu saklı yordamını güncelleştireceğiz.

~/App_Code/DAL klasöründe NorthwindWithSprocs veri kümesini açarak başlayın. Tasarımcıya sağ tıklayın, bağlam menüsünden Ekle seçeneğini belirleyin ve TableAdapter menü öğesini seçin. Bu, TableAdapter Yapılandırma Sihirbazı 'nı başlatır. Şekil 5 ' te gösterildiği gibi, sihirbazın yeni saklı yordamlar oluşturmasını ve Ileri ' ye tıkladığını gösterir. TableAdapter s sihirbazından yeni saklı yordamlar oluşturmaya yönelik Yenileyici için, yazılan veri kümesi s TableAdapters öğreticisi Için yeni saklı yordamlar oluşturma bölümüne bakın.

yeni saklı yordamlar oluştur seçeneğini belirleyin

Şekil 5: Yeni saklı yordamlar oluştur seçeneğini belirleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter s ana sorgusu için aşağıdaki SELECT ifadesini kullanın:

SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country
FROM Employees

Bu sorgu hiçbir JOIN s içermediğinden, TableAdapter Sihirbazı ilgili INSERT, UPDATEve DELETE deyimleriyle otomatik olarak saklı yordamlar oluşturacak ve ana sorguyu yürütmek için bir saklı yordam oluşturacaktır.

Aşağıdaki adım, TableAdapter saklı yordamlarını ad etmemizi sağlar. Şekil 6 ' da gösterildiği gibi Employees_Select, Employees_Insert, Employees_Updateve Employees_Deleteadlarını kullanın.

TableAdapter saklı yordamlarını adlandırın

Şekil 6: TableAdapter s saklı yordamlarını adlandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Son adım, TableAdapter s yöntemlerini adı etmemizi ister. Yöntem adları olarak Fill ve GetEmployees kullanın. Ayrıca, güncelleştirmeleri doğrudan veritabanına göndermek için oluşturma yöntemlerini de bırakın (GenerateDBDirectMethods) onay kutusunun işaretli olduğundan emin olun.

TableAdapter s yöntemlerinin Fill ve GetEmployees adına adı

Şekil 7: TableAdapter s metotlarını Fill ve GetEmployees adlandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbazı tamamladıktan sonra, veritabanında saklı yordamları incelemek için bir dakikanızı ayırın. Dört yeni tane görmeniz gerekir: Employees_Select, Employees_Insert, Employees_Updateve Employees_Delete. Sonra, EmployeesDataTable ve yeni oluşturulan EmployeesTableAdapter inceleyin. DataTable, ana sorgu tarafından döndürülen her alan için bir sütun içerir. TableAdapter ' a tıklayın ve ardından Özellikler penceresi gidin. InsertCommand, UpdateCommandve DeleteCommand özelliklerinin ilgili saklı yordamları çağırmak üzere doğru şekilde yapılandırıldığını görürsünüz.

TableAdapter INSERT, Update ve DELETE özelliklerini Içerir

Şekil 8: TableAdapter INSERT, Update ve DELETE özelliklerini içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Ekleme, güncelleştirme ve silme saklı yordamları otomatik olarak oluşturulur ve InsertCommand, UpdateCommandve DeleteCommand özellikleri doğru şekilde yapılandırıldıysa, her çalışan Yöneticisi hakkında ek bilgi döndürmek için SelectCommand s saklı yordamını özelleştirmeye hazırız. Özellikle, bir JOIN kullanmak ve Manager s FirstName ve LastName değerlerini döndürmek için Employees_Select saklı yordamını güncelleştirmemiz gerekir. Saklı yordam güncelleştirildikten sonra DataTable 'ı bu ek sütunları içerecek şekilde güncelleştirmemiz gerekir. 2 ve 3. adımlarda bu iki görevi ele alacağız.

2. Adım: saklı yordamı birJOIN Içerecek şekilde özelleştirme

Sunucu Gezgini giderek başlayın, Northwind veritabanı s saklı yordamları klasörünün detayına gidin ve Employees_Select saklı yordamını açın. Bu saklı yordamı görmüyorsanız, saklı yordamlar klasörüne sağ tıklayın ve Yenile ' yi seçin. Saklı yordamı, yöneticinin ilk ve son adını döndürmek için bir LEFT JOIN kullanacak şekilde güncelleştirin:

SELECT Employees.EmployeeID, Employees.LastName, 
       Employees.FirstName, Employees.Title, 
       Employees.HireDate, Employees.ReportsTo, 
       Employees.Country,
       Manager.FirstName as ManagerFirstName, 
       Manager.LastName as ManagerLastName
FROM Employees
    LEFT JOIN Employees AS Manager ON
        Employees.ReportsTo = Manager.EmployeeID

SELECT ifadesini güncelleştirdikten sonra, Dosya menüsüne gidip kaydet Employees_Select' i seçerek değişiklikleri kaydedin. Alternatif olarak, araç çubuğundaki Kaydet simgesine tıklayabilir veya CTRL + S ' ye basabilirsiniz. Değişikliklerinizi kaydettikten sonra, Sunucu Gezgini Employees_Select saklı yordamına sağ tıklayın ve Yürüt ' ü seçin. Bu işlem, saklı yordamı çalıştırır ve sonuçlarını çıkış penceresinde gösterir (bkz. Şekil 9).

saklı yordam sonuçları Çıkış Penceresi görüntülenir

Şekil 9: saklı yordam sonuçları çıkış penceresi görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: DataTable s sütunlarını güncelleştirme

Bu noktada, Employees_Select saklı yordamı ManagerFirstName ve ManagerLastName değerler döndürür, ancak EmployeesDataTable bu sütunlar eksik. Bu eksik sütunlar DataTable 'a iki şekilde eklenebilir:

  • Veri kümesi tasarımcısında DataTable üzerinde el ile sağ tıklayın ve Ekle menüsünde sütun ' u seçin. Daha sonra sütunu verebilir ve özelliklerini uygun şekilde ayarlayabilirsiniz.
  • Otomatik olarak -TableAdapter Yapılandırma Sihirbazı, DataTable s sütunlarını SelectCommand saklı yordamının döndürdüğü alanları yansıtacak şekilde güncelleştirir. Geçici SQL deyimlerini kullanırken, SelectCommand artık bir JOINiçerdiğinden, sihirbaz InsertCommand, UpdateCommandve DeleteCommand özelliklerini de kaldırır. Ancak saklı yordamlar kullanılırken bu komut özellikleri değişmeden kalır.

Bir ayrıntılar DataList ve dosya karşıya yükleme Içeren bir ana kayıt listesi listesini kullanarak ana/ayrıntı dahil olmak üzere önceki öğreticilere DataTable sütunlarını el ile eklemeyi araştırdık. bu işleme sonraki öğreticimizde daha ayrıntılı bir şekilde bakacağız. Bununla birlikte, bu öğretici için TableAdapter Yapılandırma Sihirbazı aracılığıyla otomatik yaklaşımı kullanalım.

EmployeesTableAdapter sağ tıklayıp bağlam menüsünden Yapılandır ' ı seçerek başlayın. Bu, seçme, ekleme, güncelleştirme ve silme için kullanılan saklı yordamları, dönüş değerleri ve parametreleriyle birlikte (varsa) listeleyen TableAdapter Yapılandırma Sihirbazı 'nı getirir. Şekil 10 Bu Sihirbazı gösterir. Burada Employees_Select saklı yordamının artık ManagerFirstName ve ManagerLastName alanlarını döndürdüğünü görebiliriz.

sihirbaz Employees_Select saklı yordamının güncelleştirilmiş sütun listesini gösterir

Şekil 10: sihirbaz Employees_Select saklı yordamının güncelleştirilmiş sütun listesini gösterir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Son ' a tıklayarak Sihirbazı doldurun. Veri kümesi tasarımcısına dönmesinden sonra, EmployeesDataTable iki ek sütun içerir: ManagerFirstName ve ManagerLastName.

EmployeesDataTable Iki yeni sütun Içerir

Şekil 11: EmployeesDataTable Iki yeni sütun içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Güncelleştirilmiş Employees_Select saklı yordamının geçerli olduğunu ve TableAdapter 'ın INSERT, Update ve DELETE özelliklerini hala işlevsel olduğunu anlamak için, kullanıcıların çalışanları görüntülemesine ve silmesine izin veren bir Web sayfası oluşturmasına izin verin. Bununla birlikte, böyle bir sayfa oluşturmadan önce, NorthwindWithSprocs veri kümesindeki çalışanlarla çalışmak üzere Iş mantığı katmanında yeni bir sınıf oluşturmanız gerekir. 4. adımda bir EmployeesBLLWithSprocs sınıfı oluşturacağız. 5. adımda bu sınıfı bir ASP.NET sayfasından kullanacağız.

4. Adım: Iş mantığı katmanını uygulama

EmployeesBLLWithSprocs.csadlı ~/App_Code/BLL klasörde yeni bir sınıf dosyası oluşturun. Bu sınıf, var olan EmployeesBLL sınıfının semantiğini taklit eder, yalnızca bu yeni bir tane daha az yöntem sağlar ve NorthwindWithSprocs veri kümesini kullanır (Northwind veri kümesi yerine). Aşağıdaki kodu EmployeesBLLWithSprocs sınıfına ekleyin.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class EmployeesBLLWithSprocs
{
    private EmployeesTableAdapter _employeesAdapter = null;
    protected EmployeesTableAdapter Adapter
    {
        get
        {
            if (_employeesAdapter == null)
                _employeesAdapter = new EmployeesTableAdapter();
            return _employeesAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.EmployeesDataTable GetEmployees()
    {
        return Adapter.GetEmployees();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Delete, true)]
    public bool DeleteEmployee(int employeeID)
    {
        int rowsAffected = Adapter.Delete(employeeID);
        // Return true if precisely one row was deleted, otherwise false
        return rowsAffected == 1;
    }
}

EmployeesBLLWithSprocs sınıf s Adapter özelliği NorthwindWithSprocs veri EmployeesTableAdapterkümesinin bir örneğini döndürür. Bu, sınıf s GetEmployees ve DeleteEmployee yöntemleri tarafından kullanılır. GetEmployees yöntemi, Employees_Select saklı yordamını çağıran ve sonuçlarını bir EmployeeDataTabledolduran EmployeesTableAdapter s karşılık gelen GetEmployees yöntemini çağırır. DeleteEmployee yöntemi benzer şekilde Employees_Delete saklı yordamını çağıran EmployeesTableAdapter s Delete yöntemini çağırır.

5. Adım: sunu katmanındaki verilerle çalışma

EmployeesBLLWithSprocs sınıfı tamamlandıktan sonra, ASP.NET sayfası aracılığıyla çalışan verileriyle çalışmaya hazırız. AdvancedDAL klasöründeki JOINs.aspx sayfasını açın ve araç kutusu 'ndaki bir GridView 'u ID özelliğini Employeesolarak ayarlayarak tasarımcı üzerine sürükleyin. Ardından, GridView s akıllı etiketinden, Kılavuzu EmployeesDataSourceadlı yeni bir ObjectDataSource denetimine bağlayın.

ObjectDataSource 'u EmployeesBLLWithSprocs sınıfını kullanacak şekilde yapılandırın ve SEÇIM ve SILME sekmelerinden, GetEmployees ve DeleteEmployee yöntemlerinin açılan listelerden seçildiğinden emin olun. ObjectDataSource 'un yapılandırmasını gerçekleştirmek için son ' a tıklayın.

, bir EmployeesBLLWithSprocs sınıfını kullanacak şekilde yapılandırma

Şekil 12: EmployeesBLLWithSprocs sınıfını kullanmak için ObjectDataSource 'ı yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource, GetEmployees ve DeleteEmployee yöntemlerini kullanır

Şekil 13: ObjectDataSource 'un GetEmployees ve DeleteEmployee yöntemlerini kullanmasınısağlar (tam boyutlu görüntüyü görüntülemek için tıklayın)

Visual Studio, EmployeesDataTable s sütunlarının her biri için GridView 'a bir BoundField ekler. Title, LastName, FirstName, ManagerFirstNameve ManagerLastName dışındaki tüm bu BoundFields alanlarını kaldırın ve son dört BoundFields HeaderText özelliklerini sırasıyla soyadı, Ilk adı, yönetici adı ve yönetici soyadı olarak yeniden adlandırın.

Kullanıcıların bu sayfadan çalışanları silmesine izin vermek için iki şey yapmanız gerekir. İlk olarak, GridView 'a akıllı etiketinden silmeyi etkinleştir seçeneğini işaretleyerek, silme özelliği sağlamayı söyleyin. İkincisi, ObjectDataSource 'un OldValuesParameterFormatString özelliğini, ObjectDataSource Sihirbazı (original_{0}) tarafından ayarlanan değerden varsayılan değer ({0}) olarak değiştirin. Bu değişiklikleri yaptıktan sonra, GridView ve ObjectDataSource 'un bildirim temelli biçimlendirmesi aşağıdakine benzer görünmelidir:

<asp:GridView ID="Employees" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="EmployeeID" DataSourceID="EmployeesDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        <asp:BoundField DataField="Title" 
            HeaderText="Title" 
            SortExpression="Title" />
        <asp:BoundField DataField="LastName" 
            HeaderText="Last Name" 
            SortExpression="LastName" />
        <asp:BoundField DataField="FirstName" 
            HeaderText="First Name" 
            SortExpression="FirstName" />
        <asp:BoundField DataField="ManagerFirstName" 
            HeaderText="Manager's First Name" 
            SortExpression="ManagerFirstName" />
        <asp:BoundField DataField="ManagerLastName" 
            HeaderText="Manager's Last Name" 
            SortExpression="ManagerLastName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="EmployeesDataSource" runat="server" 
    DeleteMethod="DeleteEmployee" OldValuesParameterFormatString="{0}" 
    SelectMethod="GetEmployees" TypeName="EmployeesBLLWithSprocs">
    <DeleteParameters>
        <asp:Parameter Name="employeeID" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

Sayfayı bir tarayıcı aracılığıyla ziyaret ederek test edin. Şekil 14 ' te gösterildiği gibi, sayfada her bir çalışan ve onun yönetici adı (bir tane olduğu varsayılarak) listelenir.

Employees_Select saklı yordamında KATıLMAYı , yöneticinin adını döndürür

Şekil 14: Employees_Select saklı yordamındaki JOIN, yönetici adını (tam boyutlu görüntüyü görüntülemek Için tıklayın) döndürür

Sil düğmesine tıklamak, Employees_Delete saklı yordamının yürütülmesinde yürütülen iş akışını silme işlemini başlatır. Ancak, bir yabancı anahtar kısıtlaması ihlali nedeniyle saklı yordamdaki denenen DELETE deyimleri başarısız olur (bkz. Şekil 15). Özellikle, her çalışanın Orders tablodaki bir veya daha fazla kaydı vardır ve bu da silmenin başarısız olmasına neden olur.

Karşılık gelen siparişlerin bulunduğu bir çalışanın silinmesi yabancı anahtar kısıtlaması Ihlaline neden olur

Şekil 15: karşılık gelen siparişleri olan bir çalışanın silinmesi yabancı anahtar kısıtlaması ihlaline neden olur (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bir çalışanın silinmesine izin vermek için şunları yapabilirsiniz:

Bunu okuyucu için bir alıştırma olarak bırakıyorum.

Özet

İlişkisel veritabanları ile çalışırken, sorguların verileri birden çok, ilişkili tablodan çekmesini yaygındır. Bağıntılı alt sorgular ve JOIN s bir sorgudaki ilgili tablolardan verilere erişmek için iki farklı teknik sağlar. Önceki öğreticilerde, TableAdapter JOIN s içeren sorgular için INSERT, UPDATEve DELETE deyimlerini otomatik olarak üretireceğiz için bağıntılı alt sorguları en yaygın olarak kullandık. Bu değerler el ile sağlanırken, TableAdapter Yapılandırma Sihirbazı tamamlandığında, geçici SQL deyimleri kullanılırken tüm özelleştirmeler üzerine yazılır.

Neyse ki, saklı yordamlar kullanılarak oluşturulan TableAdapters, ad-hoc SQL deyimleriyle oluşturulan aynı briı ile karşılaşmaz. Bu nedenle, ana sorgusu saklı yordamları kullanırken JOIN kullanan bir TableAdapter oluşturmak uygulanabilir. Bu öğreticide, böyle bir TableAdapter oluşturmayı nasıl oluşturacağınız gördük. İlişkili ekleme, güncelleştirme ve silme saklı yordamlarının otomatik olarak oluşturulması için TableAdapter s ana sorgusu için JOINseyrek SELECT bir sorgu kullanarak başladık. TableAdapter 'ın ilk yapılandırması tamamlandıktan sonra, bir JOIN kullanmak ve EmployeesDataTable s sütunlarını güncelleştirmek için TableAdapter Yapılandırma Sihirbazı 'nı yeniden çalıştırdık SelectCommand saklı yordamını genişlettik.

TableAdapter Yapılandırma Sihirbazı 'nı yeniden çalıştırmak, EmployeesDataTable sütunlarını Employees_Select saklı yordamının döndürdüğü veri alanlarını yansıtacak şekilde otomatik olarak güncelleştirirler. Alternatif olarak, bu sütunları DataTable 'a el ile de ekledik. Sonraki öğreticide DataTable 'a el ile sütun ekleme hakkında araştıracağız.

Programlamanın kutlu olsun!

Yazar hakkında

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister. mitchell@4GuysFromRolla.comadresinden erişilebilir . ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.

Özel olarak teşekkürler

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi. Bu öğreticide lider gözden geçirenler, Kiton Geisenow, David suru ve TeReSaN Murphy. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .