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
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 direktori App_Data . Selain file database, folder App_Data 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 pengaturan NORTHWNDConnectionString dalam file Web.config aplikasi. 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 C#.
Gambar 1: Buat File Baru System-Based Situs Web (Klik untuk melihat gambar ukuran penuh)
Ini akan membuat situs web baru dengan halaman ASP.NET Default.aspx dan folder App_Data .
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 folder App_Data atau jika Anda memiliki penyetelan server database Microsoft SQL Server 2000 atau 2005 yang ingin Anda gunakan sebagai gantinya.
Menggunakan Database di Folder App_Data
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 App_Data situs web yang diunduh (NORTHWND. MDF).
Database yang ditempatkan di folder App_Data 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 direktori App_Data . 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.
Gambar 2: Tambahkan Koneksi ke Database Northwind di 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 perintah SELECT, INSERT, UPDATE, dan DELETE , 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 tabel Produk dan Kategori 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 dapat mengembalikan DataSet atau DataReader yang diisi oleh kueri database, tetapi idealnya hasil ini harus dikembalikan menggunakan objek bertipe kuat. 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 diketik, di sisi lainnya, akan memiliki setiap kolomnya yang diimplementasikan sebagai properti, menghasilkan kode yang terlihat seperti: DataTable. Rows[indeks].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.
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.
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 folder App_Code , 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 tabel Produk .
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 Produk kami, 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.
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 file Web.config . 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, string tersebut ditempatkan di <bagian connectionStrings> , yang dapat dienkripsi 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.
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.
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 tabel Produk :
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.
Gambar 9: Buat Kueri Secara Grafis, melalui Editor Kueri (Klik untuk menampilkan 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.
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 metode Fill().
- Mengembalikan DataTable, pendekatan ini memungkinkan metode untuk membuat dan mengisi DataTable bagi Anda, kemudian mengembalikannya sebagai nilai pengembalian dari metode tersebut.
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 GetData yang agak generik menjadi GetProducts.
Jika dicentang, kotak centang akhir, "GenerateDBDirectMethods," membuat metode Insert(), Update(), dan Delete() untuk TableAdapter. Jika Anda membiarkan opsi ini tidak dicentang, semua pembaruan perlu dilakukan melalui metode Pembaruan() tunggal 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.
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()).
Gambar 12: Products DataTable dan ProductsTableAdapter telah Ditambahkan ke Typed DataSet (Klik untuk melihat gambar ukuran penuh)
Pada titik ini, kami memiliki DataSet bertipe dengan satu DataTable (Northwind.Products) dan kelas DataAdapter bertipe kuat (NorthwindTableAdapters.ProductsTableAdapter) dengan metode GetProducts(). Objek ini dapat digunakan untuk mengakses daftar semua produk dari kode seperti:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
Response.Write("Product: " + productRow.ProductName + "<br />");
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 metode GetProducts() ke GridView hanya dalam tiga baris kode pada penanganan acara Page_Load.
AllProducts.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AllProducts.aspx.cs"
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>
<h2>
All Products</h2>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
AllProducts.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class AllProducts : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource = productsAdapter.GetProducts();
GridView1.DataBind();
}
}
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 Page_Load halaman 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 ProductsTableAdapter kami memiliki tetapi 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.
Gambar 14: Right-Click di 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 pernyataan SELECT yang mengembalikan baris.
Gambar 15: Pilih untuk Membuat Pernyataan SELECT 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 SELECT yang sama dari GetProducts(), tetapi menambahkan klausul WHERE berikut: 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).
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 (metode GetX), mari kita gunakan GetProductsByCategoryID.
Gambar 17: Pilih Nama untuk Metode TableAdapter (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard, Perancang Himpunan Data menyertakan metode TableAdapter baru.
Gambar 18: Produk Sekarang Dapat Dikueri berdasarkan Kategori
Luangkan waktu sejenak untuk menambahkan metode GetProductByProductID (productID) 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.
Gambar 19: Produk Milik Kategori Minuman ditampilkan (Klik untuk melihat gambar ukuran penuh)
Dengan metode GetProductsByCategoryID(categoryID) di 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.asp
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Beverages.aspx.cs"
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>
<h2>Beverages</h2>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
Beverages.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class Beverages : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource =
productsAdapter.GetProductsByCategoryID(1);
GridView1.DataBind();
}
}
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 perintah INSERT, UPDATE, atau 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 tabel Produk , metode penghapusan akan mengambil parameter bilangan bulat, menunjukkan ProductID rekaman yang akan dihapus, sementara metode penyisipan akan mengambil string untuk ProductName, desimal untuk UnitPrice, bilangan bulat untuk UnitsOnStock, dan sebagainya.
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.
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, ProductsTableAdapter berisi metode Update(), yang mengimplementasikan pola pembaruan batch. Secara khusus, TableAdapter berisi metode Update() yang dapat dilewatkan Typed DataSet, 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 metode Insert(), Update(), dan Delete().
Kedua pola modifikasi data menggunakan properti InsertCommand, UpdateCommand, dan DeleteCommand tableAdapter untuk mengeluarkan perintah INSERT, UPDATE, dan DELETE ke database. Anda dapat memeriksa dan memodifikasi properti InsertCommand, UpdateCommand, dan DeleteCommand dengan mengklik TableAdapter di Perancang Himpunan Data lalu masuk ke jendela Properti. (Pastikan Anda telah memilih TableAdapter, dan objek ProductsTableAdapter adalah objek yang dipilih di daftar drop-down di jendela Properti.)
Gambar 23: TableAdapter memiliki InsertCommand, UpdateCommand, dan DeleteCommand Properties (Klik untuk melihat gambar ukuran penuh)
Untuk memeriksa atau mengubah salah satu properti perintah database ini, klik subproperti CommandText , yang akan memunculkan Penyusun Kueri.
Gambar 24: Mengonfigurasi Pernyataan INSERT, 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:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// For each product, double its price if it is not discontinued and
// there are 25 items in stock or less
Northwind.ProductsDataTable products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow product in products)
if (!product.Discontinued && product.UnitsInStock <= 25)
product.UnitPrice *= 2;
// Update the products
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:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// Delete the product with ProductID 3
productsAdapter.Delete(3);
// Update Chai (ProductID of 1), setting the UnitsOnOrder to 15
productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",
18.0m, 39, 15, 10, false, 1);
// Add a new product
productsAdapter.Insert("New Product", 1, 1,
"12 tins per carton", 14.95m, 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 kolom tabel Produk mana yang dipetakan ke setiap parameter input ke metode Update() dan Insert(). Mungkin ada kalanya kita hanya ingin memperbarui satu atau dua kolom, atau menginginkan metode Insert() yang dikustomisasi yang mungkin akan mengembalikan nilai bidang IDENTITY (kenaikan otomatis) rekaman yang baru dimasukkan.
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 ProductID rekaman yang baru ditambahkan. Oleh karena itu, pilih untuk membuat kueri INSERT .
Gambar 25: Buat Metode untuk Menambahkan Baris Baru ke Tabel Produk (Klik untuk melihat gambar ukuran penuh)
Pada layar berikutnya, InsertCommand milik CommandText muncul. Tambahkan kueri ini dengan menambahkan SELECT SCOPE_IDENTITY() di akhir kueri, yang akan mengembalikan nilai identitas terakhir yang dimasukkan ke dalam kolom IDENTITY 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 pernyataan INSERT dengan titik koma sebelum menambahkan pernyataan SELECT .
Gambar 26: Menambah Kueri untuk Mengembalikan Nilai SCOPE_IDENTITY() (Klik untuk melihat gambar ukuran penuh)
Terakhir, beri nama metode baru InsertProduct.
Gambar 27: Atur Nama Metode Baru ke InsertProduct (Klik untuk melihat gambar ukuran penuh)
Saat Anda kembali ke Desainer Himpunan Data, Anda akan melihat bahwa ProductsTableAdapter berisi metode baru, InsertProduct. Jika metode baru ini tidak memiliki parameter untuk setiap kolom dalam tabel Produk , kemungkinan Anda lupa untuk mengakhiri pernyataan INSERT dengan titik koma. Konfigurasikan metode InsertProduct dan pastikan Anda memiliki titik koma yang memisahkan pernyataan INSERT dan SELECT .
Secara default, metode sisipkan mengeluarkan metode non-kueri, yang berarti bahwa metode tersebut mengembalikan jumlah baris yang terpengaruh. Namun, kami ingin metode InsertProduct mengembalikan nilai yang dikembalikan oleh kueri, bukan jumlah baris yang terpengaruh. Untuk mencapai hal ini, sesuaikan properti ExecuteMode metode InsertProduct ke Skalar.
Gambar 28: Ubah Properti ExecuteMode menjadi Skalar (Klik untuk melihat gambar ukuran penuh)
Kode berikut menunjukkan metode InsertProduct baru ini dalam tindakan:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// Add a new product
int new_productID = Convert.ToInt32(productsAdapter.InsertProduct
("New Product", 1, 1, "12 tins per carton", 14.95m, 10, 0, 10, false));
// On second thought, delete the product
productsAdapter.Delete(new_productID);
Langkah 5: Menyelesaikan Lapisan Akses Data
Perhatikan bahwa kelas ProductsTableAdapters mengembalikan nilai CategoryID dan SupplierID dari tabel Produk , tetapi tidak menyertakan kolom CategoryName dari tabel Kategori atau kolom CompanyName dari tabel Pemasok , meskipun kemungkinan ini adalah kolom yang ingin kami tampilkan saat menampilkan informasi produk. Kita dapat menambah metode awal TableAdapter, GetProducts(), untuk menyertakan nilai kolom CategoryName dan CompanyName , yang akan memperbarui DataTable yang ditik 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 klausa SELECT . Dengan berhati-hati untuk menambahkan kueri kami ke Kategori dan Pemasok sebagai subkueri, daripada JOIN , kami akan menghindari pengerjaan ulang metode tersebut untuk memodifikasi data. Klik kanan pada metode GetProducts() di ProductsTableAdapter dan pilih Konfigurasikan. Kemudian, sesuaikan klausa SELECT 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
Gambar 29: Perbarui Pernyataan SELECT untuk Metode GetProducts() (Klik untuk melihat gambar ukuran penuh)
Setelah memperbarui metode GetProducts() untuk menggunakan kueri baru ini, DataTable akan menyertakan dua kolom baru: CategoryName dan SupplierName.
Gambar 30: Produk DataTable memiliki Dua Kolom Baru
Luangkan waktu sejenak untuk memperbarui klausul SELECT dalam metode GetProductsByCategoryID(categoryID) juga.
Jika Anda memperbarui sintaks GetProducts()SELECT menggunakan sintaks 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 kami lakukan dengan metode InsertProduct sebelumnya dalam tutorial ini. Selain itu, Anda harus menyediakan nilai properti InsertCommand, UpdateCommand, dan 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 di ProductsTableAdapter menyertakan subkueri untuk mengambil setiap kategori produk dan nama pemasok. Selain itu, jika Anda telah mengikuti pembahasannya, Anda telah menambahkan metode GetProducts() dan GetProductsByCategoryID(categoryID) dari kelas ProductsTableAdapter.
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 ProductsGetProductsByCategoryID:
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 = @CategoryIDDapatkanProdukOlehID 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 = @SupplierIDDapatkanProdukOlehProdukID:
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 CategoriesGetCategoryByCategoryID:
SELECT CategoryID, CategoryName, Description FROM Categories WHERE CategoryID = @CategoryID
PemasokAdaptor Tabel
Dapatkan Pemasok:
SELECT SupplierID, CompanyName, Address, City, Country, Phone FROM SuppliersDapatkanPemasokMenurut Negara:
SELECT SupplierID, CompanyName, Address, City, Country, Phone FROM Suppliers WHERE Country = @CountryDapatkanSupplierOlehID 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 EmployeesDapatkanKaryawanBerdasarkanManajer:
SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country FROM Employees WHERE ReportsTo = @ManagerIDGetEmployeeByEmployeeID:
SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country FROM Employees WHERE EmployeeID = @EmployeeID
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 kanan pada file Northwind.xsd di Penjelajah Solusi dan memilih Tampilkan Kode.
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.
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 metode GetProducts() ke kelas SuppliersRow . Kelas SuppliersRow mewakili satu rekaman dalam tabel Pemasok ; setiap pemasok dapat menyediakan nol untuk banyak produk, sehingga GetProducts() akan mengembalikan produk-produk dari pemasok yang ditentukan. Untuk mencapai hal ini, buat file kelas baru di folder App_Code bernama SuppliersRow.cs dan tambahkan kode berikut:
using System;
using System.Data;
using NorthwindTableAdapters;
public partial class Northwind
{
public partial class SuppliersRow
{
public Northwind.ProductsDataTable GetProducts()
{
ProductsTableAdapter productsAdapter =
new ProductsTableAdapter();
return
productsAdapter.GetProductsBySupplierID(this.SupplierID);
}
}
}
Kelas parsial ini menginstruksikan pengkompilasi bahwa saat membangun kelas Northwind.SuppliersRow untuk menyertakan metode GetProducts() yang baru saja kami tentukan. Jika Anda membangun proyek lalu kembali ke Tampilan Kelas, Anda akan melihat GetProducts() yang sekarang terdaftar sebagai metode Northwind.SuppliersRow.
Gambar 34: Metode GetProducts() Sekarang Menjadi Bagian dari Kelas Northwind.SuppliersRow
Metode GetProducts() sekarang dapat digunakan untuk menghitung serangkaian produk untuk pemasok tertentu, seperti yang ditunjukkan oleh kode berikut:
NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter =
new NorthwindTableAdapters.SuppliersTableAdapter();
// Get all of the suppliers
Northwind.SuppliersDataTable suppliers =
suppliersAdapter.GetSuppliers();
// Enumerate the suppliers
foreach (Northwind.SuppliersRow supplier in suppliers)
{
Response.Write("Supplier: " + supplier.CompanyName);
Response.Write("<ul>");
// List the products for this supplier
Northwind.ProductsDataTable products = supplier.GetProducts();
foreach (Northwind.ProductsRow product in products)
Response.Write("<li>" + product.ProductName + "</li>");
Response.Write("</ul><p> </p>");
}
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 metode GetProducts() 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 kelas Northwind.SuppliersRow .
SuppliersAndProducts.aspx
<%@ Page Language="C#" CodeFile="SuppliersAndProducts.aspx.cs"
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>
<h2>
Suppliers and Their Products</h2>
<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="<%# ((Northwind.SuppliersRow) ((System.Data.DataRowView) Container.DataItem).Row).GetProducts() %>"
DataTextField="ProductName">
</asp:BulletedList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
SuppliersAndProducts.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class SuppliersAndProducts : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SuppliersTableAdapter suppliersAdapter = new
SuppliersTableAdapter();
GridView1.DataSource = suppliersAdapter.GetSuppliers();
GridView1.DataBind();
}
}
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:
- Membangun DAL menggunakan TableAdapter dan DataTable Bertipe Kuat di VS 2005 dan ASP.NET 2.0
- Merancang Komponen Lapisan Data dan Mengalirkan Data Melalui Lapisan
- Mengenkripsi Informasi Konfigurasi di Aplikasi ASP.NET 2.0
- Gambaran Umum TableAdapter
- Bekerja dengan Himpunan Data Yang Dititik
- Menggunakan Akses Data Strongly-Typed di Visual Studio 2005 dan ASP.NET 2.0
- Cara Memperluas Metode TableAdapter
Pelatihan Video tentang Topik yang Terkandung dalam Tutorial ini
- Lapisan Akses Data di Aplikasi ASP.NET
- Cara Mengikat Himpunan Data secara Manual ke Datagrid
- Cara Bekerja dengan Himpunan Data dan Filter dari Aplikasi ASP
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.