TableAdapter’ı JOIN Kullanacak Biçimde Güncelleştirme (VB)
tarafından Scott Mitchell
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 Categories
SupplierID
.
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 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
, UPDATE
ve 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 , UpdateCommand
ve DeleteCommand
özellikleri için InsertCommand
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 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
, UPDATE
ve 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
Ş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 , UPDATE
ve 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 JOIN
içerdiğinden TableAdapter , UPDATE
ve DELETE
deyimlerini oluşturamayacaktırINSERT
.
Ş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 SupplierName
de buna dahildir.
Ş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, , UpdateCommand
ve DeleteCommand
özellikleri için InsertCommand
değerlerden yoksundur. Bunu onaylamak için, Tasarım Aracı TableAdapter'a tıklayın ve Özellikler penceresi gidin. Burada , ve UpdateCommand
DeleteCommand
özelliklerinin (Yok) olarak ayarlandığını InsertCommand
göreceksiniz.
Şekil 4: InsertCommand
, UpdateCommand
ve 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 , UpdateCommand
ve özellikleri için InsertCommand
SQL deyimlerini ve DeleteCommand
parametrelerini el ile sağlayabiliriz. Alternatif olarak, TableAdapter ana sorgusunu s JOIN
içermemesi için yapılandırarak başlayabiliriz. Bu, , UPDATE
ve 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
, UPDATE
ve 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
, UPDATE
ve DELETE
deyimlerinin kırılganlığı neyse ki geçici SQL deyimleriyle sınırlıdır. TableAdapter saklı yordamları kullanıyorsa , InsertCommand
, UpdateCommand
veya DeleteCommand
saklı yordamları özelleştirebilir SelectCommand
ve 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 JOIN
gerç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 JOIN
gü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.
Ş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
, UPDATE
ve 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_Insert
Employees_Update
, ve Employees_Delete
adlarını Employees_Select
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 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.
Ş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_Update
ve 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 , UpdateCommand
ve DeleteCommand
özelliklerinin ilgili saklı yordamları çağırmak için doğru yapılandırıldığını göreceksinizInsertCommand
.
Ş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
, 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 saklı yordamı özelleştirmeye hazırız. Özellikle, saklı yordamı bir JOIN
kullanacak ve yöneticinin ve LastName
FirstName
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).
Ş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ğindenSelectCommand
,UpdateCommand
veDeleteCommand
ö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.
Ş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
.
Ş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.vb
klasö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.
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 sınıfı özelliği DataSet s Adapter
EmployeesTableAdapter
öğ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 EmployeeDataTable
ile dolduran ilgili GetEmployees
yöntemini çağırırEmployeesTableAdapter
. DeleteEmployee
yöntemi benzer şekilde saklı yordamı çağıran s Delete
yöntemini çağırır EmployeesTableAdapter
Employees_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.aspx
AdvancedDAL
açın ve Toolbox'tan bir GridView'u Tasarım Aracı sürükleyerek özelliğini olarak Employees
ayarlayınID
. Ardından GridView'un akıllı etiketinden kılavuzu adlı EmployeesDataSource
yeni 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.
Ş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)
Ş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. , , FirstName
LastName
, ManagerFirstName
ve dışındaki Title
tü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.
Ş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.
Ş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ı tablodanOrders
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 , UPDATE
ve 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 JOIN
baş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 Hours 2.0'dır. 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 adresinden bir satır mitchell@4GuysFromRolla.combırakın.