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

tarafından Scott Mitchell

PDF’yi İndir

Veritabanıyla çalışırken, birden çok tabloya yayılmış verileri istemek yaygın bir durumdur. İki farklı tablodan veri almak için bağıntılı alt sorgu veya JOIN işlemi kullanabiliriz. Bu öğreticide, ana sorgusunda JOIN içeren bir TableAdapter'ın nasıl oluşturulacağını gözden geçirmeden önce bağıntılı alt sorgular ile JOIN söz dizimini karşılaştıracağız.

Giriş

İlişkisel veritabanlarında çalışmak istediğimiz veriler genellikle birden çok tabloya yayılır. Örneğin, ürün bilgilerini görüntülerken her ürünün ilgili kategorisini ve tedarikçi adlarını listelemek isteyebiliriz. Tabloda Products ve değerleri vardırCategoryID, ancak gerçek kategori ve sağlayıcı adları sırasıyla ve Suppliers tablolarındadır CategoriesSupplierID.

Başka bir ilişkili tablodan bilgi almak için bağıntılı alt sorgular veya JOINs kullanabiliriz. Bağıntılı alt sorgu, dış sorgudaki sütunlara başvuran iç içe SELECT geçmiş bir sorgudur. Örneğin, Veri Erişim Katmanı Oluşturma öğreticisinde, her ürünün kategorisini ve sağlayıcı adlarını döndürmek için s ana sorgusunda ProductsTableAdapter iki bağıntılı alt sorgu kullandık. A JOIN , iki farklı tablodan ilişkili satırları birleştirilen bir SQL yapısıdır. Her ürünle birlikte kategori bilgilerini görüntülemek için SqlDataSource Denetimi ile Verileri Sorgulama öğreticisinde bir JOIN kullandık.

TableAdapter'larla s kullanmaktan JOIN kaçınmamızın nedeni, TableAdapter sihirbazında karşılık gelen INSERT, UPDATEve DELETE deyimlerini otomatik olarak oluşturma sınırlamalarıdır. Daha açık belirtmek gerekirse, TableAdapter ana sorgusu herhangi bir JOIN s içeriyorsa, TableAdapter , UpdateCommandve DeleteCommand özellikleri için InsertCommandgeçici SQL deyimlerini veya saklı yordamları otomatik olarak oluşturamaz.

Bu öğreticide, ana sorgusunda s içeren JOIN bir TableAdapter'ın nasıl oluşturulacağını keşfetmeden önce bağıntılı alt sorguları ve JOIN sorgularını kısaca karşılaştıracağız.

Bağıntılı Alt Sorgular veJOIN S'leri Karşılaştırma

DataSet'teki ilk öğreticide Northwind oluşturulan öğesininProductsTableAdapter, her ürünün ilgili kategorisini ve sağlayıcı adını geri getirmek için bağıntılı alt sorgular kullandığını hatırlayın. Ana ProductsTableAdapter sorgu 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

İlişkili iki alt sorgu - (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID) ve - dış SELECT deyiminin sütun listesinde ek bir sütun olarak ürün başına tek bir değer döndüren sorgulardır SELECT(SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) .

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

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

bir JOIN tablodaki kayıtları bazı ölçütlere göre başka bir tablodaki kayıtlarla birleştirir. Örneğin, yukarıdaki sorgudaLEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID, SQL Server her bir ürün kaydını, değeri ürün değeriyle eşleşen kategori kaydıyla CategoryID birleştirmesini bildirmektedirCategoryID. Birleştirilmiş sonuç, her ürün için karşılık gelen kategori alanlarıyla çalışmamıza olanak tanır (örneğin CategoryName).

Not

JOIN s genellikle ilişkisel veritabanlarından veri sorgularken kullanılır. Söz dizimini JOIN yeni kullanıyorsanız veya kullanımıyla ilgili biraz daha bilgi sahibi olmanız gerekiyorsa W3 Schools'taSQL'e Katılma öğreticisini öneririz. Ayrıca SQL Books Online'ınJOIN Temel bilgiler ve Alt Sorgu Temelleri bölümleri de okumaya değer.

