Bagikan melalui


Menambahkan Kolom DataTable Tambahan (VB)

oleh Scott Mitchell

Unduh PDF

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: MenambahkanPriceQuartileKolom 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 dari Products 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.

Menambahkan Kolom Baru ke ProductsDataTable

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.

Atur Nama dan Properti DataType Kolom Baru

Gambar 2: Atur Kolom Baru dan NameDataType 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: MembuatGetProductsWithPriceQuartileMetode

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.

Instruksikan Panduan TableAdapter untuk Membuat Prosedur Tersimpan Untuk Kami

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.

Kueri Kami akan menjadi Pernyataan SELECT yang Mengembalikan Beberapa Baris

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.

Beri nama Products_SelectWithPriceQuartile Prosedur Tersimpan

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.

Beri Nama Metode TableAdapter s dan Klik Selesai

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.

Verifikasi bahwa Metode Baru Telah Ditambahkan ke TableAdapter

Gambar 7: Verifikasi bahwa Metode Baru Telah Ditambahkan ke TableAdapter

Pastikan Database Berisi Prosedur Tersimpan Products_SelectWithPriceQuartile

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

Mengonfigurasi ObjectDataSource untuk Menggunakan Kelas ProductsBLLWithSprocs

Gambar 9: Konfigurasikan ObjectDataSource untuk Menggunakan ProductsBLLWithSprocs Kelas (Klik untuk melihat gambar ukuran penuh)

Mengambil Informasi Produk dari Metode GetProductsWithPriceQuartile

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

Produk dipesan berdasarkan Harganya

Gambar 11: Produk dipesan berdasarkan Harganya (Klik untuk melihat gambar ukuran penuh)

Produk dipesan berdasarkan Nama mereka

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.