Bagikan melalui


Membuat Lapisan Akses Data (VB)

oleh Scott Mitchell

Unduh PDF

Dalam tutorial ini kita akan mulai dari awal dan membuat Lapisan Akses Data (DAL), menggunakan Himpunan Data yang ditik, untuk mengakses informasi dalam database.

Pendahuluan

Sebagai pengembang web, kehidupan kita berputar di sekitar bekerja dengan data. Kami membuat database untuk menyimpan data, kode untuk mengambil dan memodifikasinya, dan halaman web untuk mengumpulkan dan meringkasnya. Ini adalah tutorial pertama dalam seri panjang yang akan mengeksplorasi teknik untuk menerapkan pola umum ini dalam ASP.NET 2.0. Kita akan mulai dengan membuat arsitektur perangkat lunak yang terdiri dari Lapisan Akses Data (DAL) menggunakan Typed DataSets, Business Logic Layer (BLL) yang memberlakukan aturan bisnis kustom, dan lapisan presentasi yang terdiri dari halaman ASP.NET yang berbagi tata letak halaman umum. Setelah groundwork backend ini diletakkan, kita akan beralih ke pelaporan, menunjukkan cara menampilkan, meringkas, mengumpulkan, dan memvalidasi data dari aplikasi web. Tutorial ini diarahkan untuk ringkas dan memberikan instruksi langkah demi langkah dengan banyak cuplikan layar untuk memandu Anda melalui proses secara visual. Setiap tutorial tersedia dalam versi C# dan Visual Basic dan menyertakan unduhan kode lengkap yang digunakan. (Tutorial pertama ini cukup panjang, tetapi sisanya disajikan dalam gugus yang jauh lebih mudah dicerna.)

Untuk tutorial ini, kita akan menggunakan versi Microsoft SQL Server 2005 Express Edition dari database Northwind yang ditempatkan di App_Data direktori. Selain file database, App_Data folder juga berisi skrip SQL untuk membuat database, jika Anda ingin menggunakan versi database yang berbeda. Jika Anda menggunakan versi SQL Server yang berbeda dari database Northwind, Anda harus memperbarui NORTHWNDConnectionString pengaturan dalam file aplikasi Web.config . Aplikasi web ini dibangun menggunakan Visual Studio 2005 Professional Edition sebagai proyek situs Web berbasis sistem file. Namun, semua tutorial akan bekerja sama baiknya dengan versi gratis Visual Studio 2005, Visual Web Developer.

Dalam tutorial ini kita akan mulai dari awal dan membuat Lapisan Akses Data (DAL), diikuti dengan membuat Business Logic Layer (BLL) di tutorial kedua, dan mengerjakan tata letak halaman dan navigasi di yang ketiga. Tutorial setelah yang ketiga akan dibangun di atas fondasi yang diletakkan di tiga pertama. Kita punya banyak hal untuk dibahas dalam tutorial pertama ini, jadi aktifkan Visual Studio dan mari kita mulai!

Langkah 1: Membuat Proyek Web dan Menyambungkan ke Database

Sebelum kita dapat membuat Lapisan Akses Data (DAL), pertama-tama kita perlu membuat situs web dan menyiapkan database kita. Mulailah dengan membuat situs web ASP.NET berbasis sistem file baru. Untuk menyelesaikan ini, buka menu File dan pilih Situs Web Baru, menampilkan kotak dialog Situs Web Baru. Pilih templat situs web ASP.NET, atur daftar drop-down Lokasi ke Sistem File, pilih folder untuk menempatkan situs web, dan atur bahasa ke Visual Basic.

Membuat Situs Web Berbasis Sistem File Baru

Gambar 1: Buat Situs Web Berbasis Sistem File Baru (Klik untuk melihat gambar ukuran penuh)

Ini akan membuat situs web baru dengan Default.aspx halaman ASP.NET, App_Data folder, dan Web.config file.

Dengan situs web yang dibuat, langkah selanjutnya adalah menambahkan referensi ke database di Penjelajah Server Visual Studio. Dengan menambahkan database ke Server Explorer, Anda dapat menambahkan tabel, prosedur tersimpan, tampilan, dan sebagainya dari dalam Visual Studio. Anda juga bisa menampilkan data tabel atau membuat kueri Anda sendiri baik secara tangan maupun grafis melalui Penyusun Kueri. Selain itu, ketika kita membangun Himpunan Data Yang Diekstrak untuk DAL, kita harus mengarahkan Visual Studio ke database tempat Himpunan Data Yang Diekstrak harus dibangun. Meskipun kami dapat memberikan informasi koneksi ini pada saat itu, Visual Studio secara otomatis mengisi daftar drop-down database yang sudah terdaftar di Server Explorer.

Langkah-langkah untuk menambahkan database Northwind ke Server Explorer bergantung pada apakah Anda ingin menggunakan database SQL Server 2005 Express Edition di App_Data folder atau jika Anda memiliki penyiapan server database Microsoft SQL Server 2000 atau 2005 yang ingin Anda gunakan sebagai gantinya.

Menggunakan Database diApp_DataFolder

Jika Anda tidak memiliki server database SQL Server 2000 atau 2005 untuk tersambung, atau Anda hanya ingin menghindari penambahan database ke server database, Anda dapat menggunakan versi SQL Server 2005 Express Edition dari database Northwind yang terletak di folder situs web App_Data yang diunduh (NORTHWND.MDF).

Database yang App_Data ditempatkan di folder secara otomatis ditambahkan ke Server Explorer. Dengan asumsi Anda memiliki SQL Server 2005 Express Edition yang terinstal di komputer Anda, Anda akan melihat simpul bernama NORTHWND. MDF di Server Explorer, yang dapat Anda perluas dan jelajahi tabel, tampilan, prosedur tersimpan, dan sebagainya (lihat Gambar 2).

Folder App_Data juga dapat menyimpan file Microsoft Access .mdb , yang, seperti mitra SQL Server mereka, secara otomatis ditambahkan ke Server Explorer. Jika Anda tidak ingin menggunakan salah satu opsi SQL Server, Anda selalu dapat menginstal database dan aplikasi Northwind Traders dan masuk ke App_Data direktori. Namun, perlu diingat bahwa database Access tidak kaya fitur seperti SQL Server, dan tidak dirancang untuk digunakan dalam skenario situs web. Selain itu, beberapa tutorial 35+ akan menggunakan fitur tingkat database tertentu yang tidak didukung oleh Access.

