Aracılığıyla paylaş


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

tarafından Scott Mitchell

PDF'i indirin

Bir 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ı ve 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 sağlayıcı adlarını listelemek isteyebiliriz. Tabloda Products ve CategoryID değerleri vardır, ancak gerçek kategori ve sağlayıcı adları sırasıyla SupplierID ve Categories tablolarındadır.

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 JOIN öğreticisinde bir kullandık.

TableAdapers ile s kullanmaktan JOIN kaçınma nedenimiz, 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 içeriyorsa, TableAdapter InsertCommand, UpdateCommand ve DeleteCommand özellikleri için geç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ı Karşılaştırma ve Zıtlıkları Belirleme<|vq_10273|>

DataSet'teki ilk öğreticide oluşturulan öğesinin ProductsTableAdapterNorthwind , 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. S ProductsTableAdapter 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

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

Alternatif olarak, her ürünün tedarikçisini ve kategori adını iade etmek 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 sorguda LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID , SQL Server'a her bir ürün kaydını, değeri ürün değeriyle eşleşen kategori kaydıyla CategoryID birleştirmesi CategoryID talimatı verir. Birleştirilmiş sonuç, her ürün için karşılık gelen kategori alanlarıyla (örneğin CategoryName) çalışmamıza olanak tanır.

Uyarı

JOIN s, ilişkisel veritabanlarından veri sorgularken yaygın olarak kullanılır. JOIN sözdizimine yeniyseniz veya kullanımını biraz gözden geçirmeniz gerekiyorsa, W3 Okulları'ndakiSQL Birleştirme öğreticisini öneririm. Ayrıca JOIN Temel Bilgiler ve Alt Sorgu Temelleri bölümleri de okumaya değer.

Bu yüzden JOIN ile bağıntılı alt sorgular diğer tablolardan ilgili verileri almak için kullanılabildiğinden, birçok geliştirici hangi yaklaşımı kullanacaklarını düşünüyor. Konuştuğum tüm SQL guruları kabaca aynı şeyi söyledi, SQL Server kabaca aynı 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 bağıntılı alt sorgular yerine JOIN s tercih ettiklerini hemen ifade ederler.

Yazılan Veri Kümelerini kullanarak Veri Erişim Katmanı oluştururken, araçlar alt sorgular kullanılırken daha iyi çalışır. Özellikle, ana sorgu herhangi bir INSERT s içeriyorsa TableAdapter sihirbazı karşılık gelen UPDATE, DELETEve JOIN 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ürlenmiş 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 içeren bir sorgu girilmiş 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 sorguya dayalı olarak INSERT, UPDATE ve DELETE deyimlerini otomatik olarak oluşturur. Gelişmiş düğmesine tıklarsanız bu özelliğin etkinleştirildiğini görebilirsiniz. Bu ayara rağmen, ana sorgu bir INSERT içerdiğinden TableAdapter, UPDATE, DELETE ve JOIN deyimlerini oluşturamayacaktır.

Ekle, Güncelleştir ve Sil deyimlerini 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 Girin

Sihirbazı tamamlamak için Son'a tıklayın. Bu noktada, DataSet'in Tasarımcısı, SELECT sorgusunun sütun listesinde döndürülen alanların her biri için kolona sahip bir DataTable içeren tek bir TableAdapter bulundurur. Bu, CategoryName ve SupplierName'i içerir, Şekil 3'te gösterildiği gibi.

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, , InsertCommandve UpdateCommand özellikleri için DeleteCommanddeğerlerden yoksundur. Bunu onaylamak için Tasarımcı'da TableAdapter'a tıklayın ve özellikler penceresine gidin. Burada InsertCommand, UpdateCommand ve DeleteCommand özelliklerinin (Yok) olarak ayarlandığını göreceksiniz.

InsertCommand, UpdateCommand ve DeleteCommand Özellikleri (Yok) olarak ayarlandığı

