Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
Saat bekerja dengan database, adalah umum untuk meminta data yang tersebar di beberapa tabel. Untuk mengambil data dari dua tabel berbeda, kita dapat menggunakan subkueri yang berkorelasi atau operasi JOIN. Dalam tutorial ini kita membandingkan subkueri berkorelasi dan sintaks JOIN sebelum melihat cara membuat TableAdapter yang menyertakan JOIN dalam kueri utamanya.
Pendahuluan
Dengan database relasional, data yang ingin kami gunakan sering kali tersebar di beberapa tabel. Misalnya, saat menampilkan informasi produk, kami mungkin ingin mencantumkan setiap kategori produk dan nama pemasok yang sesuai. Tabel Products
memiliki CategoryID
nilai dan SupplierID
, tetapi kategori aktual dan nama pemasok masing-masing berada dalam Categories
tabel dan Suppliers
.
Untuk mengambil informasi dari tabel terkait lainnya, kita dapat menggunakan subkueri atau subkueri yang berkorelasi.JOIN
Subkueri berkorelasi adalah kueri bersarang yang mereferensikan kolom SELECT
dalam kueri luar. Misalnya, dalam tutorial Membuat Lapisan Akses Data , kami menggunakan dua subkueri yang berkorelasi dalam ProductsTableAdapter
kueri utama untuk mengembalikan kategori dan nama pemasok untuk setiap produk.
JOIN
adalah sebuah konstruksi SQL yang menggabungkan baris terkait dari dua tabel yang berbeda. Kami menggunakan JOIN
dalam tutorial Mengkueri Data dengan Kontrol SqlDataSource untuk menampilkan informasi kategori bersama setiap produk.
Alasan kita tidak menggunakan JOIN
dengan TableAdapters adalah karena keterbatasan dalam wizard TableAdapter untuk menghasilkan pernyataan INSERT
, UPDATE
, dan DELETE
yang sesuai secara otomatis. Lebih khusus lagi, jika kueri utama dari TableAdapter mengandung elemen JOIN
, maka TableAdapter tidak dapat secara otomatis membuat pernyataan SQL ad-hoc atau prosedur tersimpan untuk properti InsertCommand
, UpdateCommand
, dan DeleteCommand
.
Dalam tutorial ini, kita akan secara singkat membandingkan dan membedakan subkueri berkorelasi dan JOIN
sebelum mengeksplorasi cara membuat TableAdapter yang mencakup JOIN
dalam kueri utamanya.
Membandingkan dan Mengkontraskan Subkueri berkorelasi danJOIN
s
Ingatlah bahwa ProductsTableAdapter
yang dibuat dalam tutorial pertama di Set Data Northwind
menggunakan subkueri berkorelasi untuk mendapatkan kembali kategori produk dan nama pemasok yang sesuai. Kueri ProductsTableAdapter
utama diperlihatkan di bawah ini.
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
Dua subkueri yang berkorelasi - (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID)
dan (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID)
- adalah SELECT
kueri yang mengembalikan satu nilai per produk sebagai kolom tambahan dalam daftar kolom pernyataan luar SELECT
.
Atau, JOIN
dapat digunakan untuk mengembalikan setiap pemasok produk dan nama kategori. Kueri berikut mengembalikan output yang sama dengan yang di atas, tetapi menggunakan JOIN
s sebagai pengganti subkueri:
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
menggabungkan rekaman dari satu tabel dengan rekaman dari tabel lain berdasarkan beberapa kriteria. Dalam kueri di atas, misalnya, LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID
menginstruksikan SQL Server untuk menggabungkan setiap rekaman produk dengan catatan kategori yang nilainya CategoryID
cocok dengan nilai produk.CategoryID
Hasil gabungan memungkinkan kita untuk bekerja dengan bidang kategori yang sesuai untuk setiap produk (seperti CategoryName
).
Nota
JOIN
s umumnya digunakan saat mengkueri data dari database relasional. Jika Anda baru menggunakan JOIN
sintaksis atau perlu menyikat sedikit pada penggunaannya, saya akan merekomendasikan tutorial SQL Join di W3 Schools. Juga layak dibaca adalah bagian JOIN
Dasar-Dasar dan Dasar-Dasar Subkueri dari SQL Books Online.
Karena JOIN
dan subkueri yang berkorelasi dapat digunakan untuk mengambil data terkait dari tabel lain, banyak pengembang merasa bingung dan bertanya-tanya pendekatan mana yang akan digunakan. Semua guru SQL yang telah saya ajak bicara mengatakan hal yang kira-kira sama, bahwa itu tidak terlalu penting karena SQL Server akan menghasilkan rencana eksekusi yang kira-kira identik. Saran mereka, maka, adalah menggunakan teknik yang paling nyaman bagi Anda dan tim Anda. Perlu dicatat bahwa setelah memberikan saran ini, para ahli segera menyatakan preferensi mereka atas JOIN
dibandingkan subkueri yang berkorelasi.
Saat membangun Lapisan Akses Data menggunakan DataSet Tipe, alat bekerja lebih optimal ketika menggunakan subkueri-subkueri. Secara khusus, wizard TableAdapter tidak akan secara otomatis menghasilkan pernyataan INSERT
, UPDATE
, dan DELETE
yang sesuai jika kueri utama berisi pernyataan JOIN
apa pun, tetapi akan menghasilkan pernyataan ini secara otomatis ketika subkueri yang berkorelasi digunakan.
Untuk menjelajahi kekurangan ini, buat Himpunan Data Berjenis sementara di ~/App_Code/DAL
folder . Selama wizard Konfigurasi TableAdapter, pilih opsi menggunakan pernyataan SQL ad-hoc dan masukkan kueri berikut SELECT
(lihat Gambar 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
Gambar 1: Masukkan Kueri Utama yang Berisi JOIN
(Klik untuk menampilkan gambar ukuran penuh)
Secara default, TableAdapter akan secara otomatis membuat INSERT
pernyataan , UPDATE
, dan DELETE
berdasarkan kueri utama. Jika Anda mengklik tombol Tingkat Lanjut, Anda dapat melihat bahwa fitur ini diaktifkan. Terlepas dari pengaturan ini, TableAdapter tidak akan dapat membuat INSERT
, UPDATE
, dan DELETE
karena kueri utama berisi JOIN
.
Gambar 2: Masukkan Kueri Utama yang Berisi JOIN
Klik Selesai untuk menyelesaikan wizard. Pada titik ini, Desainer DataSet Anda akan menyertakan satu TableAdapter dengan DataTable yang memiliki kolom untuk setiap bidang yang dikembalikan dalam daftar kolom kueri SELECT
. Ini termasuk CategoryName
dan SupplierName
, seperti yang ditunjukkan oleh Gambar 3.
Gambar 3: DataTable Menyertakan Kolom untuk Setiap Bidang yang Dikembalikan dalam Daftar Kolom
Meskipun DataTable memiliki kolom yang sesuai, TableAdapter tidak memiliki nilai untuk properti InsertCommand
, UpdateCommand
, dan DeleteCommand
. Untuk mengonfirmasi hal ini, klik TableAdapter di Perancang lalu buka jendela Properti. Di sana Anda akan melihat bahwa InsertCommand
, UpdateCommand
, dan DeleteCommand
diatur ke (Tidak Ada).
Gambar 4: Properti InsertCommand
, UpdateCommand
, dan DeleteCommand
Diatur ke (Tidak Ada) (Klik untuk melihat gambar ukuran penuh)
Untuk mengatasi kekurangan ini, kita dapat secara manual memberikan pernyataan dan parameter SQL untuk InsertCommand
properti , , UpdateCommand
dan DeleteCommand
melalui jendela Properti. Atau, kita dapat mulai dengan mengonfigurasi kueri utama TableAdapter untuk tidak menyertakan elemen JOIN
. Ini akan memungkinkan INSERT
, UPDATE
, dan DELETE
pernyataan untuk dibuat secara otomatis bagi kami. Setelah menyelesaikan wizard, kita kemudian dapat memperbarui TableAdapter s SelectCommand
secara manual dari jendela Properti sehingga menyertakan JOIN
sintaks.
Meskipun pendekatan ini berfungsi, pendekatan ini sangat rapuh saat menggunakan kueri SQL ad-hoc karena setiap kali kueri utama TableAdapter dikonfigurasi ulang melalui wizard, pernyataan INSERT
, UPDATE
, dan DELETE
yang dihasilkan secara otomatis akan dibuat ulang. Itu berarti semua penyesuaian yang kemudian kita buat akan hilang jika kita mengklik kanan tableAdapter, memilih Konfigurasikan dari menu konteks, dan menyelesaikan wizard lagi.
Rapuhnya pernyataan yang dihasilkan secara otomatis INSERT
, UPDATE
dan DELETE
oleh TableAdapter, untungnya, terbatas pada pernyataan SQL ad-hoc. Jika TableAdapter Anda menggunakan prosedur tersimpan, Anda dapat menyesuaikan prosedur tersimpan SelectCommand
, InsertCommand
, UpdateCommand
, atau DeleteCommand
dan menjalankan ulang wizard Konfigurasi TableAdapter tanpa khawatir bahwa prosedur tersimpan akan dimodifikasi.
Selama beberapa langkah berikutnya kita akan membuat TableAdapter yang, awalnya, menggunakan kueri utama yang menghilangkan s apa pun JOIN
sehingga prosedur penyisipan, pembaruan, dan penghapusan yang tersimpan yang sesuai akan dibuat secara otomatis. Kami kemudian akan memperbarui SelectCommand
sehingga menggunakan JOIN
yang mengembalikan kolom tambahan dari tabel terkait. Terakhir, kita akan membuat kelas Business Logic Layer yang sesuai dan menunjukkan menggunakan TableAdapter di halaman web ASP.NET.
Langkah 1: Membuat TableAdapter Menggunakan Kueri Utama yang Disederhanakan
Untuk tutorial ini, kita akan menambahkan TableAdapter dan DataTable bertipe kuat untuk tabel Employees
dalam DataSet NorthwindWithSprocs
. Tabel Employees
berisi ReportsTo
bidang yang menentukan EmployeeID
manajer karyawan. Misalnya, karyawan Anne Dodsworth memiliki ReportTo
nilai 5, yang merupakan EmployeeID
dari Steven Buchanan. Akibatnya, Anne melaporkan kepada Steven, manajernya. Seiring dengan melaporkan nilai setiap karyawan ReportsTo
, kami mungkin juga ingin mengambil nama manajer mereka. Ini dapat dicapai menggunakan JOIN
. Tetapi penggunaan JOIN
saat awal pembuatan TableAdapter mencegah wizard secara otomatis menghasilkan kemampuan menyisipkan, memperbarui, dan menghapus yang sesuai. Oleh karena itu, kita akan mulai dengan membuat TableAdapter yang kueri utamanya tidak berisi s apa pun JOIN
. Kemudian, pada Langkah 2, kita akan memperbarui prosedur penyimpanan kueri utama untuk mengambil nama manajer melalui JOIN
.
Mulailah dengan membuka Himpunan NorthwindWithSprocs
Data di ~/App_Code/DAL
folder. Klik kanan pada Perancang, pilih opsi Tambahkan dari menu konteks, dan pilih item menu TableAdapter. Ini akan menjalankan wizard Konfigurasi TableAdapter. Seperti yang digambarkan Gambar 5, minta wizard membuat prosedur tersimpan baru dan klik Berikutnya. Untuk penyegaran tentang membuat prosedur tersimpan baru dari wizard TableAdapter, lihat tutorial Membuat Prosedur Tersimpan Baru untuk TableAdapters Himpunan Data Bertipe.
Gambar 5: Pilih Opsi Buat prosedur tersimpan baru (Klik untuk melihat gambar ukuran penuh)
Gunakan pernyataan berikut SELECT
untuk kueri utama TableAdapter:
SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country
FROM Employees
Karena kueri ini tidak menyertakan elemen JOIN
, wizard TableAdapter akan secara otomatis membuat prosedur tersimpan dengan pernyataan terkait INSERT
, UPDATE
, dan DELETE
, serta prosedur tersimpan untuk menjalankan kueri utama.
Langkah berikut memungkinkan kami memberi nama prosedur tersimpan TableAdapter. Gunakan nama Employees_Select
, , Employees_Insert
, Employees_Update
dan Employees_Delete
, seperti yang ditunjukkan pada Gambar 6.
Gambar 6: Beri nama TableAdapter s Prosedur Tersimpan (Klik untuk melihat gambar ukuran penuh)
Langkah terakhir meminta kita untuk memberi nama metode TableAdapter s. Gunakan Fill
dan GetEmployees
sebagai nama metode. Pastikan juga untuk membiarkan kotak centang Buat metode untuk mengirim pembaruan langsung ke database (GenerateDBDirectMethods) dicentang.
Gambar 7: Beri Nama Metode Fill
TableAdapter s dan GetEmployees
(Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard, luangkan waktu sejenak untuk memeriksa prosedur tersimpan dalam database. Anda akan melihat empat yang baru: Employees_Select
, , Employees_Insert
Employees_Update
, dan Employees_Delete
. Selanjutnya, periksa EmployeesDataTable
dan EmployeesTableAdapter
baru saja dibuat. DataTable berisi kolom untuk setiap bidang yang dikembalikan oleh kueri utama. Klik TableAdapter lalu buka jendela Properti. Di sana Anda akan melihat bahwa properti InsertCommand
, UpdateCommand
, dan DeleteCommand
telah dikonfigurasi dengan benar untuk memanggil prosedur tersimpan yang sesuai.
Gambar 8: TableAdapter Menyertakan Kemampuan Sisipkan, Perbarui, dan Hapus (Klik untuk melihat gambar ukuran penuh)
Dengan prosedur tersimpan untuk menyisipkan, memperbarui, dan menghapus yang dibuat secara otomatis dan properti InsertCommand
, UpdateCommand
, dan DeleteCommand
dikonfigurasi dengan benar, kami siap untuk menyesuaikan prosedur tersimpan SelectCommand
untuk mengembalikan informasi tambahan mengenai manajer dari setiap karyawan. Secara khusus, kita perlu memperbarui prosedur tersimpan Employees_Select
untuk menggunakan JOIN
dan mengembalikan nilai FirstName
dan LastName
manajer. Setelah prosedur tersimpan diperbarui, kita perlu memperbarui DataTable sehingga menyertakan kolom tambahan ini. Kami akan mengatasi kedua tugas ini di Langkah 2 dan 3.
Langkah 2: Menyesuaikan Prosedur Tersimpan untuk MenyertakanJOIN
Mulailah dengan masuk ke Server Explorer, menelusuri paling detail ke folder Prosedur Tersimpan database Northwind, dan membuka prosedur tersimpan Employees_Select
. Jika Anda tidak melihat prosedur tersimpan ini, klik kanan pada folder Prosedur Tersimpan dan pilih Refresh. Perbarui prosedur tersimpan sehingga menggunakan LEFT JOIN
untuk mengembalikan nama depan dan belakang manajer.
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
Setelah memperbarui SELECT
pernyataan, simpan perubahan dengan masuk ke menu File dan pilih Simpan Employees_Select
. Atau, Anda dapat mengklik ikon Simpan di toolbar atau tekan Ctrl+S. Setelah menyimpan perubahan Anda, klik kanan pada Employees_Select
prosedur tersimpan di Server Explorer dan pilih Jalankan. Ini akan menjalankan prosedur tersimpan dan menunjukkan hasilnya di jendela Output (lihat Gambar 9).
Gambar 9: Hasil Prosedur Tersimpan Ditampilkan di Jendela Output (Klik untuk melihat gambar ukuran penuh)
Langkah 3: Memperbarui Kolom DataTable
Pada titik ini, prosedur tersimpan Employees_Select
mengembalikan nilai ManagerFirstName
dan ManagerLastName
, tetapi EmployeesDataTable
tidak memiliki kolom-kolom ini. Kolom yang hilang ini dapat ditambahkan ke DataTable dengan salah satu dari dua cara:
- Secara manual - klik kanan pada DataTable di Perancang Himpunan Data dan, dari menu Tambahkan, pilih Kolom. Anda kemudian dapat memberi nama kolom dan mengatur propertinya dengan sesuai.
-
Secara otomatis - Wizard Konfigurasi TableAdapter akan memperbarui kolom DataTable untuk mencerminkan bidang yang dikembalikan oleh prosedur yang disimpan
SelectCommand
. Saat menggunakan pernyataan SQL ad-hoc, wizard juga akan menghapus propertiInsertCommand
,UpdateCommand
, danDeleteCommand
karenaSelectCommand
sekarang berisiJOIN
. Tetapi saat menggunakan prosedur tersimpan, properti perintah ini tetap utuh.
Kami telah menjelajahi penambahan kolom DataTable secara manual dalam tutorial sebelumnya, termasuk Master/Detail Menggunakan Daftar Catatan Master Berpoin dengan Daftar Data Detail dan Mengunggah File, dan kami akan melihat proses ini lagi secara lebih rinci dalam tutorial kami berikutnya. Namun, untuk tutorial ini, mari kita gunakan pendekatan otomatis melalui wizard Konfigurasi TableAdapter.
Mulailah dengan mengklik kanan pada EmployeesTableAdapter
dan memilih Konfigurasikan dari menu konteks. Ini memunculkan wizard Konfigurasi TableAdapter, yang mencantumkan prosedur tersimpan yang digunakan untuk memilih, menyisipkan, memperbarui, dan menghapus, bersama dengan nilai dan parameter yang dikembalikan (jika ada). Gambar 10 memperlihatkan asisten ini. Di sini kita dapat melihat bahwa prosedur tersimpan Employees_Select
sekarang mengembalikan kolom ManagerFirstName
dan ManagerLastName
.
Gambar 10: Wizard Memperlihatkan Daftar Kolom yang Diperbarui untuk Employees_Select
Prosedur Tersimpan (Klik untuk melihat gambar ukuran penuh)
Selesaikan wizard dengan mengklik Selesai. Setelah kembali ke Desainer Himpunan Data, EmployeesDataTable
menyertakan dua kolom tambahan: ManagerFirstName
dan ManagerLastName
.
Gambar 11: EmployeesDataTable
Berisi Dua Kolom Baru (Klik untuk melihat gambar ukuran penuh)
Untuk menggambarkan bahwa prosedur tersimpan yang diperbarui Employees_Select
berlaku dan bahwa kemampuan sisipkan, perbarui, dan hapus TableAdapter masih berfungsi, mari kita buat halaman web yang memungkinkan pengguna untuk melihat dan menghapus karyawan. Namun, sebelum membuat halaman seperti itu, kita harus terlebih dahulu membuat kelas baru di Lapisan Logika Bisnis untuk bekerja dengan karyawan dari Himpunan NorthwindWithSprocs
Data. Di Langkah 4, kita akan membuat EmployeesBLLWithSprocs
kelas. Di Langkah 5, kita akan menggunakan kelas ini dari halaman ASP.NET.
Langkah 4: Menerapkan Lapisan Logika Bisnis
Buat file kelas baru di ~/App_Code/BLL
folder bernama EmployeesBLLWithSprocs.vb
. Kelas ini meniru semantik kelas yang ada EmployeesBLL
, hanya yang baru ini yang menyediakan lebih sedikit metode dan menggunakan NorthwindWithSprocs
Himpunan Data (alih-alih Himpunan Northwind
Data). Tambahkan kode berikut ke kelas EmployeesBLLWithSprocs
.
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
Properti EmployeesBLLWithSprocs
kelas Adapter
mengembalikan instans dari NorthwindWithSprocs
DataSet EmployeesTableAdapter
. Ini digunakan oleh metode GetEmployees
dan DeleteEmployee
dari kelas. Metode GetEmployees
memanggil EmployeesTableAdapter
metode yang sesuaiGetEmployees
, yang kemudian memanggil prosedur tersimpan Employees_Select
dan mengisi hasilnya ke dalam EmployeeDataTable
. Metode DeleteEmployee
juga memanggil metode EmployeesTableAdapter
Delete
, yang kemudian memanggil prosedur tersimpan Employees_Delete
.
Langkah 5: Bekerja dengan Data di Lapisan Presentasi
Dengan kelas EmployeesBLLWithSprocs
selesai, kami siap untuk bekerja dengan data karyawan melalui halaman ASP.NET. Buka halaman JOINs.aspx
di folder AdvancedDAL
, lalu seret GridView dari Kotak Alat ke Perancang dan atur propertinya ID
ke Employees
. Selanjutnya, dari tag cerdas GridView, mengikat grid ke kontrol ObjectDataSource baru bernama EmployeesDataSource
.
Konfigurasikan ObjectDataSource untuk menggunakan
Gambar 12: Konfigurasikan ObjectDataSource untuk Menggunakan EmployeesBLLWithSprocs
Kelas (Klik untuk melihat gambar ukuran penuh)
Gambar 13: Agar ObjectDataSource Menggunakan Metode GetEmployees
dan DeleteEmployee
(Klik untuk melihat gambar ukuran penuh)
Visual Studio akan menambahkan BoundField ke GridView untuk setiap EmployeesDataTable
kolom s. Hapus semua BoundFields ini kecuali untuk Title
, LastName
, FirstName
, ManagerFirstName
, dan ManagerLastName
dan ubah nama properti HeaderText
untuk empat BoundFields terakhir menjadi Nama Belakang, Nama Depan, Nama Depan Manajer, dan Nama Belakang Manajer, masing-masing.
Untuk memungkinkan pengguna menghapus karyawan dari halaman ini, kita perlu melakukan dua hal. Pertama, instruksikan GridView untuk menyediakan kemampuan penghapusan dengan mencentang opsi Aktifkan Penghapusan dari tag pintarnya. Kedua, ubah properti ObjectDataSource dari OldValuesParameterFormatString
nilai yang ditetapkan oleh wizard ObjectDataSource (original_{0}
) menjadi nilai defaultnya ({0}
). Setelah membuat perubahan ini, markup deklaratif GridView dan ObjectDataSource Anda akan terlihat mirip dengan yang berikut ini:
<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>
Uji halaman dengan mengunjunginya melalui browser. Seperti yang ditunjukkan gambar 14, halaman akan mencantumkan setiap karyawan dan nama manajernya (dengan asumsi mereka memilikinya).
Gambar 14: JOIN
dalam Employees_Select
Prosedur Tersimpan Mengembalikan Nama Manajer (Klik untuk melihat gambar ukuran penuh)
Mengklik tombol Hapus memulai alur kerja penghapusan, yang berpuncak dalam eksekusi prosedur tersimpan Employees_Delete
. Namun, pernyataan DELETE
yang diupayakan dalam prosedur tersimpan gagal karena pelanggaran pembatasan kunci asing (lihat Gambar 15). Secara khusus, setiap karyawan memiliki satu atau beberapa rekaman dalam Orders
tabel, menyebabkan penghapusan gagal.
Gambar 15: Menghapus Karyawan yang Memiliki Pesanan Terkait Mengakibatkan Pelanggaran Batasan Kunci Asing (Klik untuk melihat gambar ukuran penuh)
Untuk mengizinkan karyawan dihapus, Anda dapat:
- Perbarui batasan kunci asing untuk menghapus kaskade,
- Menghapus rekaman secara manual dari
Orders
tabel untuk karyawan yang ingin Anda hapus, atau - Perbarui prosedur tersimpan
Employees_Delete
untuk terlebih dahulu menghapus rekaman terkait dariOrders
tabel sebelum menghapusEmployees
rekaman. Kami membahas teknik ini dalam Using Existing Stored Procedures for the Typed DataSet's TableAdapters tutorial.
Saya meninggalkan ini sebagai latihan untuk pembaca.
Ringkasan
Saat bekerja dengan database relasional, adalah umum bagi kueri untuk menarik data mereka dari beberapa tabel terkait. Subkueri berkorelasi dan JOIN
menyediakan dua teknik berbeda untuk mengakses data dari tabel terkait dalam kueri. Dalam tutorial sebelumnya, kami paling sering menggunakan subkueri berkorelasi karena TableAdapter tidak dapat membuat INSERT
pernyataan , , UPDATE
dan DELETE
secara otomatis untuk kueri yang melibatkan JOIN
s. Meskipun nilai-nilai ini dapat disediakan secara manual, saat menggunakan pernyataan SQL ad-hoc, penyesuaian apa pun akan diganti ketika wizard Konfigurasi TableAdapter diselesaikan.
Untungnya, TableAdapters yang dibuat menggunakan prosedur tersimpan tidak mengalami kerapuhan yang sama dengan yang dibuat menggunakan pernyataan SQL ad-hoc. Oleh karena itu, layak untuk membuat TableAdapter yang kueri utamanya menggunakan JOIN
saat menggunakan prosedur tersimpan. Dalam tutorial ini kita melihat cara membuat TableAdapter seperti itu. Kami mulai dengan menggunakan kueri JOIN
tanpa SELECT
untuk kueri utama TableAdapter sehingga prosedur yang sesuai, yaitu penyisipan, pembaruan, dan penghapusan yang tersimpan, akan dibuat secara otomatis. Dengan konfigurasi awal TableAdapter selesai, kami mengubah prosedur tersimpan SelectCommand
untuk menggunakan JOIN
dan mengulangi wizard Konfigurasi TableAdapter untuk memperbarui kolom EmployeesDataTable
.
Menjalankan kembali wizard Konfigurasi TableAdapter secara otomatis memperbarui EmployeesDataTable
kolom untuk mencerminkan bidang data yang dikembalikan oleh prosedur tersimpan Employees_Select
. Atau, kita bisa menambahkan kolom ini secara manual ke DataTable. Kami akan menjelajahi penambahan kolom secara manual ke DataTable di tutorial berikutnya.
Selamat Pemrograman!
Tentang Penulis
Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.
Ucapan terima kasih khusus kepada
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Hilton Geisenow, David Suru, dan Teresa Murphy. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.