Menyambungkan ke Database di Server Database Microsoft SQL Server 2000 atau 2005

Atau, Anda dapat menyambungkan ke database Northwind yang diinstal di server database. Jika server database belum menginstal database Northwind, Anda harus terlebih dahulu menambahkannya ke server database dengan menjalankan skrip penginstalan yang disertakan dalam unduhan tutorial ini.

Setelah Anda menginstal database, buka Penjelajah Server di Visual Studio, klik kanan pada simpul Koneksi Data, dan pilih Tambahkan Koneksi. Jika Anda tidak melihat Penjelajah Server masuk ke Penjelajah Tampilan/Server, atau tekan Ctrl+Alt+S. Ini akan memunculkan kotak dialog Tambahkan Koneksi, tempat Anda dapat menentukan server yang akan disambungkan, informasi autentikasi, dan nama database. Setelah Anda berhasil mengonfigurasi informasi koneksi database dan mengklik tombol OK, database akan ditambahkan sebagai simpul di bawah simpul Koneksi Data. Anda dapat memperluas simpul database untuk menjelajahi tabel, tampilan, prosedur tersimpan, dan sebagainya.

Menambahkan Koneksi ke Database Northwind Server Database Anda

Gambar 2: Tambahkan Koneksi ke Database Northwind Server Database Anda

Langkah 2: Membuat Lapisan Akses Data

Saat bekerja dengan data satu opsi adalah menyematkan logika khusus data langsung ke lapisan presentasi (dalam aplikasi web, halaman ASP.NET membentuk lapisan presentasi). Ini dapat berupa penulisan kode ADO.NET di bagian kode halaman ASP.NET atau menggunakan kontrol SqlDataSource dari bagian markup. Dalam kedua kasus, pendekatan ini menggabungkan logika akses data dengan lapisan presentasi dengan erat. Namun, pendekatan yang direkomendasikan adalah memisahkan logika akses data dari lapisan presentasi. Lapisan terpisah ini disebut sebagai Lapisan Akses Data, DAL singkatnya, dan biasanya diimplementasikan sebagai proyek Pustaka Kelas terpisah. Manfaat arsitektur berlapis ini didokumentasikan dengan baik (lihat bagian "Bacaan Lebih Lanjut" di akhir tutorial ini untuk informasi tentang keuntungan ini) dan adalah pendekatan yang akan kita ambil dalam seri ini.

Semua kode yang khusus untuk sumber data yang mendasar seperti membuat koneksi ke database, mengeluarkan SELECT, , INSERTUPDATE, dan DELETE perintah, dan sebagainya harus terletak di DAL. Lapisan presentasi tidak boleh berisi referensi apa pun ke kode akses data tersebut, tetapi sebaliknya harus melakukan panggilan ke DAL untuk setiap dan semua permintaan data. Lapisan Akses Data biasanya berisi metode untuk mengakses data database yang mendasar. Database Northwind, misalnya, memiliki Products tabel dan Categories yang merekam produk untuk dijual dan kategori tempat mereka berada. Dalam DAL kami, kami akan memiliki metode seperti:

  • GetCategories(), yang akan mengembalikan informasi tentang semua kategori
  • GetProducts(), yang akan mengembalikan informasi tentang semua produk
  • GetProductsByCategoryID(categoryID), yang akan mengembalikan semua produk yang termasuk dalam kategori tertentu
  • GetProductByProductID(productID), yang akan mengembalikan informasi tentang produk tertentu

Metode ini, ketika dipanggil, akan tersambung ke database, mengeluarkan kueri yang sesuai, dan mengembalikan hasilnya. Bagaimana kita mengembalikan hasil ini penting. Metode ini hanya dapat mengembalikan Himpunan Data atau DataReader yang diisi oleh kueri database, tetapi idealnya hasil ini harus dikembalikan menggunakan objek yang sangat diketik. Objek yang sangat diketik adalah objek yang skemanya didefinisikan dengan kaku pada waktu kompilasi, sedangkan sebaliknya, objek yang diketik secara longgar, adalah objek yang skemanya tidak diketahui sampai runtime.

Misalnya, DataReader dan Himpunan Data (secara default) adalah objek yang diketik secara longgar karena skemanya ditentukan oleh kolom yang dikembalikan oleh kueri database yang digunakan untuk mengisinya. Untuk mengakses kolom tertentu dari DataTable yang ditik secara longgar, kita perlu menggunakan sintaks seperti: DataTable.Rows(index)("columnName"). Pengetikan longgar DataTable dalam contoh ini dipamerkan oleh fakta bahwa kita perlu mengakses nama kolom menggunakan string atau indeks ordinal. DataTable yang sangat di ketik, di sisi lain, akan memiliki setiap kolomnya yang diimplementasikan sebagai properti, menghasilkan kode yang terlihat seperti: DataTable.Rows(index).columnName.

Untuk mengembalikan objek yang ditik dengan kuat, pengembang dapat membuat objek bisnis kustom mereka sendiri atau menggunakan Typed DataSets. Objek bisnis diimplementasikan oleh pengembang sebagai kelas yang propertinya biasanya mencerminkan kolom tabel database yang mendasar yang diwakili objek bisnis. Typed DataSet adalah kelas yang dihasilkan untuk Anda oleh Visual Studio berdasarkan skema database dan anggotanya sangat diketik sesuai dengan skema ini. Typed DataSet sendiri terdiri dari kelas yang memperluas kelas ADO.NET DataSet, DataTable, dan DataRow. Selain DataTable yang di ketik dengan kuat, Himpunan Data Yang Ditik sekarang juga menyertakan TableAdapters, yang merupakan kelas dengan metode untuk mengisi DataTables Himpunan Data dan menyebarkan modifikasi dalam DataTables kembali ke database.

Catatan

Untuk informasi lebih lanjut tentang kelebihan dan kekurangan menggunakan Typed DataSets versus objek bisnis kustom, lihat Merancang Komponen Tingkat Data dan Meneruskan Data Melalui Tingkatan.

Kita akan menggunakan Himpunan Data yang ditik dengan kuat untuk arsitektur tutorial ini. Gambar 3 mengilustrasikan alur kerja antara berbagai lapisan aplikasi yang menggunakan Typed DataSets.