Ş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 sorunu aşmak için, InsertCommand, UpdateCommand ve DeleteCommand özellikleri için SQL deyimlerini ve parametrelerini Özellikler penceresi aracılığıyla el ile sağlayabiliriz. Alternatif olarak, TableAdapter ana sorgusunu herhangi bir s JOIN şekilde yapılandırarak başlayabiliriz. Bu, , INSERTve UPDATE deyimlerinin bizim için otomatik olarak oluşturulmasını sağlarDELETE. Sihirbazı tamamladıktan sonra, TableAdapter'ları Özellikler penceresinden SelectCommand el ile güncelleyerek JOIN söz dizimini içerecek şekilde ayarlayabiliriz.

Bu yaklaşım işe yarasa da, 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 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 kaybedileceği 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'ınız saklı yordamları kullanıyorsa, saklı yordamların değiştirileceğinden korkmadan , SelectCommand, InsertCommandveya UpdateCommand saklı yordamları özelleştirebilir DeleteCommandve TableAdapter Yapılandırma sihirbazını yeniden çalıştırabilirsiniz.

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

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

Bu öğreticide, Employees DataSet'inde NorthwindWithSprocs tablosu için bir TableAdapter ve kesin olarak yazılmış bir DataTable ekleyeceğiz. Tablo, Employees çalışan yöneticisinin ReportsTo değerini belirten bir EmployeeID alan içerir. Örneğin, Anne Dodsworth ReportTo 5 değerine sahiptir ve bu değer Steven Buchanan'ın EmployeeID değeridir. Sonuç olarak, Anne müdürü Steven'a rapor verir. Her çalışanın ReportsTo değerini raporlamanın yanı sıra, yöneticisinin adını da almak isteyebiliriz. Bu, bir JOIN kullanılarak gerçekleştirilebilir. Ancak başlangıçta TableAdapter oluşturulurken bir JOIN kullanılması, sihirbazın ilgili ekleme, güncelleştirme ve silme özelliklerini otomatik olarak oluşturmasını engeller. Bu nedenle, ilk olarak ana sorgusu s JOIN içermeyen bir TableAdapter oluşturacağız. Ardından, 2. Adımda, yöneticinin adını JOIN aracılığıyla almak için ana sorgu saklı yordamını güncelleştireceğiz.

İlk olarak NorthwindWithSprocs klasöründeki ~/App_Code/DAL DataSet'i açı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 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şturmayı hatırlamak için Typed DataSet’in TableAdapter’ları için Yeni Saklı Yordamlar Oluşturma öğreticisine göz atı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 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, UPDATE ve DELETE deyimleri içeren saklı yordamlar ve ana sorgunun yürütülmesi 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_Select, Employees_Insert, Employees_Update ve Employees_Delete adlarını kullanın.

TableAdapter Saklı Yordamlarını Adlandırın

Ş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 Fill ve GetEmployees kullanın. Ayrıca, güncelleştirmeleri doğrudan veritabanına (GenerateDBDirectMethods) göndermek için Yöntemleri oluştur onay kutusunu işaretli bıraktığınızı unutmayın.

TableAdapter Yöntemlerini

Şekil 7: TableAdapter yöntemlerini Fill adlandırın 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 bekleyin. Dört yenisini görmeniz gerekir: Employees_Select, Employees_Insert, Employees_Updateve Employees_Delete. Ardından, yeni oluşturulan EmployeesDataTable ve EmployeesTableAdapter öğelerini 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 penceresine gidin. Orada, InsertCommand, UpdateCommand ve DeleteCommand özelliklerinin ilgili saklı yordamları çağırmak için doğru şekilde yapılandırıldığını göreceksiniz.

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)

Saklı yordamları ekleme, güncelleştirme ve silme işlemleri 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 s saklı yordamını özelleştirmeye hazırız. Özellikle, Employees_Select saklı yordamını, bir JOIN kullanarak ve yönetici FirstName ile LastName değerlerini döndürecek şekilde güncelleştirmemiz 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ı İşlemi Özelleştirmek için AyarlamaJOIN

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ı işlemi, yöneticinin adını ve soyadını döndürmek için 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

