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 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.
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_Data
Folder
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.
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
, , INSERT
UPDATE
, 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.
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 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.
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.
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 Products
tabel:
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 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.
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.
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: 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
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.
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.
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).
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
.
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 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.
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
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 INSERT
perintah , , 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 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.
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
Update()
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 , , INSERT
dan UPDATE
mereka DELETE
ke database. Anda dapat memeriksa dan memodifikasi InsertCommand
properti , 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.)
Gambar 23: TableAdapter memiliki InsertCommand
Properti , , UpdateCommand
dan 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.
Gambar 24: Mengonfigurasi INSERT
Pernyataan , 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 ProductID
yang baru ditambahkan. Oleh karena itu, pilih untuk membuat INSERT
kueri.
Gambar 25: Buat Metode untuk Menambahkan Baris Baru ke Products
Tabel (Klik untuk melihat gambar ukuran penuh)
Pada layar InsertCommand
berikutnya, 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.
Gambar 26: Menambah Kueri untuk Mengembalikan SCOPE_IDENTITY()
Nilai (Klik untuk melihat gambar ukuran penuh)
Terakhir, beri nama metode InsertProduct
baru .
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
.
Gambar 28: Ubah Properti menjadi ExecuteMode
Scalar
(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
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
.
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 InsertCommand
nilai properti , , 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 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
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.
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 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
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
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 TableAdapters dan DataTable yang Sangat Ditik di VS 2005 dan ASP.NET 2.0
- Merancang Komponen Tingkat Data dan Meneruskan Data Melalui Tingkatan
- Mengenkripsi Informasi Konfigurasi di Aplikasi ASP.NET 2.0
- Gambaran Umum TableAdapter
- Bekerja dengan Himpunan Data Yang Dititik
- Menggunakan Akses Data dengan Tipe Kuat 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.