Semua Kode Akses Data Didelegasikan ke DAL

Gambar 3: Semua Kode Akses Data Didelegasikan ke DAL (Klik untuk melihat gambar ukuran penuh)

Membuat Himpunan Data Yang Dititik dan Adaptor Tabel

Untuk mulai membuat DAL, kita mulai dengan menambahkan Typed DataSet ke proyek kita. Untuk mencapai hal ini, klik kanan pada simpul proyek di Penjelajah Solusi dan pilih Tambahkan Item Baru. Pilih opsi Himpunan Data dari daftar templat dan beri nama Northwind.xsd.

Pilih untuk Menambahkan Himpunan Data Baru ke Proyek Anda

Gambar 4: Pilih untuk Menambahkan Himpunan Data Baru ke Proyek Anda (Klik untuk melihat gambar ukuran penuh)

Setelah mengklik Tambahkan, saat diminta untuk menambahkan Himpunan Data ke App_Code folder, pilih Ya. Perancang untuk Himpunan Data Yang Dijenis kemudian akan ditampilkan, dan Wizard Konfigurasi TableAdapter akan dimulai, memungkinkan Anda untuk menambahkan TableAdapter pertama Anda ke Himpunan Data Yang Dijenis.

Himpunan Data Bertitik berfungsi sebagai pengumpulan data yang sangat ditik; ini terdiri dari instans DataTable yang diketik dengan kuat, yang masing-masing terdiri dari instans DataRow yang sangat diketik. Kami akan membuat DataTable yang ditik dengan kuat untuk setiap tabel database dasar yang perlu kita kerjakan dalam seri tutorial ini. Mari kita mulai dengan membuat DataTable untuk Products tabel.

Perlu diingat bahwa DataTable yang di ketik dengan kuat tidak menyertakan informasi apa pun tentang cara mengakses data dari tabel database yang mendasar. Untuk mengambil data untuk mengisi DataTable, kami menggunakan kelas TableAdapter, yang berfungsi sebagai Lapisan Akses Data kami. Untuk DataTable kami Products , TableAdapter akan berisi metode GetProducts(), , GetProductByCategoryID(categoryID)dan sebagainya yang akan kita panggil dari lapisan presentasi. Peran DataTable adalah berfungsi sebagai objek yang ditik dengan kuat yang digunakan untuk meneruskan data di antara lapisan.

Panduan Konfigurasi TableAdapter dimulai dengan meminta Anda untuk memilih database mana yang akan dikerjakan. Daftar drop-down memperlihatkan database tersebut di Penjelajah Server. Jika Anda tidak menambahkan database Northwind ke Penjelajah Server, Anda bisa mengklik tombol Koneksi Baru saat ini untuk melakukannya.

Pilih Database Northwind dari Daftar Drop-Down

Gambar 5: Pilih Database Northwind dari Daftar Drop-Down (Klik untuk melihat gambar ukuran penuh)

Setelah memilih database dan mengklik Berikutnya, Anda akan ditanya apakah Anda ingin menyimpan string koneksi dalam Web.config file. Dengan menyimpan string koneksi Anda akan menghindari hard code di kelas TableAdapter, yang menyederhanakan hal-hal jika informasi string koneksi berubah di masa mendatang. Jika Anda memilih untuk menyimpan string koneksi dalam file konfigurasi yang ditempatkan di bagian , yang dapat dienkripsi <connectionStrings> secara opsional untuk meningkatkan keamanan atau dimodifikasi nanti melalui Halaman Properti ASP.NET 2.0 baru dalam Alat Admin IIS GUI, yang lebih ideal untuk administrator.

Simpan String Koneksi ke Web.config

Gambar 6: Simpan String Koneksi ke Web.config (Klik untuk melihat gambar ukuran penuh)

Selanjutnya, kita perlu menentukan skema untuk DataTable pertama yang diketik dengan kuat dan menyediakan metode pertama untuk digunakan TableAdapter saat mengisi Himpunan Data yang diketik dengan kuat. Kedua langkah ini dicapai secara bersamaan dengan membuat kueri yang mengembalikan kolom dari tabel yang ingin kita refleksikan dalam DataTable kita. Di akhir wizard, kita akan memberikan nama metode untuk kueri ini. Setelah selesai, metode ini dapat dipanggil dari lapisan presentasi kami. Metode ini akan menjalankan kueri yang ditentukan dan mengisi DataTable yang sangat di ketik.

Untuk mulai menentukan kueri SQL, kita harus terlebih dahulu menunjukkan bagaimana kita ingin TableAdapter mengeluarkan kueri. Kita dapat menggunakan pernyataan SQL ad-hoc, membuat prosedur tersimpan baru, atau menggunakan prosedur tersimpan yang ada. Untuk tutorial ini, kita akan menggunakan pernyataan SQL ad-hoc.

Mengkueri Data Menggunakan Pernyataan Ad-Hoc SQL

Gambar 7: Mengkueri Data Menggunakan Pernyataan SQL Ad-Hoc (Klik untuk melihat gambar ukuran penuh)

Pada titik ini kita dapat mengetikkan kueri SQL dengan tangan. Saat membuat metode pertama di TableAdapter, Anda biasanya ingin kueri mengembalikan kolom yang perlu diekspresikan dalam DataTable yang sesuai. Kita dapat menyelesaikan ini dengan membuat kueri yang mengembalikan semua kolom dan semua baris dari Products tabel:

Masukkan Kueri SQL Ke Dalam Kotak Teks

Gambar 8: Masukkan Kueri SQL Ke Dalam Kotak Teks (Klik untuk melihat gambar ukuran penuh)

Atau, gunakan Penyusun Kueri dan buat kueri secara grafis, seperti yang diperlihatkan dalam Gambar 9.

Buat Kueri Secara Grafis, melalui Editor Kueri

Gambar 9: Buat Kueri Secara Grafis, melalui Editor Kueri (Klik untuk melihat gambar ukuran penuh)

Setelah membuat kueri, tetapi sebelum berpindah ke layar berikutnya, klik tombol Opsi Tingkat Lanjut. Di Proyek Situs Web, "Hasilkan pernyataan Sisipkan, Perbarui, dan Hapus" adalah satu-satunya opsi tingkat lanjut yang dipilih secara default; jika Anda menjalankan wizard ini dari Pustaka Kelas atau Proyek Windows, opsi "Gunakan konkurensi optimis" juga akan dipilih. Biarkan opsi "Gunakan konkurensi optimis" tidak dicentang untuk saat ini. Kami akan memeriksa konkurensi optimis dalam tutorial mendatang.