Deyimi güncelleştirdikten SELECT 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ı yordam, Employees_Select ve ManagerFirstName değerlerini döndürür, ancak ManagerLastName bu sütunlardan yoksundur. Bu eksik sütunlar DataTable'a iki yoldan biriyle eklenebilir:

  • El ile - DataSet Designer'da 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ı prosedür tarafından SelectCommand döndürülen alanları yansıtacak şekilde günceller. Geçici SQL deyimlerini kullanırken, sihirbaz InsertCommand artık bir UpdateCommand içerdiği için DeleteCommand, SelectCommand ve JOIN özelliklerini de kaldırır. Ancak saklı yordamları kullanırken, bu komut özellikleri bozulmadan kalır.

Önceki öğreticilerde DataTable sütunlarını el ile eklemeyi inceledik, bunlar arasında Ana/Ayrıntı Ayrıntıları içeren Bir Madde İşaretli Ana Kayıt Listesi Kullanma ve Dosyaları Karşıya Yükleme de bulunuyor. Bu işleme daha ayrıntılı bir şekilde sonraki öğreticimizde tekrar göz atacağız. Bu öğreticide 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şlemlerinin yanı sıra dönüş değerleri ve parametreleri (varsa) için kullanılan saklı yordamları listeleyen TableAdapter Yapılandırma sihirbazını getirir. Şekil 10'da bu sihirbaz gösterilmektedir. Burada, saklı yordamın artık Employees_Select ve ManagerFirstName alanlarını döndürdüğünü görebiliyoruz.

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

Şekil 10: Sihirbaz Saklanan Prosedür için Güncellenmiş Sütun Listesini Gösteriyor (Employees_Select)

Son'a tıklayarak sihirbazı tamamlayın. DataSet Designer'a döndükten sonra, EmployeesDataTable iki ek sütun içerir: ManagerFirstName ve ManagerLastName.

EmployeesDataTable iki yeni sütun içeriyor

Şekil 11: EmployeesDataTable İki 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ı ~/App_Code/BLLklasörde yeni bir sınıf dosyası EmployeesBLLWithSprocs.vb oluşturun. Bu sınıf, mevcut EmployeesBLL sınıfının anlambilgisini taklit eder; ancak, bu yeni sınıf daha az yöntem sunar ve NorthwindWithSprocs DataSet'i yerine Northwind DataSet'ini kullanır. aşağıdaki kodu EmployeesBLLWithSprocs sınıfına ekleyin.

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class EmployeesBLLWithSprocs
    Private _employeesAdapter As EmployeesTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As EmployeesTableAdapter
        Get
            If _employeesAdapter Is Nothing Then
                _employeesAdapter = New EmployeesTableAdapter()
            End If
            Return _employeesAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetEmployees() As NorthwindWithSprocs.EmployeesDataTable
        Return Adapter.GetEmployees()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Delete, True)> _
    Public Function DeleteEmployee(ByVal employeeID As Integer) As Boolean
        Dim rowsAffected = Adapter.Delete(employeeID)
        'Return true if precisely one row was deleted, otherwise false
        Return rowsAffected = 1
    End Function
End Class

EmployeesBLLWithSprocs sınıfının Adapter özelliği, NorthwindWithSprocs DataSet örneğini EmployeesTableAdapter döndürür. Bu, s GetEmployees sınıfı ve DeleteEmployee yöntemleri tarafından kullanılır. GetEmployees yöntemi, EmployeesTableAdapter'ye karşılık gelen GetEmployees yöntemini çağırır, Employees_Select saklı yordamı çalıştırır ve sonuçlarını bir EmployeeDataTable içinde doldurur. DeleteEmployee yöntemi, benzer şekilde EmployeesTableAdapter'nin Delete yöntemini çağırır, bu da Employees_Delete saklı yordamını çalıştırır.

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. JOINs.aspx klasöründeki AdvancedDAL sayfasını açın ve Toolbox'tan bir GridView'ı Tasarımcı'ya sürükleyin, ardından ID özelliğini Employees olarak ayarlayın. Ardından, GridView'in akıllı etiketinden grid'i yeni bir ObjectDataSource denetimine bağlayın.

