Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
Saat menggunakan Panduan TableAdapter untuk membuat Himpunan Data Yang Diketik, DataTable terkait berisi kolom yang dikembalikan oleh kueri database utama. Tetapi ada saat-saat ketika DataTable perlu menyertakan kolom tambahan. Dalam tutorial ini kita mempelajari mengapa prosedur tersimpan direkomendasikan ketika kita memerlukan kolom DataTable tambahan.
Pendahuluan
Saat menambahkan TableAdapter ke Himpunan Data Yang Diketik, skema DataTable terkait ditentukan oleh kueri utama TableAdapter. Misalnya, jika kueri utama mengembalikan bidang data A, B, dan C, DataTable akan memiliki tiga kolom terkait bernama A, B, dan C. Selain kueri utamanya, TableAdapter dapat menyertakan kueri tambahan yang mengembalikan, mungkin, subset data berdasarkan beberapa parameter. Misalnya, selain ProductsTableAdapter
kueri utama, yang mengembalikan informasi tentang semua produk, itu juga berisi metode seperti GetProductsByCategoryID(categoryID)
dan GetProductByProductID(productID)
, yang mengembalikan informasi produk tertentu berdasarkan parameter yang disediakan.
Model skema DataTable yang mencerminkan kueri utama TableAdapter bekerja dengan baik, jika semua metode TableAdapter mengembalikan bidang data yang sama atau lebih sedikit dari yang ditentukan dalam kueri utama. Jika metode TableAdapter perlu mengembalikan bidang data tambahan, maka kita harus memperluas skema DataTable yang sesuai. Dalam tutorial Master/Detail Menggunakan Daftar Berpoin Rekaman Master dengan Detail DataList, kami menambahkan metode ke CategoriesTableAdapter
yang mengembalikan bidang data CategoryID
, CategoryName
, dan Description
yang ditentukan dalam kueri utama ditambah NumberOfProducts
, bidang data tambahan yang melaporkan jumlah produk yang terkait dengan setiap kategori. Kami menambahkan kolom baru secara manual ke CategoriesDataTable
untuk mengambil NumberOfProducts
nilai bidang data dari metode baru ini.
Seperti yang dibahas dalam tutorial Mengunggah File, Anda perlu berhati-hati dengan TableAdapters yang menggunakan pernyataan SQL sementara dan memiliki metode dengan bidang data yang tidak sepenuhnya sesuai dengan kueri utama. Jika wizard Konfigurasi TableAdapter dijalankan kembali, wizard tersebut akan memperbarui semua metode TableAdapter s sehingga daftar bidang datanya cocok dengan kueri utama. Akibatnya, metode apa pun dengan daftar kolom yang dikustomisasi akan kembali ke daftar kolom kueri utama dan tidak mengembalikan data yang diharapkan. Masalah ini tidak muncul saat menggunakan prosedur tersimpan.
Dalam tutorial ini kita akan melihat cara memperluas skema DataTable untuk menyertakan kolom tambahan. Karena rapuhnya TableAdapter saat menggunakan pernyataan SQL ad-hoc, dalam tutorial ini kita akan menggunakan prosedur tersimpan. Lihat tutorial Membuat Prosedur Tersimpan Baru untuk TableAdapters di Typed DataSet dan Menggunakan Prosedur Tersimpan yang Ada untuk TableAdapters di Typed DataSet untuk informasi selengkapnya tentang mengonfigurasi TableAdapter untuk menggunakan prosedur tersimpan.
Langkah 1: MenambahkanPriceQuartile
Kolom keProductsDataTable
Dalam tutorial Membuat Prosedur Tersimpan Baru untuk TableAdapters s TableAdapters Typed DataSet , kami membuat Typed DataSet bernama NorthwindWithSprocs
. Himpunan Data ini saat ini berisi dua DataTables: ProductsDataTable
dan EmployeesDataTable
.
ProductsTableAdapter
memiliki tiga metode berikut:
-
GetProducts
- kueri utama, yang mengembalikan semua rekaman dariProducts
tabel -
GetProductsByCategoryID(categoryID)
- mengembalikan semua produk dengan categoryID yang ditentukan. -
GetProductByProductID(productID)
- mengembalikan produk tertentu dengan productID yang ditentukan.
Kueri utama dan dua metode tambahan semuanya mengembalikan kumpulan bidang data yang sama, yaitu semua kolom dari Products
tabel. Tidak ada subkueri yang berkorelasi atau JOIN
yang menarik data terkait dari tabel Categories
atau Suppliers
. Oleh karena itu, ProductsDataTable
memiliki kolom yang sesuai untuk setiap bidang dalam Products
tabel.
Untuk tutorial ini, mari kita tambahkan metode ke ProductsTableAdapter
yang bernama GetProductsWithPriceQuartile
yang mengembalikan semua produk. Selain bidang data produk standar, GetProductsWithPriceQuartile
juga akan menyertakan PriceQuartile
bidang data yang menunjukkan di kuartil mana harga produk berada. Misalnya, produk-produk yang harganya paling mahal 25% akan memiliki PriceQuartile
nilai 1, sedangkan yang harganya turun di 25 bawah% akan memiliki nilai 4. Sebelum kita khawatir tentang membuat prosedur tersimpan untuk mengembalikan informasi ini, pertama-tama kita perlu memperbarui ProductsDataTable
untuk menyertakan kolom yang menyimpan hasil PriceQuartile
ketika GetProductsWithPriceQuartile
metode digunakan.
Buka Himpunan NorthwindWithSprocs
Data dan klik kanan pada ProductsDataTable
. Pilih Tambahkan dari menu konteks lalu pilih Kolom.
Gambar 1: Tambahkan Kolom Baru ke ProductsDataTable
(Klik untuk melihat gambar ukuran penuh)
Ini akan menambahkan kolom baru ke DataTable bernama Kolom1 tipe System.String
. Kita perlu memperbarui nama kolom ini ke PriceQuartile dan jenisnya ke System.Int32
karena akan digunakan untuk menyimpan angka antara 1 dan 4. Pilih kolom yang baru ditambahkan di ProductsDataTable
dan, dari jendela Properti, atur Name
properti ke PriceQuartile dan DataType
properti ke System.Int32
.
Gambar 2: Atur Kolom Baru dan Name
DataType
Properti (Klik untuk melihat gambar ukuran penuh)
Seperti yang ditunjukkan Gambar 2, ada properti tambahan yang dapat diatur, seperti apakah nilai dalam kolom harus unik, jika kolom adalah kolom peningkatan otomatis, apakah nilai database NULL
diizinkan atau tidak, dan sebagainya. Biarkan nilai-nilai ini diatur ke defaultnya.
Langkah 2: MembuatGetProductsWithPriceQuartile
Metode
Sekarang, setelah ProductsDataTable
diperbarui untuk menyertakan kolom PriceQuartile
, kami siap untuk membuat metode GetProductsWithPriceQuartile
. Mulailah dengan mengklik kanan tableAdapter dan memilih Tambahkan Kueri dari menu konteks. Ini memunculkan pendukung konfigurasi kueri TableAdapter, yang pertama menanyakan kepada kami apakah kami ingin menggunakan pernyataan SQL ad-hoc, atau prosedur tersimpan baru maupun yang sudah ada. Karena kita belum memiliki prosedur tersimpan yang mengembalikan data kuartil harga, mari kita izinkan TableAdapter untuk membuat prosedur tersimpan ini untuk kita. Pilih opsi Buat prosedur tersimpan baru dan klik Berikutnya.
Gambar 3: Instruksikan Panduan TableAdapter untuk Membuat Prosedur Tersimpan Untuk Kami (Klik untuk melihat gambar ukuran penuh)
Di layar berikutnya, wizard menanyakan jenis kueri apa yang akan ditambahkan, seperti diperlihatkan di Gambar 4.
GetProductsWithPriceQuartile
Karena metode akan mengembalikan semua kolom dan rekaman dari Products
tabel, pilih opsi SELECT yang mengembalikan baris dan klik Berikutnya.
Gambar 4: Kueri Kami akan menjadi SELECT
Pernyataan yang Mengembalikan Beberapa Baris (Klik untuk melihat gambar ukuran penuh)
Selanjutnya kita diberi arahan untuk SELECT
pertanyaan. Masukkan kueri berikut ke dalam wizard:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartile
FROM Products
Kueri di atas menggunakan fungsi baru NTILE
SQL Server 2005 untuk membagi hasil menjadi empat grup di mana grup ditentukan oleh UnitPrice
nilai yang diurutkan dalam urutan turun.
Sayangnya, Pembangun Kueri tidak tahu cara mengurai OVER
kata kunci dan akan menampilkan kesalahan saat mengurai kueri di atas. Oleh karena itu, masukkan kueri di atas langsung di kotak teks dalam wizard tanpa menggunakan Pembangun Kueri.
Nota
Untuk informasi selengkapnya tentang fungsi peringkat NTILE dan SQL Server 2005 lainnya, lihat ROW_NUMBER (Transact-SQL) dan bagian Fungsi Peringkat dari Buku SQL Server 2005 Online.
Setelah memasukkan SELECT
kueri dan mengklik Berikutnya, wizard menginstruksikan kami untuk memberikan nama untuk prosedur tersimpan yang akan dibuatnya. Beri nama prosedur Products_SelectWithPriceQuartile
tersimpan baru dan klik Berikutnya.
Gambar 5: Beri nama Prosedur Products_SelectWithPriceQuartile
Tersimpan (Klik untuk melihat gambar ukuran penuh)
Terakhir, kita diminta untuk memberi nama metode TableAdapter. Biarkan kedua kotak centang Isi DataTable dan Kembalikan DataTable tetap dicentang, lalu beri nama metode FillWithPriceQuartile
dan GetProductsWithPriceQuartile
.
Gambar 6: Beri Nama Metode TableAdapter s dan Klik Selesai (Klik untuk melihat gambar ukuran penuh)
Dengan kueri yang ditentukan, serta prosedur tersimpan dan metode TableAdapter yang sudah diberi nama, klik Selesai untuk menyelesaikan wizard. Pada titik ini Anda mungkin mendapatkan peringatan atau dua dari wizard yang mengatakan bahwa OVER
konstruksi atau pernyataan SQL tidak didukung. Peringatan ini dapat diabaikan.
Setelah menyelesaikan wizard, TableAdapter harus menyertakan metode FillWithPriceQuartile
dan GetProductsWithPriceQuartile
, dan database harus memiliki prosedur tersimpan yang bernama Products_SelectWithPriceQuartile
. Luangkan waktu sejenak untuk memverifikasi bahwa TableAdapter memang berisi metode baru ini dan bahwa prosedur tersimpan telah ditambahkan dengan benar ke database. Saat memeriksa database, jika Anda tidak melihat prosedur tersimpan coba klik kanan pada folder Prosedur Tersimpan dan pilih Refresh.
Gambar 7: Verifikasi bahwa Metode Baru Telah Ditambahkan ke TableAdapter
Gambar 8: Pastikan Bahwa Database Berisi Prosedur Tersimpan Products_SelectWithPriceQuartile
(Klik untuk melihat gambar ukuran penuh)
Nota
Salah satu manfaat menggunakan prosedur tersimpan alih-alih pernyataan SQL ad-hoc adalah bahwa menjalankan kembali wizard Konfigurasi TableAdapter tidak akan mengubah daftar kolom prosedur tersimpan. Verifikasi ini dengan mengklik kanan tableAdapter, memilih opsi Konfigurasikan dari menu konteks untuk memulai wizard, lalu klik Selesai untuk menyelesaikannya. Selanjutnya, buka database dan lihat prosedur tersimpan Products_SelectWithPriceQuartile
. Perhatikan bahwa daftar kolomnya belum dimodifikasi. Jika kami menggunakan pernyataan SQL ad-hoc, menjalankan ulang wizard Konfigurasi TableAdapter akan mengembalikan daftar kolom kueri ini agar sesuai dengan daftar kolom kueri utama, sehingga menghapus pernyataan NTILE dari kueri yang digunakan oleh metode GetProductsWithPriceQuartile
tersebut.
Saat metode Lapisan GetProductsWithPriceQuartile
Akses Data dipanggil, prosedur tersimpan Products_SelectWithPriceQuartile
dijalankan oleh TableAdapter dan menambahkan baris ke ProductsDataTable
untuk setiap rekaman yang dikembalikan. Bidang data yang dikembalikan oleh prosedur tersimpan dipetakan ke kolom-kolom ProductsDataTable
. Karena ada PriceQuartile
bidang data yang dikembalikan dari prosedur tersimpan, nilainya ditetapkan ke kolom ProductsDataTable
s PriceQuartile
.
Untuk metode TableAdapter yang kuerinya tidak mengembalikan PriceQuartile
bidang data, PriceQuartile
nilai kolom s adalah nilai yang ditentukan oleh propertinya DefaultValue
. Seperti yang ditunjukkan Gambar 2, nilai ini diatur ke DBNull
, default. Jika Anda lebih suka nilai default yang berbeda, cukup atur properti yang DefaultValue
sesuai. Pastikan bahwa nilai DefaultValue
valid dengan kolom DataType
(yaitu, System.Int32
untuk kolom PriceQuartile
).
Pada titik ini kami telah melakukan langkah-langkah yang diperlukan untuk menambahkan kolom tambahan ke DataTable. Untuk memverifikasi bahwa kolom tambahan ini berfungsi seperti yang diharapkan, mari kita buat halaman ASP.NET yang menampilkan setiap nama produk, harga, dan kuartil harga. Namun, sebelum kita melakukannya, pertama-tama kita perlu memperbarui Lapisan Logika Bisnis untuk menyertakan metode yang memanggil ke metode DAL s GetProductsWithPriceQuartile
. Kami akan memperbarui BLL berikutnya, di Langkah 3, lalu membuat halaman ASP.NET di Langkah 4.
Langkah 3: Menambah Lapisan Logika Bisnis
Sebelum kita menggunakan metode baru GetProductsWithPriceQuartile
dari Lapisan Presentasi, kita harus terlebih dahulu menambahkan metode yang sesuai ke BLL.
ProductsBLLWithSprocs
Buka file kelas dan tambahkan kode berikut:
<System.ComponentModel.DataObjectMethodAttribute_
(System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsWithPriceQuartile() As NorthwindWithSprocs.ProductsDataTable
Return Adapter.GetProductsWithPriceQuartile()
End Function
Seperti metode pengambilan data lainnya di ProductsBLLWithSprocs
, GetProductsWithPriceQuartile
metode ini hanya memanggil metode terkait GetProductsWithPriceQuartile
DAL dan mengembalikan hasilnya.
Langkah 4: Menampilkan Informasi Kuartil Harga di Halaman Web ASP.NET
Dengan penambahan BLL selesai, kami siap untuk membuat halaman ASP.NET yang menunjukkan kuartil harga untuk setiap produk. Buka halaman AddingColumns.aspx
di folder AdvancedDAL
, lalu seret GridView dari Kotak Alat ke Perancang dan atur propertinya ID
ke Products
. Dari tag pintar GridView, ikat ke ObjectDataSource baru bernama ProductsDataSource
. Konfigurasikan ObjectDataSource untuk menggunakan ProductsBLLWithSprocs
metode kelas s GetProductsWithPriceQuartile
. Karena ini akan menjadi tabel hanya baca, atur daftar drop-down di tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak ada).
Gambar 9: Konfigurasikan ObjectDataSource untuk Menggunakan ProductsBLLWithSprocs
Kelas (Klik untuk melihat gambar ukuran penuh)
Gambar 10: Ambil Informasi Produk dari GetProductsWithPriceQuartile
Metode (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio akan secara otomatis menambahkan BoundField atau CheckBoxField ke GridView untuk setiap bidang data yang dikembalikan oleh metode . Salah satu bidang data ini adalah PriceQuartile
, yang merupakan kolom yang kami tambahkan ke ProductsDataTable
di Langkah 1.
Edit bidang pada GridView, hapus semua kecuali ProductName
, UnitPrice
, dan PriceQuartile
BoundFields. Konfigurasikan UnitPrice
BoundField untuk memformat nilainya sebagai mata uang dan menjadikan UnitPrice
BoundField rata kanan serta PriceQuartile
BoundField rata tengah. Terakhir, perbarui properti BoundFields HeaderText
yang tersisa menjadi Produk, Harga, dan Kuartil Harga. Selain itu, centang kotak Aktifkan Pengurutan dari tag pintar GridView.
Setelah modifikasi ini, markup deklaratif GridView dan ObjectDataSource akan terlihat seperti berikut ini:
<asp:GridView ID="Products" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSource">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price" HtmlEncode="False"
SortExpression="UnitPrice">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="PriceQuartile" HeaderText="Price Quartile"
SortExpression="PriceQuartile">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProductsWithPriceQuartile"
TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>
Gambar 11 memperlihatkan halaman ini saat dikunjungi melalui browser. Perhatikan bahwa, awalnya, produk dipesan berdasarkan harganya dalam urutan turun dengan setiap produk diberi nilai yang sesuai PriceQuartile
. Tentu saja data ini dapat diurutkan berdasarkan kriteria lain dengan nilai kolom Kuartil Harga masih mencerminkan peringkat produk sehubungan dengan harga (lihat Gambar 12).
Gambar 11: Produk dipesan berdasarkan Harganya (Klik untuk melihat gambar ukuran penuh)
Gambar 12: Produk diurutkan berdasarkan Nama mereka (Klik untuk melihat gambar ukuran penuh)
Nota
Dengan beberapa baris kode, kita dapat menambah GridView sehingga mewarnai baris produk berdasarkan nilainya PriceQuartile
. Kita mungkin mewarnai produk-produk tersebut di kuartil pertama hijau muda, yang di kuartil kedua kuning muda, dan sebagainya. Saya mendorong Anda untuk meluangkan waktu sejenak untuk menambahkan fungsionalitas ini. Jika Anda memerlukan penyegaran tentang pemformatan GridView, lihat tutorial Pemformatan Kustom Berdasarkan Data .
Pendekatan Alternatif - Membuat TableAdapter lain
Seperti yang kita lihat dalam tutorial ini, saat menambahkan metode ke TableAdapter yang mengembalikan bidang data selain yang dieja oleh kueri utama, kita dapat menambahkan kolom yang sesuai ke DataTable. Namun, pendekatan seperti itu berfungsi dengan baik hanya jika ada sejumlah kecil metode di TableAdapter yang mengembalikan bidang data yang berbeda dan jika bidang data alternatif tersebut tidak terlalu bervariasi dari kueri utama.
Daripada menambahkan kolom ke DataTable, Anda dapat menambahkan TableAdapter lain ke Himpunan Data yang berisi metode dari TableAdapter pertama yang mengembalikan bidang data yang berbeda. Untuk tutorial ini, daripada menambahkan kolom PriceQuartile
ke ProductsDataTable
(di mana kolom hanya digunakan oleh metode GetProductsWithPriceQuartile
), kita bisa menambahkan TableAdapter tambahan ke DataSet bernama ProductsWithPriceQuartileTableAdapter
yang menggunakan prosedur yang disimpan Products_SelectWithPriceQuartile
sebagai kueri utamanya. Halaman ASP.NET yang perlu mendapatkan informasi produk dengan kuartil harga akan menggunakan ProductsWithPriceQuartileTableAdapter
, sementara yang tidak memerlukannya dapat terus menggunakan ProductsTableAdapter
.
Dengan menambahkan TableAdapter baru, DataTable tetap bersih dan kolomnya dengan tepat mencerminkan bidang data yang dikembalikan oleh metode-metode TableAdapter-nya. Namun, TableAdapters tambahan dapat memperkenalkan tugas dan fungsionalitas berulang. Misalnya, jika halaman ASP.NET yang menampilkan kolom PriceQuartile
juga perlu menyediakan dukungan sisipkan, perbarui, dan hapus, maka properti ProductsWithPriceQuartileTableAdapter
, InsertCommand
, dan UpdateCommand
pada DeleteCommand
harus dikonfigurasi dengan benar. Meskipun properti ini akan mencerminkan ProductsTableAdapter
s, konfigurasi ini memperkenalkan langkah tambahan. Selain itu, sekarang ada dua cara untuk memperbarui, menghapus, atau menambahkan produk ke database - melalui ProductsTableAdapter
kelas dan ProductsWithPriceQuartileTableAdapter
.
Unduhan untuk tutorial ini mencakup kelas ProductsWithPriceQuartileTableAdapter
dalam kumpulan data NorthwindWithSprocs
yang mengilustrasikan pendekatan alternatif ini.
Ringkasan
Dalam kebanyakan skenario, semua metode dalam TableAdapter akan mengembalikan kumpulan bidang data yang sama, tetapi ada kalanya metode tertentu atau dua mungkin perlu mengembalikan bidang tambahan. Misalnya, dalam tutorial Master/Detail Menggunakan Daftar Poin untuk Catatan Master dengan DataList Detil, kami menambahkan metode ke CategoriesTableAdapter
yang, selain kolom data kueri utama, mengembalikan kolom NumberOfProducts
yang melaporkan jumlah produk yang terkait dengan setiap kategori. Dalam tutorial ini kami melihat penambahan metode pada ProductsTableAdapter
yang mengembalikan bidang PriceQuartile
selain bidang data dari kueri utama. Untuk mengambil bidang data tambahan yang dikembalikan oleh metode TableAdapter s, kita perlu menambahkan kolom yang sesuai ke DataTable.
Jika Anda berencana menambahkan kolom secara manual ke DataTable, disarankan agar TableAdapter menggunakan prosedur tersimpan. Jika TableAdapter menggunakan pernyataan SQL ad-hoc, setiap kali wizard Konfigurasi TableAdapter dijalankan, semua daftar bidang data metode akan kembali ke bidang data yang dikembalikan oleh kueri utama. Masalah ini tidak meluas ke prosedur tersimpan, itulah sebabnya mereka direkomendasikan dan digunakan dalam tutorial ini.
Selamat Pemrograman!
Tentang Penulis
Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.
Ucapan terima kasih khusus kepada
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Randy Schmidt, Jacky Goor, Bernadette Leigh, dan Hilton Giesenow. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.