Pilih Hanya Opsi Buat Pernyataan Sisipkan, Perbarui, dan Hapus

Gambar 10: Pilih Hanya Opsi Buat pernyataan Sisipkan, Perbarui, dan Hapus (Klik untuk melihat gambar ukuran penuh)

Setelah memverifikasi opsi tingkat lanjut, klik Berikutnya untuk melanjutkan ke layar akhir. Di sini kita diminta untuk memilih metode mana yang akan ditambahkan ke TableAdapter. Ada dua pola untuk mengisi data:

  • Isi DataTable dengan pendekatan ini, metode dibuat yang mengambil DataTable sebagai parameter dan mengisinya berdasarkan hasil kueri. Kelas ADO.NET DataAdapter, misalnya, mengimplementasikan pola ini dengan metodenya Fill() .
  • Mengembalikan DataTable dengan pendekatan ini metode membuat dan mengisi DataTable untuk Anda dan mengembalikannya sebagai nilai pengembalian metode.

Anda dapat memiliki TableAdapter yang mengimplementasikan satu atau kedua pola ini. Anda juga dapat mengganti nama metode yang disediakan di sini. Mari kita biarkan kedua kotak centang dicentang, meskipun kita hanya akan menggunakan pola terakhir sepanjang tutorial ini. Selain itu, mari kita ganti nama metode yang agak umum GetData menjadi GetProducts.

Jika dicentang, kotak centang akhir, "GenerateDBDirectMethods," membuat Insert()metode , Update(), dan Delete() untuk TableAdapter. Jika Anda membiarkan opsi ini tidak dicentang, semua pembaruan perlu dilakukan melalui metode tunggal Update() TableAdapter, yang mengambil Kumpulan Data Yang Diketik, DataTable, satu DataRow, atau array DataRows. (Jika Anda telah menghapus centang opsi "Buat pernyataan Sisipkan, Perbarui, dan Hapus" dari properti tingkat lanjut di Gambar 9 pengaturan kotak centang ini tidak akan berpengaruh.) Biarkan kotak centang ini dipilih.

Mengubah Nama Metode dari GetData menjadi GetProducts

Gambar 11: Ubah Nama Metode dari GetData ke GetProducts (Klik untuk melihat gambar ukuran penuh)

Selesaikan panduan dengan mengklik Selesai. Setelah wizard ditutup, kita dikembalikan ke DataSet Designer yang memperlihatkan DataTable yang baru saja kita buat. Anda dapat melihat daftar kolom di Products DataTable (ProductID, ProductName, dan sebagainya), serta metode ProductsTableAdapter (Fill() dan GetProducts()).

Produk DataTable dan ProductsTableAdapter telah Ditambahkan ke Himpunan Data Yang Dijenis

Gambar 12: DataTable dan Products telah Ditambahkan ke Himpunan Data Yang Dititik (ProductsTableAdapter ukuran penuh)

Pada titik ini kita memiliki Himpunan Data Yang Dieksa dengan satu DataTable (Northwind.Products) dan kelas DataAdapter yang sangat ditik (NorthwindTableAdapters.ProductsTableAdapter) dengan GetProducts() metode . Objek ini dapat digunakan untuk mengakses daftar semua produk dari kode seperti:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products as Northwind.ProductsDataTable
products = productsAdapter.GetProducts()
For Each productRow As Northwind.ProductsRow In products
    Response.Write("Product: " & productRow.ProductName & "<br />")
Next

Kode ini tidak mengharuskan kami menulis satu bit kode khusus akses data. Kami tidak perlu membuat instans kelas ADO.NET apa pun, kami tidak perlu merujuk ke string koneksi, kueri SQL, atau prosedur tersimpan. Sebagai gantinya, TableAdapter menyediakan kode akses data tingkat rendah untuk kami.

Setiap objek yang digunakan dalam contoh ini juga ditik dengan kuat, memungkinkan Visual Studio untuk menyediakan IntelliSense dan pemeriksaan jenis waktu kompilasi. Dan yang terbaik dari semua DataTable yang dikembalikan oleh TableAdapter dapat terikat ke kontrol Web data ASP.NET, seperti GridView, DetailsView, DropDownList, CheckBoxList, dan beberapa lainnya. Contoh berikut mengilustrasikan pengikatan DataTable yang dikembalikan oleh GetProducts() metode ke GridView hanya dalam pemindaian tiga baris kode dalam Page_Load penanganan aktivitas.

AllProducts.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="AllProducts.aspx.vb"
    Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View All Products in a GridView</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            All Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class AllProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource = productsAdapter.GetProducts()
        GridView1.DataBind()
    End Sub
End Class

Daftar Produk Ditampilkan dalam GridView

Gambar 13: Daftar Produk Ditampilkan dalam GridView (Klik untuk melihat gambar ukuran penuh)

Meskipun contoh ini mengharuskan kami menulis tiga baris kode di penanganan aktivitas halaman Page_Load ASP.NET kami, dalam tutorial mendatang, kami akan memeriksa cara menggunakan ObjectDataSource untuk secara deklaratif mengambil data dari DAL. Dengan ObjectDataSource, kita tidak perlu menulis kode apa pun dan akan mendapatkan dukungan penomoran dan pengurutan juga!

Langkah 3: Menambahkan Metode Berparameter ke Lapisan Akses Data

Pada titik ini kelas kami ProductsTableAdapter hanya memiliki satu metode, GetProducts(), yang mengembalikan semua produk dalam database. Meskipun dapat bekerja dengan semua produk pasti berguna, ada kalanya kita ingin mengambil informasi tentang produk tertentu, atau semua produk yang termasuk dalam kategori tertentu. Untuk menambahkan fungsionalitas tersebut ke Lapisan Akses Data kami, kami dapat menambahkan metode parameter ke TableAdapter.

Mari kita tambahkan metode .GetProductsByCategoryID(categoryID) Untuk menambahkan metode baru ke DAL, kembali ke Perancang Himpunan Data, klik kanan di bagian ProductsTableAdapter , dan pilih Tambahkan Kueri.

