Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
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 JOIN
s 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
, UPDATE
ve 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 ProductsTableAdapter
Northwind
, 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
, DELETE
ve 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
Ş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.
Ş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.
Ş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
ve UpdateCommand
özellikleri için DeleteCommand
değ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.
Şekil 4: InsertCommand
, UpdateCommand
ve 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, , INSERT
ve 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
, UPDATE
ve 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
, UPDATE
ve 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
, InsertCommand
veya UpdateCommand
saklı yordamları özelleştirebilir DeleteCommand
ve 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.
Ş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.
Ş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.
Ş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_Update
ve 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.
Ş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
, UpdateCommand
ve 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).
Ş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, sihirbazInsertCommand
artık birUpdateCommand
içerdiği içinDeleteCommand
,SelectCommand
veJOIN
ö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.
Ş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
.
Ş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/BLL
klasö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.
Ş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)
Ş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.
Ş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.
Ş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 önceEmployees
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.