ObjectDataSource'u EmployeesBLLWithSprocs sınıfını kullanacak şekilde yapılandırın ve SELECT ve DELETE sekmelerindeki açılan listelerden GetEmployees ve DeleteEmployee yöntemlerinin seçildiğinden emin olun. 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'un SınıfıNı Kullanacak Şekilde Yapılandırılması EmployeesBLLWithSprocs (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 GetEmployees ve DeleteEmployee Yöntemlerini Kullanmasını 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. Title, LastName, FirstName, ManagerFirstName ve ManagerLastName dışındaki tüm BoundField'leri kaldırın ve son dört BoundField için 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. İkincisi, ObjectDataSource sihirbazı () tarafından ayarlanan değerden ObjectDataSource s OldValuesParameterFormatString özelliğini 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öneticinin adı (varsa) listelenir.

Employees_Select Saklı İşlemdeki JOIN, Yöneticinin Adını Döndürür

Şekil 14: JOIN Saklı Yordam içindeki Employees_Select, yöneticinin adını döndürüyor. (Tam boyutlu görüntüyü görmek için tıklayın)

Sil düğmesine tıklamak, sonunda Employees_Delete saklı yordaminin yürütülmesine yol açan silme iş akışını başlatır. Ancak saklı prosedürdeki denenen DELETE ifade, yabancı anahtar kısıtlama ihlali nedeniyle başarısızlıkla sonuçlanır (bkz. Şekil 15). Özellikle, her çalışanın tabloda bir veya daha fazla kaydı Orders vardır ve bu da silme işleminin başarısız olmasına neden olur.

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

Şekil 15: Karşılık Gelen Siparişlere Sahip Bir Çalışanın Silinmesi Yabancı Anahtar Kısıtlama İhlaliyle Sonuçlanmaktadı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ı yapabilir:

  • Yabancı anahtar kısıtlamasını art arda silme işlemleri için güncelleştirin,
  • Orders tablosundan silmek istediğiniz çalışanların kayıtlarını manuel olarak silin veya
  • Employees_Delete saklı yordamını, Orders kaydını silmeden önce Employees tablosundan ilişkili kayıtları silmek için güncelleştirin. Bu tekniği Typed DataSet'in TableAdapters'ı için Mevcut Saklı Yordamları Kullanma öğreticisinde 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 ilgili tablolardan verilere erişmek için iki farklı teknik sağlar. Önceki öğreticilerde, TableAdapter, INSERT ile ilgili sorgular için UPDATE, DELETE ve JOIN deyimlerini otomatik olarak oluşturamadığı için en yaygın olarak bağıntılı alt sorgulardan yararlandık. Bu değerler elle girilebilse de, geçici SQL deyimleri kullanılırken TableAdapter Yapılandırma sihirbazı tamamlandığında tüm özelleştirmelerin üzerine yazılır.

Neyse ki, saklanmış yordamlar kullanılarak oluşturulan TableAdapter'lar, özel SQL ifadeleriyle oluşturulanlar kadar hassas değillerdir. Bu nedenle, saklı yordamlar kullanılırken ana sorgusunda bir JOIN kullanan bir TableAdapter oluşturmak mümkündür. Bu öğreticide böyle bir TableAdapter'ın nasıl oluşturulacağını gördük. Başlangıçta ilgili ekleme, güncelleştirme ve silme saklı yordamlarının otomatik olarak oluşturulabilmesi için TableAdapter'ın ana sorgusunda JOIN olmayan bir SELECT sorgusu kullandık. TableAdapter'ın ilk yapılandırması tamamlandıktan sonra, SelectCommand saklı yordamını bir JOIN kullanacak şekilde genişlettik ve EmployeesDataTable sütunlarını güncellemek için TableAdapter Yapılandırma sihirbazını yeniden çalıştırdık.

TableAdapter Yapılandırma sihirbazını yeniden çalıştırmak, EmployeesDataTable sütunlarını, saklı yordam tarafından döndürülen Employees_Select veri alanlarını yansıtacak şekilde otomatik olarak güncelleştirdi. 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ışı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 eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin önde gelen gözden geçirenleri Hilton Geisenow, David Suru ve Teresa Murphy'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.