Bagikan melalui


Memperbarui TableAdapter untuk Menggunakan JOIN (VB)

oleh Scott Mitchell

Unduh PDF

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

Cuplikan layar memperlihatkan jendela Wizard Konfigurasi TableAdaptor dengan kueri berisi JOIN yang telah dimasukkan.

Gambar 1: Masukkan Kueri Utama yang Berisi JOIN (Klik untuk menampilkan gambar ukuran penuh)

Secara default, TableAdapter akan secara otomatis membuat INSERTpernyataan , 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.

Cuplikan layar memperlihatkan jendela Opsi Tingkat Lanjut dengan kotak centang Buat pernyataan Sisipkan, Perbarui, dan Hapus dipilih.

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.

DataTable Menyertakan Kolom untuk Setiap Bidang yang Dikembalikan dalam Daftar Kolom

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).

Properti InsertCommand, UpdateCommand, dan DeleteCommand disetel ke (None)

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 InsertCommandproperti , , UpdateCommanddan 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.

Pilih Opsi Buat prosedur tersimpan baru

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_Updatedan Employees_Delete, seperti yang ditunjukkan pada Gambar 6.

Beri nama TableAdapter s Prosedur Tersimpan

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.

Nama metode TableAdapter Fill dan GetEmployees

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_InsertEmployees_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.

TableAdapter Menyertakan Kemampuan Sisipkan, Perbarui, dan Hapus

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).

Hasil Prosedur Tersimpan Ditampilkan di Jendela Output

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 properti InsertCommand, UpdateCommand, dan DeleteCommand karena SelectCommand sekarang berisi JOIN. 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.

Panduan Memperlihatkan Daftar Kolom yang Diperbarui untuk Prosedur tersimpan Employees_Select

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.

EmployeesDataTable Berisi Dua Kolom Baru

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 EmployeesTableAdapterDelete, 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 dan, dari tab SELECT dan DELETE, pastikan bahwa dan dipilih dari daftar drop-down. Klik Selesai untuk menyelesaikan konfigurasi ObjectDataSource.

Mengonfigurasi ObjectDataSource untuk Menggunakan Kelas EmployeesBLLWithSprocs

Gambar 12: Konfigurasikan ObjectDataSource untuk Menggunakan EmployeesBLLWithSprocs Kelas (Klik untuk melihat gambar ukuran penuh)

Minta ObjectDataSource Menggunakan Metode GetEmployees dan DeleteEmployee

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).

JOIN dalam Prosedur Tersimpan Employees_Select Mengembalikan Nama Manajer

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.

Menghapus Karyawan yang Memiliki Pesanan Terkait Mengakibatkan Pelanggaran Batasan Kunci Asing

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 dari Orders tabel sebelum menghapus Employees 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 INSERTpernyataan , , UPDATEdan 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.