S ve bağıntılı alt sorgular diğer tablolardan ilgili verileri almak için kullanılabildiğinden JOIN , birçok geliştirici kafalarını kazıyarak ve hangi yaklaşımı kullanacaklarını merak ediyor. Konuştuğum tüm SQL guruları kabaca aynı şeyi söyledi, SQL Server kabaca özdeş yürütme planları üreteceği için performans açısından önemli değil. Onların tavsiyesi, sizin ve ekibinizin en rahat olduğu tekniği kullanmaktır. Bu tavsiyeyi verdikten sonra bu uzmanların bağıntılı JOIN alt sorgular üzerinde tercihlerini hemen ifade ettiklerine dikkat çekmektedir.

Türemiş Veri Kümeleri kullanarak Veri Erişim Katmanı oluştururken, araçlar alt sorgular kullanılırken daha iyi çalışır. Özellikle, ana sorgu herhangi bir JOIN s içeriyorsa TableAdapter sihirbazı 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 eksiği keşfetmek için klasörde geçici bir Türe Bağlı Veri Kümesi ~/App_Code/DAL 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

JOIN'leri içeren bir sorgunun girilmiş olduğu TableAdaptor Yapılandırma Sihirbazı penceresini gösteren ekran görüntüsü.

Şekil 1: İçeren JOIN Bir Ana Sorgu Girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Varsayılan olarak, TableAdapter ana sorguyu temel alan , UPDATEve DELETE deyimlerini otomatik olarak oluştururINSERT. 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 , UPDATEve DELETE deyimlerini oluşturamayacaktırINSERT.

Ekle, Güncelleştir ve Sil deyimleri oluştur onay kutusunun seçili olduğu Gelişmiş Seçenekler penceresini gösteren ekran görüntüsü.

Şekil 2: İçeren JOIN Bir Ana Sorgu Girme

Sihirbazı tamamlamak için Son’a tıklayın. Bu noktada DataSet'inizin Tasarım Aracı, sorgunun sütun listesinde döndürülen SELECT alanların her biri için sütun içeren datatable içeren tek bir TableAdapter içerir. Şekil 3'te CategoryName gösterildiği gibi ve SupplierNamede buna dahildir.

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, , UpdateCommandve DeleteCommand özellikleri için InsertCommanddeğerlerden yoksundur. Bunu onaylamak için, Tasarım Aracı TableAdapter'a tıklayın ve Özellikler penceresi gidin. Burada , ve UpdateCommandDeleteCommand özelliklerinin (Yok) olarak ayarlandığını InsertCommandgöreceksiniz.

InsertCommand, UpdateCommand ve DeleteCommand Özellikleri (Yok) olarak ayarlanır