Klik Kanan pada TableAdapter dan Pilih Tambahkan Kueri

Gambar 14: Klik Kanan pada TableAdapter dan Pilih Tambahkan Kueri

Kami pertama-tama diminta tentang apakah kami ingin mengakses database menggunakan pernyataan SQL ad-hoc atau prosedur tersimpan baru atau yang sudah ada. Mari kita pilih untuk menggunakan pernyataan SQL ad-hoc lagi. Selanjutnya, kita ditanya jenis kueri SQL apa yang ingin kita gunakan. Karena kami ingin mengembalikan semua produk yang termasuk dalam kategori tertentu, kami ingin menulis SELECT pernyataan yang mengembalikan baris.

Pilih untuk Membuat Pernyataan SELECT yang Mengembalikan Baris

Gambar 15: Pilih untuk Membuat SELECT Pernyataan yang Mengembalikan Baris (Klik untuk melihat gambar ukuran penuh)

Langkah selanjutnya adalah menentukan kueri SQL yang digunakan untuk mengakses data. Karena kami hanya ingin mengembalikan produk yang termasuk dalam kategori tertentu, saya menggunakan pernyataan yang sama SELECT dari GetProducts(), tetapi tambahkan klausa berikut WHERE : WHERE CategoryID = @CategoryID. Parameter @CategoryID menunjukkan ke wizard TableAdapter bahwa metode yang kita buat akan memerlukan parameter input dari jenis yang sesuai (yaitu, bilangan bulat null).

Masukkan Kueri untuk Hanya Mengembalikan Produk dalam Kategori Tertentu

Gambar 16: Masukkan Kueri untuk Hanya Mengembalikan Produk dalam Kategori Tertentu (Klik untuk melihat gambar ukuran penuh)

Pada langkah terakhir kita dapat memilih pola akses data mana yang akan digunakan, serta menyesuaikan nama metode yang dihasilkan. Untuk pola Isian, mari kita ubah nama menjadi FillByCategoryID dan untuk pola pengembalian DataTable ( GetX metode), mari kita gunakan GetProductsByCategoryID.

Pilih Nama untuk Metode TableAdapter