Şekil 4: InsertCommand, UpdateCommandve DeleteCommand Özellikleri (Yok) olarak ayarlanmıştır (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu sorunu geçici olarak çözmek için, Özellikler penceresi aracılığıyla , UpdateCommandve özellikleri için InsertCommandSQL deyimlerini ve DeleteCommand parametrelerini el ile sağlayabiliriz. Alternatif olarak, TableAdapter ana sorgusunu s JOINiçermemesi için yapılandırarak başlayabiliriz. Bu, , UPDATEve DELETE deyimlerinin bizim için otomatik olarak oluşturulmasını sağlarINSERT. Sihirbazı tamamladıktan sonra, söz dizimini içermesi JOIN için tableadapter'ları SelectCommand Özellikler penceresi el ile güncelleştirebiliriz.

TableAdapter ana sorgusu sihirbaz aracılığıyla yeniden yapılandırıldığında otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimleri yeniden oluşturulduğundan, bu yaklaşım çalışırken geçici SQL sorguları kullanılırken çok kırılgandır. Bu, TableAdapter'a sağ tıklar, bağlam menüsünden Yapılandır'ı seçer ve sihirbazı yeniden tamamlarsak daha sonra yaptığımız tüm özelleştirmelerin kaybolacağı anlamına gelir.

TableAdapter'ın otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerinin kırılganlığı neyse ki geçici SQL deyimleriyle sınırlıdır. TableAdapter saklı yordamları kullanıyorsa , InsertCommand, UpdateCommandveya DeleteCommand saklı yordamları özelleştirebilir SelectCommandve saklı yordamların değiştirileceğinden korkmadan TableAdapter Yapılandırma sihirbazını yeniden çalıştırabilirsiniz.

Sonraki birkaç adımda, başlangıçta ilgili ekleme, güncelleştirme ve silme saklı yordamlarının otomatik olarak oluşturulması için herhangi JOIN bir s'yi atlayan bir ana sorgu kullanan bir TableAdapter oluşturacağız. Ardından, SelectCommand ilgili tablolardan ek sütunlar döndüren bir JOIN kullanacak şekilde öğesini güncelleştireceğiz. Son olarak, karşılık gelen bir İş Mantığı Katmanı sınıfı oluşturacak ve ASP.NET bir web sayfasında TableAdapter'ı kullanarak göstereceğiz.

1. Adım: Basitleştirilmiş Ana Sorgu Kullanarak TableAdapter Oluşturma

Bu öğretici için, DataSet'teki NorthwindWithSprocs tablo için Employees tableAdapter ve kesin olarak yazılmış bir DataTable ekleyeceğiz. Tablo, Employees çalışan yöneticisinin değerini belirten EmployeeID bir ReportsTo alan içerir. Örneğin, Çalışan Anne Dodsworth'un değeri 5'tir ReportTo ve bu değer Steven Buchanan'ın değeridir EmployeeID . Sonuç olarak Anne, menajeri Steven'a rapor verdi. Her çalışanın ReportsTo değerini raporlamanın yanı sıra yöneticisinin adını da almak isteyebiliriz. Bu, kullanılarak JOINgerçekleştirilebilir. Ancak TableAdapter'ı ilk oluştururken bir JOIN kullanılması, sihirbazın ilgili ekleme, güncelleştirme ve silme özelliklerini otomatik olarak oluşturmasını engeller. Bu nedenle, başlangıç olarak ana sorgusu s JOIN içermeyen bir TableAdapter oluşturacağız. Ardından, 2. Adımda ana sorgu saklı yordamını bir aracılığıyla yöneticinin adını alacak şekilde JOINgüncelleştireceğiz.

İlk olarak klasöründeki NorthwindWithSprocs DataSet'i ~/App_Code/DAL açın. Tasarım Aracı sağ tıklayın, bağlam menüsünden Ekle seçeneğini belirleyin ve TableAdapter menü öğesini seçin. Bu işlem TableAdapter Yapılandırma sihirbazını başlatır. Şekil 5'de gösterildiği gibi, sihirbazın yeni saklı yordamlar oluşturmasını sağlayın ve İleri'ye tıklayın. TableAdapter sihirbazından yeni saklı yordamlar oluşturma konusunda bilgi edinmek için, Yazılan DataSet'in TableAdapers öğreticisi için Yeni Saklı Yordamlar Oluşturma öğreticisine başvurun.

Yeni saklı yordamlar oluştur Seçeneğini belirleyin

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

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

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

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

Aşağıdaki adım TableAdapter saklı yordamlarını adlandırmamıza olanak tanır. Şekil 6'da gösterildiği gibi , Employees_InsertEmployees_Update, ve Employees_Deleteadlarını Employees_Selectkullanın.

TableAdapter Saklı Yordamlarını Adlandırma

Şekil 6: TableAdapter 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 yöntemlerini adlandırmamızı ister. Yöntem adları olarak ve GetEmployees kullanınFill. Ayrıca, güncelleştirmeleri doğrudan veritabanına göndermek için Yöntemleri oluştur (GenerateDBDirectMethods) onay kutusunu işaretli bıraktığından emin olun.

TableAdapter Yöntemlerini Fill ve GetEmployees olarak adlandırın

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

Sihirbazı tamamladıktan sonra veritabanındaki saklı yordamları incelemek için biraz zaman ayırın. Dört yenisini görmeniz gerekir: Employees_Select, Employees_Insert, Employees_Updateve Employees_Delete. Ardından, yeni oluşturulan ve EmployeesTableAdapter öğesini EmployeesDataTable 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 Özellikler penceresi gidin. Burada , UpdateCommandve DeleteCommand özelliklerinin ilgili saklı yordamları çağırmak için doğru yapılandırıldığını göreceksinizInsertCommand.

TableAdapter Ekleme, Güncelleştirme ve Silme Özelliklerini Içerir

Şekil 8: TableAdapter Ekleme, Güncelleştirme ve Silme Ö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şturulduktan ve InsertCommand, UpdateCommandve DeleteCommand özellikleri doğru yapılandırıldığında, her çalışanın SelectCommand yöneticisi hakkında ek bilgi döndürmek için saklı yordamı özelleştirmeye hazırız. Özellikle, saklı yordamı bir JOIN kullanacak ve yöneticinin ve LastNameFirstName değerlerini döndürecek şekilde güncelleştirmemiz Employees_Select gerekir. Saklı yordam güncelleştirildikten sonra DataTable'ı bu ek sütunları içerecek şekilde güncelleştirmemiz gerekir. Bu iki görevi 2. ve 3. Adımlarda ele alacağız.

2. Adım: Saklı Yordamı Bir İçerecek Şekilde ÖzelleştirmeJOIN

Başlangıç olarak Sunucu Gezgini'ne gidin, Northwind veritabanının Saklı Yordamlar klasöründe detaya gidin ve saklı yordamı açın Employees_Select . 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 LEFT JOIN adını ve soyadını döndürecek ş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

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

Saklı Yordam Sonuçları Çıkış Penceresinde Görüntülenir

Şekil 9: Saklı Yordam Sonuçları Çıkış Penceresinde Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: DataTable Sütunlarını Güncelleştirme

Bu noktada saklı Employees_Select yordam ve ManagerLastName değerlerini döndürürManagerFirstName, ancak EmployeesDataTable bu sütunlar eksiktir. Bu eksik sütunlar DataTable'a iki yoldan biriyle eklenebilir:

  • El ile - DataSet Tasarım Aracı DataTable'a sağ tıklayın ve Ekle menüsünden Sütun'u seçin. Ardından sütunu adlandırabilir ve özelliklerini buna göre ayarlayabilirsiniz.
  • Otomatik olarak - TableAdapter Yapılandırma sihirbazı, DataTable sütunlarını saklı yordam tarafından SelectCommand döndürülen alanları yansıtacak şekilde güncelleştirir. Geçici SQL deyimlerini kullanırken, sihirbaz artık bir içerdiğinden SelectCommand , UpdateCommandve DeleteCommand özelliklerini de kaldırırInsertCommand.JOIN Ancak saklı yordamları kullanırken, bu komut özellikleri değişmeden kalır.

Önceki öğreticilerde Details DataList ile Ana/Ayrıntı Madde İşaretli Ana Kayıt Listesi Kullanma ve Dosyaları Karşıya Yükleme dahil olmak üzere DataTable sütunlarını el ile eklemeyi inceledik ve sonraki öğreticimizde bu işleme daha ayrıntılı bir şekilde göz atacağız. Ancak bu öğretici için TableAdapter Yapılandırma sihirbazı aracılığıyla otomatik yaklaşımı kullanalım.

öğesine sağ tıklayıp EmployeesTableAdapter 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ın yanı sıra döndürülen değerleri ve parametreleri (varsa) listeleyen TableAdapter Yapılandırma sihirbazını getirir. Şekil 10'da bu sihirbaz gösterilmektedir. Burada saklı yordamın Employees_Select artık ve ManagerLastName alanlarını döndürdüğünü ManagerFirstName görebiliriz.

Sihirbaz, Employees_Select Saklı Yordamı için Güncelleştirilmiş Sütun Listesini Gösterir

Şekil 10: Sihirbaz Saklı Yordam için Employees_Select 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ı tamamlayın. DataSet Tasarım Aracı döndükten sonra iki EmployeesDataTable ek sütun içerir: ManagerFirstName ve ManagerLastName.

EmployeesDataTable iki yeni sütun içeriyor

Şekil 11: İki EmployeesDataTable Yeni Sütun İçerir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Güncelleştirilmiş Employees_Select saklı yordamın etkin olduğunu ve TableAdapter'ın ekleme, güncelleştirme ve silme özelliklerinin hala işlevsel olduğunu göstermek için, kullanıcıların çalışanları görüntülemesine ve silmesine olanak tanıyan bir web sayfası oluşturalım. Ancak böyle bir sayfa oluşturmadan önce DataSet'teki NorthwindWithSprocs çalışanlarla çalışmak için İş Mantığı Katmanı'nda yeni bir sınıf oluşturmamı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: İş Mantığı Katmanını Uygulama

adlı EmployeesBLLWithSprocs.csklasörde yeni bir sınıf dosyası ~/App_Code/BLL oluşturun. Bu sınıf mevcut EmployeesBLL sınıfın semantiğini taklit eder, yalnızca bu yeni sınıf daha az yöntem sağlar ve DataSet'i (DataSet yerine) Northwind kullanırNorthwindWithSprocs. 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 sınıfı özelliği DataSet s AdapterEmployeesTableAdapteröğesinin NorthwindWithSprocs bir örneğini döndürür. Bu, sınıfı GetEmployees ve DeleteEmployee yöntemleri tarafından kullanılır. GetEmployees yöntemi, saklı yordamı çağıran Employees_Select ve sonuçlarını bir EmployeeDataTableile dolduran ilgili GetEmployees yöntemini çağırırEmployeesTableAdapter. DeleteEmployee yöntemi benzer şekilde saklı yordamı çağıran s Delete yöntemini çağırır EmployeesTableAdapterEmployees_Delete.

5. Adım: Sunu Katmanındaki Verilerle Çalışma

EmployeesBLLWithSprocs Sınıf tamamlandıktan sonra, bir ASP.NET sayfası aracılığıyla çalışan verileriyle çalışmaya hazırız. klasöründeki sayfayı JOINs.aspxAdvancedDAL açın ve Toolbox'tan bir GridView'u Tasarım Aracı sürükleyerek özelliğini olarak EmployeesayarlayınID. Ardından GridView'un akıllı etiketinden kılavuzu adlı EmployeesDataSourceyeni bir ObjectDataSource denetimine bağlayın.

ObjectDataSource'u sınıfını EmployeesBLLWithSprocs kullanacak şekilde yapılandırın ve SELECT ve DELETE sekmelerinden açılan listelerden ve DeleteEmployee yöntemlerinin seçildiğinden emin olunGetEmployees. ObjectDataSource yapılandırmasını tamamlamak için Son'a tıklayın.

ObjectDataSource'ı EmployeesBLLWithSprocs Sınıfını Kullanacak Şekilde Yapılandırma

Şekil 12: ObjectDataSource'ı Sınıfı Kullanacak EmployeesBLLWithSprocs Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource'un GetEmployees ve DeleteEmployee Yöntemlerini Kullanmasını Sağlar

Şekil 13: ObjectDataSource'un ve DeleteEmployee Yöntemlerini Kullanmasını GetEmployees Sağlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Visual Studio, s sütunlarının her biri EmployeesDataTable için GridView'a bir BoundField ekler. , , FirstNameLastName, ManagerFirstNameve dışındaki Titletüm bu BoundField'leri kaldırın ve ManagerLastName son dört BoundField öğesinin HeaderText özelliklerini sırasıyla Soyadı, 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 yapmamız gerekir. İlk olarak GridView'a akıllı etiketinden Silmeyi Etkinleştir seçeneğini işaretleyerek silme özellikleri sağlamasını bildirin. İkinci olarak, ObjectDataSource sihirbazı () tarafından ayarlanan değerden ObjectDataSource özelliğini OldValuesParameterFormatString varsayılan değerine (original_{0}{0} ) değiştirin. Bu değişiklikleri yaptıktan sonra GridView ve ObjectDataSource bildirim temelli işaretlemeniz 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>

Tarayıcı üzerinden ziyaret ederek sayfayı test edin. Şekil 14'te gösterildiği gibi sayfada her çalışan ve yöneticisinin adı (varsa) listelenir.

Employees_Select Saklı Yordamındaki JOIN, YöneticiNin Adını Döndürür

Şekil 14: JOIN Saklı Yordamdaki Employees_Select , YöneticiNin Adını Döndürür (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sil düğmesine tıklandığında, saklı yordamın yürütülmesinde Employees_Delete doruğa çıkan silme iş akışı başlatılır. Ancak, saklı yordamdaki denenen DELETE deyim yabancı anahtar kısıtlama ihlali nedeniyle başarısız oluyor (bkz. Şekil 15). Özellikle, her çalışanın tabloda bir veya daha fazla kaydı Orders olduğundan silme işlemi başarısız olur.

Karşılık Gelen Siparişlere Sahip Bir Çalışanın Silinmesi Yabancı Anahtar Kısıtlama İhlaline Neden Olur

Şekil 15: İlgili Siparişlere Sahip Bir Çalışanı Silme Yabancı Anahtar Kısıtlama İhlaliyle Sonuçlanır (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ı kullanabilirsiniz:

  • Silmeleri art arda eklemek için yabancı anahtar kısıtlamasını güncelleştirin,
  • Silmek istediğiniz çalışanlar için kayıtları Orders tablodan el ile silin veya
  • Employees_Delete Kaydı silmeden önce ilişkili kayıtları tablodan Orders silmek için saklı yordamı güncelleştirinEmployees. Typed DataSet'in TableAdapters öğreticisi için Mevcut Saklı Yordamları Kullanma öğreticisinde bu tekniği ele aldık.

Bunu okuyucuya alıştırma olarak bırakıyorum.

Özet

İlişkisel veritabanlarıyla çalışırken, sorguların verilerini birden çok ilişkili tablodan çekmesi yaygın bir durumdur. Bağıntılı alt sorgular ve JOIN s sorgudaki ilişkili tablolardaki verilere erişmek için iki farklı teknik sağlar. TableAdapter, ile ilgili JOIN sorgular için , UPDATEve DELETE deyimlerini otomatik olarak oluşturamadığındanINSERT, önceki öğreticilerde en yaygın olarak bağıntılı alt sorgulardan yararlandık. Bu değerler el ile sağlansa da, geçici SQL deyimleri kullanılırken TableAdapter Yapılandırma sihirbazı tamamlandığında tüm özelleştirmelerin üzerine yazılır.

Neyse ki saklı yordamlar kullanılarak oluşturulan TableAdapers, geçici SQL deyimleri kullanılarak oluşturulanlarla aynı kırılganlıktan muzdarip değildir. Bu nedenle, saklı yordamları kullanırken ana sorgusu bir kullanan bir JOIN TableAdapter oluşturmak mümkündür. Bu öğreticide böyle bir TableAdapter'ın nasıl oluşturulacağını gördük. Karşılık gelen ekleme, güncelleştirme ve silme saklı yordamlarının otomatik olarak oluşturulması için TableAdapter ana sorgusu için -less SELECT sorgusu kullanarak JOINbaşladık. TableAdapter'ın ilk yapılandırması tamamlandıktan sonra saklı yordamı bir JOIN kullanacak şekilde artırdık SelectCommand ve tablo sütunlarını güncelleştirmek için TableAdapter Yapılandırma sihirbazını EmployeesDataTable yeniden çalıştırdık.

TableAdapter Yapılandırma sihirbazını yeniden çalıştırmak, sütunları saklı yordam tarafından Employees_Select döndürülen veri alanlarını yansıtacak şekilde otomatik olarak güncelleştirdiEmployeesDataTable. Alternatif olarak, bu sütunları DataTable'a el ile de eklemiş olabilirdik. Sonraki öğreticide DataTable'a el ile sütun eklemeyi keşfedeceğiz.

Mutlu Programlama!

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Hilton Geisenow, David Suru ve Teresa Murphy'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.