Gambar 17: Pilih Nama untuk Metode TableAdapter (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard, Perancang Himpunan Data menyertakan metode TableAdapter baru.

Produk Sekarang Dapat Dikueri berdasarkan Kategori

Gambar 18: Produk Sekarang Dapat Dikueri berdasarkan Kategori

Luangkan waktu sejenak untuk menambahkan GetProductByProductID(productID) metode menggunakan teknik yang sama.

Kueri berparameter ini dapat diuji langsung dari DataSet Designer. Klik kanan pada metode di TableAdapter dan pilih Pratinjau Data. Selanjutnya, masukkan nilai yang akan digunakan untuk parameter dan klik Pratinjau.

Produk-Produk Milik Kategori Minuman ditampilkan

Gambar 19: Produk Milik Kategori Minuman ditampilkan (Klik untuk melihat gambar ukuran penuh)

GetProductsByCategoryID(categoryID) Dengan metode dalam DAL kami, kita sekarang dapat membuat halaman ASP.NET yang hanya menampilkan produk tersebut dalam kategori tertentu. Contoh berikut menunjukkan semua produk yang berada dalam kategori Minuman, yang memiliki CategoryID 1.

Beverages.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Beverages.aspx.vb"
    Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Beverages</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

Beverages.aspx.vb

Imports NorthwindTableAdapters
Partial Class Beverages
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource =
         productsAdapter.GetProductsByCategoryID(1)
        GridView1.DataBind()
    End Sub
End Class

Produk-Produk dalam Kategori Minuman Ditampilkan

Gambar 20: Produk-Produk dalam Kategori Minuman Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Langkah 4: Menyisipkan, Memperbarui, dan Menghapus Data

Ada dua pola yang umumnya digunakan untuk menyisipkan, memperbarui, dan menghapus data. Pola pertama, yang akan saya panggil pola langsung database, melibatkan pembuatan metode yang, ketika dipanggil, mengeluarkan INSERTperintah , , UPDATEatau DELETE ke database yang beroperasi pada satu rekaman database. Metode tersebut biasanya diteruskan dalam serangkaian nilai skalar (bilangan bulat, string, Boolean, DateTime, dan sebagainya) yang sesuai dengan nilai untuk menyisipkan, memperbarui, atau menghapus. Misalnya, dengan pola ini untuk Products tabel, metode penghapusan akan mengambil parameter bilangan bulat, menunjukkan ProductID rekaman yang akan dihapus, sementara metode sisipkan akan mengambil string untuk ProductName, desimal untuk UnitPrice, bilangan bulat untuk UnitsOnStock, dan sebagainya.

Setiap Permintaan Sisipkan, Perbarui, dan Hapus Dikirim ke Database Segera

Gambar 21: Setiap Permintaan Sisipkan, Perbarui, dan Hapus Dikirim ke Database Segera (Klik untuk melihat gambar ukuran penuh)

Pola lain, yang akan saya sebut sebagai pola pembaruan batch, adalah memperbarui seluruh Himpunan Data, DataTable, atau pengumpulan DataRows dalam satu panggilan metode. Dengan pola ini, pengembang menghapus, menyisipkan, dan memodifikasi DataRows dalam DataTable lalu meneruskan DataRows atau DataTable tersebut ke dalam metode pembaruan. Metode ini kemudian menghitung DataRows yang diteruskan, menentukan apakah data tersebut telah dimodifikasi, ditambahkan, atau dihapus (melalui nilai properti RowState DataRow), dan mengeluarkan permintaan database yang sesuai untuk setiap rekaman.

Semua Perubahan Disinkronkan dengan Database Saat Metode Pembaruan Dipanggil

Gambar 22: Semua Perubahan Disinkronkan dengan Database Saat Metode Pembaruan Dipanggil (Klik untuk melihat gambar ukuran penuh)

TableAdapter menggunakan pola pembaruan batch secara default, tetapi juga mendukung pola langsung DB. Karena kami memilih opsi "Buat pernyataan Sisipkan, Perbarui, dan Hapus" dari Properti Tingkat Lanjut saat membuat TableAdapter kami, ProductsTableAdapterUpdate() berisi metode , yang mengimplementasikan pola pembaruan batch. Secara khusus, TableAdapter berisi Update() metode yang dapat diteruskan Himpunan Data Yang Diketik, DataTable yang diketik dengan kuat, atau satu atau beberapa DataRows. Jika Anda meninggalkan kotak centang "GenerateDBDirectMethods" dicentang saat pertama kali membuat TableAdapter pola langsung DB juga akan diimplementasikan melalui Insert()metode , Update(), dan Delete() .

Kedua pola modifikasi data menggunakan properti TableAdapterInsertCommand, , UpdateCommand, dan DeleteCommand untuk mengeluarkan perintah , , INSERTdan UPDATE mereka DELETEke database. Anda dapat memeriksa dan memodifikasi InsertCommandproperti , UpdateCommand, dan DeleteCommand dengan mengklik TableAdapter di Perancang Himpunan Data lalu masuk ke jendela Properti. (Pastikan Anda telah memilih TableAdapter, dan bahwa ProductsTableAdapter objek adalah objek yang dipilih di daftar drop-down di jendela Properti.)

TableAdapter memiliki Properti InsertCommand, UpdateCommand, dan DeleteCommand

Gambar 23: TableAdapter memiliki InsertCommandProperti , , UpdateCommanddan DeleteCommand (Klik untuk melihat gambar ukuran penuh)

Untuk memeriksa atau mengubah salah satu properti perintah database ini, klik CommandText subproperti, yang akan memunculkan Pembangun Kueri.

Mengonfigurasi Pernyataan INSERT, UPDATE, dan DELETE di Penyusun Kueri

Gambar 24: Mengonfigurasi INSERTPernyataan , UPDATE, dan DELETE di Penyusun Kueri (Klik untuk melihat gambar ukuran penuh)

Contoh kode berikut menunjukkan cara menggunakan pola pembaruan batch untuk menggandakan harga semua produk yang tidak dihentikan dan yang memiliki 25 unit dalam stok atau kurang:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products As Northwind.ProductsDataTable = productsAdapter.GetProducts()
For Each product As Northwind.ProductsRow In products
   If Not product.Discontinued AndAlso product.UnitsInStock <= 25 Then
      product.UnitPrice *= 2
   End if
Next
productsAdapter.Update(products)

Kode di bawah ini menggambarkan cara menggunakan pola langsung DB untuk menghapus produk tertentu secara terprogram, lalu memperbaruinya, lalu menambahkan yang baru:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
productsAdapter.Delete(3)
productsAdapter.Update( _
    "Chai", 1, 1, "10 boxes x 20 bags", 18.0, 39, 15, 10, false, 1)
productsAdapter.Insert( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 15, 0, 10, false)

Membuat Metode Sisipkan, Perbarui, dan Hapus Kustom

Metode Insert(), Update(), dan Delete() yang dibuat oleh metode langsung DB bisa sedikit rumit, terutama untuk tabel dengan banyak kolom. Melihat contoh kode sebelumnya, tanpa bantuan IntelliSense tidak terlalu jelas apa yang Products dipetakan kolom tabel ke setiap parameter input ke Update() metode dan Insert() . Mungkin ada kalanya kita hanya ingin memperbarui satu atau dua kolom, atau menginginkan metode yang dikustomisasi Insert() yang akan, mungkin, mengembalikan nilai bidang rekaman IDENTITY (kenaikan otomatis) yang baru disisipkan.

Untuk membuat metode kustom seperti itu, kembali ke Perancang Himpunan Data. Klik kanan pada TableAdapter dan pilih Tambahkan Kueri, kembali ke wizard TableAdapter. Pada layar kedua kita dapat menunjukkan jenis kueri yang akan dibuat. Mari kita buat metode yang menambahkan produk baru lalu mengembalikan nilai rekaman ProductIDyang baru ditambahkan. Oleh karena itu, pilih untuk membuat INSERT kueri.

Membuat Metode untuk Menambahkan Baris Baru ke Tabel Produk

Gambar 25: Buat Metode untuk Menambahkan Baris Baru ke Products Tabel (Klik untuk melihat gambar ukuran penuh)

Pada layar InsertCommandberikutnya, CommandText layar muncul. Tambahkan kueri ini dengan menambahkan SELECT SCOPE_IDENTITY() di akhir kueri, yang akan mengembalikan nilai identitas terakhir yang IDENTITY disisipkan ke dalam kolom dalam cakupan yang sama. (Lihat dokumentasi teknis untuk informasi selengkapnya tentang SCOPE_IDENTITY() dan mengapa Anda mungkin ingin menggunakan SCOPE_IDENTITY() sebagai pengganti @@IDENTITY.) Pastikan Anda mengakhiri INSERT pernyataan dengan titik koma sebelum menambahkan SELECT pernyataan.

Menambah Kueri untuk Mengembalikan Nilai SCOPE_IDENTITY()

Gambar 26: Menambah Kueri untuk Mengembalikan SCOPE_IDENTITY() Nilai (Klik untuk melihat gambar ukuran penuh)

Terakhir, beri nama metode InsertProductbaru .

Atur Nama Metode Baru ke InsertProduct

Gambar 27: Atur Nama Metode Baru ke InsertProduct (Klik untuk melihat gambar ukuran penuh)

Saat Anda kembali ke DataSet Designer, Anda akan melihat bahwa ProductsTableAdapter berisi metode baru, InsertProduct. Jika metode baru ini tidak memiliki parameter untuk setiap kolom dalam Products tabel, kemungkinan Anda lupa mengakhiri INSERT pernyataan dengan titik koma. Konfigurasikan InsertProduct metode dan pastikan Anda memiliki titik koma yang memisahkan INSERT pernyataan dan SELECT .

Secara default, metode sisipkan mengeluarkan metode non-kueri, yang berarti bahwa metode tersebut mengembalikan jumlah baris yang terpengaruh. Namun, kami ingin InsertProduct metode mengembalikan nilai yang dikembalikan oleh kueri, bukan jumlah baris yang terpengaruh. Untuk mencapai hal ini, sesuaikan InsertProduct properti metode ExecuteMode dengan Scalar.

Mengubah Properti ExecuteMode menjadi Skalar

Gambar 28: Ubah Properti menjadi ExecuteModeScalar (Klik untuk melihat gambar ukuran penuh)

Kode berikut menunjukkan metode baru InsertProduct ini dalam tindakan:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim new_productID As Integer = Convert.ToInt32(productsAdapter.InsertProduct( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 10, 0, 10, false))
productsAdapter.Delete(new_productID)

Langkah 5: Menyelesaikan Lapisan Akses Data

Perhatikan bahwa ProductsTableAdapters kelas mengembalikan CategoryID nilai dan SupplierID dari Products tabel, tetapi tidak menyertakan CategoryName kolom dari Categories tabel atau CompanyName kolom dari Suppliers tabel, meskipun ini kemungkinan kolom yang ingin kami tampilkan saat menampilkan informasi produk. Kita dapat menambah metode awal TableAdapter, GetProducts(), untuk menyertakan CategoryName nilai kolom dan CompanyName , yang akan memperbarui DataTable yang di ketik dengan kuat untuk menyertakan kolom baru ini juga.

Namun, ini dapat menyajikan masalah, karena metode TableAdapter untuk menyisipkan, memperbarui, dan menghapus data didasarkan pada metode awal ini. Untungnya, metode yang dihasilkan secara otomatis untuk menyisipkan, memperbarui, dan menghapus tidak terpengaruh oleh subkueri dalam SELECT klausa. Dengan berhati-hatilah untuk menambahkan kueri kami ke Categories dan Suppliers sebagai subkueri, bukannya JOIN , kita akan menghindari harus mengerjakan ulang metode tersebut untuk memodifikasi data. Klik kanan pada GetProducts() metode di ProductsTableAdapter dan pilih Konfigurasikan. Kemudian, sesuaikan SELECT klausa sehingga terlihat seperti:

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

Memperbarui Pernyataan SELECT untuk Metode GetProducts()

Gambar 29: Perbarui SELECT Pernyataan untuk GetProducts() Metode (Klik untuk melihat gambar ukuran penuh)

Setelah memperbarui GetProducts() metode untuk menggunakan kueri baru ini, DataTable akan menyertakan dua kolom baru: CategoryName dan SupplierName.

DataTable Produk memiliki Dua Kolom Baru

Gambar 30: Products DataTable memiliki Dua Kolom Baru

Luangkan waktu sejenak untuk memperbarui SELECT klausul dalam GetProductsByCategoryID(categoryID) metode juga.

Jika Anda memperbarui GetProducts()SELECT sintaks penggunaan JOIN , DataSet Designer tidak akan dapat membuat metode secara otomatis untuk menyisipkan, memperbarui, dan menghapus data database menggunakan pola langsung DB. Sebagai gantinya, Anda harus membuatnya secara manual seperti yang InsertProduct kami lakukan dengan metode sebelumnya dalam tutorial ini. Selain itu, Anda harus memberikan InsertCommandnilai properti , , UpdateCommanddan DeleteCommand secara manual jika Anda ingin menggunakan pola pembaruan batch.

Menambahkan TableAdapters yang Tersisa

Hingga saat ini, kita hanya melihat bekerja dengan satu TableAdapter untuk satu tabel database. Namun, database Northwind berisi beberapa tabel terkait yang perlu kita kerjakan di aplikasi web kita. Himpunan Data Yang Dititik dapat berisi beberapa DataTable terkait. Oleh karena itu, untuk menyelesaikan DAL, kita perlu menambahkan DataTables untuk tabel lain yang akan kita gunakan dalam tutorial ini. Untuk menambahkan TableAdapter baru ke Himpunan Data Yang Ditik, buka Perancang Himpunan Data, klik kanan di Perancang, dan pilih Tambahkan /TableAdapter. Ini akan membuat DataTable dan TableAdapter baru dan memandu Anda melalui wizard yang kami periksa sebelumnya dalam tutorial ini.

Luangkan beberapa menit untuk membuat TableAdapters dan metode berikut menggunakan kueri berikut. Perhatikan bahwa kueri dalam ProductsTableAdapter menyertakan subkueri untuk mengambil setiap kategori produk dan nama pemasok. Selain itu, jika Anda telah mengikuti, Anda telah menambahkan ProductsTableAdapter kelas GetProducts() dan GetProductsByCategoryID(categoryID) metode.

  • ProdukAdaptor Tabel

    • Dapatkan Produk:

      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
      
    • GetProductsByCategoryID:

      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
      WHERE      CategoryID = @CategoryID
      
    • DapatkanProdukOlehID Pemasok:

      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
      WHERE SupplierID = @SupplierID
      
    • DapatkanProdukOlehProdukID:

      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
      WHERE ProductID = @ProductID
      
  • KategoriAdaptor Tabel

    • GetCategories:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • PemasokAdaptor Tabel

    • Dapatkan Pemasok:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      
    • DapatkanPemasokMenurut Negara:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE Country = @Country
      
    • DapatkanSupplierOlehID Pemasok:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE SupplierID = @SupplierID
      
  • KaryawanAdaptor Meja

    • Dapatkan Karyawan:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • DapatkanKaryawanBerdasarkanManajer:

      SELECT     EmployeeID, LastName, FirstName, Title, 
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE ReportsTo = @ManagerID
      
    • GetEmployeeByEmployeeID:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE EmployeeID = @EmployeeID
      

Perancang Himpunan Data Setelah Empat TableAdapters Ditambahkan

Gambar 31: Perancang Himpunan Data Setelah Empat TableAdapters Ditambahkan (Klik untuk melihat gambar ukuran penuh)

Menambahkan Kode Kustom ke DAL

TableAdapters dan DataTables yang ditambahkan ke Typed DataSet dinyatakan sebagai file Definisi Skema XML (Northwind.xsd). Anda dapat melihat informasi skema ini dengan mengklik Northwind.xsd kanan file di Penjelajah Solusi dan memilih Tampilkan Kode.

File Definisi Skema XML (XSD) untuk Himpunan Data Yang Diketik Northwinds

Gambar 32: File Definisi Skema XML (XSD) untuk Himpunan Data Yang Diketik Northwinds (Klik untuk melihat gambar ukuran penuh)

Informasi skema ini diterjemahkan ke dalam kode C# atau Visual Basic pada waktu desain saat dikompilasi atau pada runtime (jika diperlukan), di mana Anda dapat menelusurinya dengan debugger. Untuk melihat kode yang dibuat secara otomatis ini, buka Tampilan Kelas dan telusuri paling detail ke kelas TableAdapter atau Typed DataSet. Jika Anda tidak melihat Tampilan Kelas di layar Anda, buka menu Tampilan dan pilih dari sana, atau tekan Ctrl+Shift+C. Dari Tampilan Kelas, Anda dapat melihat properti, metode, dan peristiwa kelas Typed DataSet dan TableAdapter. Untuk melihat kode untuk metode tertentu, klik dua kali nama metode di Tampilan Kelas atau klik kanan padanya dan pilih Buka Definisi.

Periksa Kode yang Dibuat Secara Otomatis dengan Memilih Buka Definisi dari Tampilan Kelas

Gambar 33: Periksa Kode yang Dihasilkan Otomatis dengan Memilih Buka Definisi dari Tampilan Kelas

Meskipun kode yang dihasilkan secara otomatis dapat menjadi penghemat waktu yang tepat, kode sering kali sangat umum dan perlu disesuaikan untuk memenuhi kebutuhan unik aplikasi. Namun, risiko perluasan kode yang dihasilkan secara otomatis adalah bahwa alat yang menghasilkan kode mungkin memutuskan saatnya untuk "meregenerasi" dan menimpa kustomisasi Anda. Dengan konsep kelas parsial baru .NET 2.0, mudah untuk membagi kelas di beberapa file. Ini memungkinkan kita untuk menambahkan metode, properti, dan peristiwa kita sendiri ke kelas yang dihasilkan secara otomatis tanpa harus khawatir tentang Visual Studio menimpa penyesuaian kita.

Untuk menunjukkan cara menyesuaikan DAL, mari kita tambahkan GetProducts() metode ke SuppliersRow kelas . Kelas SuppliersRow mewakili satu rekaman dalam Suppliers tabel; setiap pemasok dapat menyediakan nol untuk banyak produk, jadi GetProducts() akan mengembalikan produk pemasok yang ditentukan. Untuk mencapai hal ini, buat file kelas baru di App_Code folder bernama SuppliersRow.vb dan tambahkan kode berikut:

Imports NorthwindTableAdapters
Partial Public Class Northwind
    Partial Public Class SuppliersRow
        Public Function GetProducts() As Northwind.ProductsDataTable
            Dim productsAdapter As New ProductsTableAdapter
            Return productsAdapter.GetProductsBySupplierID(Me.SupplierID)
        End Function
    End Class
End Class

Kelas parsial ini menginstruksikan pengkompilasi yang ketika membangun Northwind.SuppliersRow kelas untuk menyertakan metode yang GetProducts() baru saja kita tentukan. Jika Anda membuat proyek lalu kembali ke Tampilan Kelas, Anda akan melihat GetProducts() sekarang terdaftar sebagai metode .Northwind.SuppliersRow

Metode GetProducts() Sekarang Menjadi Bagian dari Kelas Northwind.SuppliersRow

Gambar 34: GetProducts() Metode Sekarang Bagian dari Northwind.SuppliersRow Kelas

Metode ini GetProducts() sekarang dapat digunakan untuk menghitung sekumpulan produk untuk pemasok tertentu, seperti yang ditunjukkan oleh kode berikut:

Dim suppliersAdapter As New NorthwindTableAdapters.SuppliersTableAdapter()
Dim suppliers As Northwind.SuppliersDataTable = suppliersAdapter.GetSuppliers()
For Each supplier As Northwind.SuppliersRow In suppliers
    Response.Write("Supplier: " & supplier.CompanyName)
    Response.Write("<ul>")
    Dim products As Northwind.ProductsDataTable = supplier.GetProducts()
    For Each product As Northwind.ProductsRow In products
        Response.Write("<li>" & product.ProductName & "</li>")
    Next
    Response.Write("</ul><p> </p>")
Next

Data ini juga dapat ditampilkan di salah satu ASP. Kontrol Web data NET. Halaman berikut menggunakan kontrol GridView dengan dua bidang:

  • BoundField yang menampilkan nama setiap pemasok, dan
  • TemplateField yang berisi kontrol BulletedList yang terikat ke hasil yang dikembalikan oleh GetProducts() metode untuk setiap pemasok.

Kami akan memeriksa cara menampilkan laporan detail master tersebut dalam tutorial mendatang. Untuk saat ini, contoh ini dirancang untuk mengilustrasikan menggunakan metode kustom yang ditambahkan ke Northwind.SuppliersRow kelas .

SuppliersAndProducts.aspx

<%@ Page Language="VB" CodeFile="SuppliersAndProducts.aspx.vb"
    AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Suppliers and Their Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             AutoGenerateColumns="False"
             CssClass="DataWebControlStyle">
                <HeaderStyle CssClass="HeaderStyle" />
                <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                <Columns>
                    <asp:BoundField DataField="CompanyName"
                      HeaderText="Supplier" />
                    <asp:TemplateField HeaderText="Products">
                        <ItemTemplate>
                            <asp:BulletedList ID="BulletedList1"
                             runat="server" DataSource="<%# CType(CType(Container.DataItem, System.Data.DataRowView).Row, Northwind.SuppliersRow).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class SuppliersAndProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim suppliersAdapter As New SuppliersTableAdapter
        GridView1.DataSource = suppliersAdapter.GetSuppliers()
        GridView1.DataBind()
    End Sub
End Class

Nama Perusahaan Pemasok Tercantum di Kolom Kiri, Produk Mereka di Sebelah Kanan

Gambar 35: Nama Perusahaan Pemasok Tercantum di Kolom Kiri, Produk Mereka di Sebelah Kanan (Klik untuk melihat gambar ukuran penuh)

Ringkasan

Saat membuat aplikasi web yang membuat DAL harus menjadi salah satu langkah pertama Anda, terjadi sebelum Anda mulai membuat lapisan presentasi Anda. Dengan Visual Studio, membuat DAL berdasarkan Typed DataSets adalah tugas yang dapat dicapai dalam 10-15 menit tanpa menulis baris kode. Tutorial yang bergerak maju akan dibangun berdasarkan DAL ini. Dalam tutorial berikutnya kita akan menentukan sejumlah aturan bisnis dan melihat cara mengimplementasikannya di Lapisan Logika Bisnis terpisah.

Selamat Pemrograman!

Bacaan lebih lanjut

Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:

Pelatihan Video tentang Topik yang Terkandung dalam Tutorial ini

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.

Terima kasih khusus untuk

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez, dan Carlos Santos. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.