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 membuat tabel database, Microsoft SQL Server memungkinkan Anda menentukan kolom komputasi yang nilainya dihitung dari ekspresi yang biasanya mereferensikan nilai lain dalam rekaman database yang sama. Nilai tersebut bersifat baca-saja di database, yang memerlukan pertimbangan khusus saat bekerja dengan TableAdapters. Dalam tutorial ini kita mempelajari cara memenuhi tantangan yang ditimbulkan oleh kolom komputasi.
Pendahuluan
Microsoft SQL Server memungkinkan kolom komputasi, yang merupakan kolom yang nilainya dihitung dari ekspresi yang biasanya mereferensikan nilai dari kolom lain dalam tabel yang sama. Sebagai contoh, model data pelacakan waktu mungkin memiliki tabel bernama ServiceLog
dengan kolom termasuk ServicePerformed
, , EmployeeID
Rate
, dan Duration
, antara lain. Meskipun jumlah jatuh tempo per item layanan (menjadi tarif yang dikalikan dengan durasi) dapat dihitung melalui halaman web atau antarmuka terprogram lainnya, mungkin berguna untuk menyertakan kolom dalam ServiceLog
tabel bernama AmountDue
yang melaporkan informasi ini. Kolom ini dapat dibuat sebagai kolom normal, tetapi perlu diperbarui kapan Rate
saja nilai kolom atau Duration
berubah. Pendekatan yang lebih baik adalah menjadikan AmountDue
kolom sebagai kolom komputasi menggunakan ekspresi Rate * Duration
. Melakukannya akan menyebabkan SQL Server menghitung AmountDue
nilai kolom secara otomatis setiap kali dirujuk dalam kueri.
Karena nilai kolom komputasi s ditentukan oleh ekspresi, kolom tersebut bersifat baca-saja dan karenanya tidak dapat memiliki nilai yang ditetapkan untuknya dalam INSERT
pernyataan atau UPDATE
. Namun, ketika kolom komputasi adalah bagian dari kueri utama untuk TableAdapter yang menggunakan pernyataan SQL ad-hoc, kolom tersebut secara otomatis disertakan dalam pernyataan dan INSERT
yang dibuat UPDATE
secara otomatis. Akibatnya, TableAdapter s INSERT
dan UPDATE
kueri dan InsertCommand
properti UpdateCommand
harus diperbarui untuk menghapus referensi ke kolom komputasi apa pun.
Salah satu tantangan menggunakan kolom komputasi dengan TableAdapter yang menggunakan pernyataan SQL ad-hoc adalah bahwa TableAdapter s INSERT
dan UPDATE
kueri secara otomatis diregenerasi setiap kali wizard Konfigurasi TableAdapter selesai. Oleh karena itu, kolom komputasi yang dihapus secara manual dari INSERT
kueri dan UPDATE
akan muncul kembali jika wizard dijalankan kembali. Meskipun TableAdapters yang menggunakan prosedur tersimpan tidak menderita kerapahan ini, mereka memang memiliki keunikan mereka sendiri yang akan kita atasi di Langkah 3.
Dalam tutorial ini kita akan menambahkan kolom komputasi ke Suppliers
tabel dalam database Northwind lalu membuat TableAdapter yang sesuai untuk bekerja dengan tabel ini dan kolom komputasinya. Kami akan meminta TableAdapter menggunakan prosedur tersimpan alih-alih pernyataan SQL ad-hoc sehingga penyesuaian kami tidak hilang saat wizard Konfigurasi TableAdapter digunakan.
Mari kita mulai!
Langkah 1: Menambahkan Kolom Komputasi keSuppliers
Tabel
Database Northwind tidak memiliki kolom komputasi sehingga kita perlu menambahkannya sendiri. Untuk tutorial ini mari kita tambahkan kolom komputasi ke Suppliers
tabel yang disebut FullContactName
yang mengembalikan nama kontak, judul, dan perusahaan tempat mereka bekerja dalam format berikut: ContactName
(ContactTitle
, CompanyName
). Kolom komputasi ini dapat digunakan dalam laporan saat menampilkan informasi tentang pemasok.
Mulailah dengan membuka Suppliers
definisi tabel dengan mengklik kanan pada Suppliers
tabel di Server Explorer dan memilih Buka Definisi Tabel dari menu konteks. Ini akan menampilkan kolom tabel dan propertinya, seperti jenis datanya, baik yang diizinkan NULL
, dan sebagainya. Untuk menambahkan kolom komputasi, mulailah dengan mengetikkan nama kolom ke dalam definisi tabel. Selanjutnya, masukkan ekspresinya ke dalam kotak teks (Rumus) di bawah bagian Spesifikasi Kolom Komputasi di jendela Properti Kolom (lihat Gambar 1). Beri nama kolom FullContactName
komputasi dan gunakan ekspresi berikut:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
Perhatikan bahwa string dapat digabungkan di SQL menggunakan +
operator. Pernyataan tersebut CASE
dapat digunakan seperti kondisi dalam bahasa pemrograman tradisional. Dalam ekspresi CASE
di atas, pernyataan dapat dibaca sebagai: Jika ContactTitle
tidak NULL
kemudian menghasilkan ContactTitle
nilai yang digabungkan dengan koma, jika tidak, tidak mengeluarkan apa pun. Untuk informasi selengkapnya tentang kegunaan CASE
pernyataan, lihat CASE
SQL.
Catatan
Alih-alih menggunakan CASE
pernyataan di sini, kita bisa menggunakan ISNULL(ContactTitle, '')
alternatif .
ISNULL(checkExpression, replacementValue)
mengembalikan checkExpression jika bukan NULL, jika tidak, maka mengembalikan replacementValue. Meskipun atau ISNULL
CASE
akan berfungsi dalam instans ini, ada skenario yang lebih rumit di mana fleksibilitas CASE
pernyataan tidak dapat dicocokkan dengan ISNULL
.
Setelah menambahkan kolom komputasi ini, layar Anda akan terlihat seperti cuplikan layar di Gambar 1.
Gambar 1: Tambahkan Kolom Komputasi Bernama FullContactName
ke Suppliers
Tabel (Klik untuk melihat gambar ukuran penuh)
Setelah memberi nama kolom komputasi dan memasukkan ekspresinya, simpan perubahan ke tabel dengan mengklik ikon Simpan di toolbar, dengan menekan Ctrl+S, atau dengan masuk ke menu File dan memilih Simpan Suppliers
.
Menyimpan tabel harus menyegarkan Server Explorer, termasuk kolom yang baru ditambahkan di Suppliers
daftar kolom tabel. Selain itu, ekspresi yang dimasukkan ke dalam kotak teks (Rumus) akan secara otomatis menyesuaikan dengan ekspresi yang setara yang menghapus spasi kosong yang tidak perlu, mengelilingi nama kolom dengan tanda kurung ([]
), dan menyertakan tanda kurung untuk memperlihatkan urutan operasi secara lebih eksplisit:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
Untuk informasi selengkapnya tentang kolom komputasi di Microsoft SQL Server, lihat dokumentasi teknis. Lihat juga Cara: Tentukan Kolom Komputasi untuk panduan langkah demi langkah dalam membuat kolom komputasi.
Catatan
Secara default, kolom komputasi tidak disimpan secara fisik dalam tabel tetapi sebaliknya dihitung ulang setiap kali kolom tersebut direferensikan dalam kueri. Dengan mencentang kotak centang Dipertahankan, namun, Anda dapat menginstruksikan SQL Server untuk menyimpan kolom komputasi secara fisik dalam tabel. Melakukannya memungkinkan indeks dibuat pada kolom komputasi, yang dapat meningkatkan performa kueri yang menggunakan nilai kolom komputasi dalam klausanya WHERE
. Lihat Membuat Indeks pada Kolom Komputasi untuk informasi selengkapnya.
Langkah 2: Menampilkan Nilai Kolom Komputasi
Sebelum kita mulai bekerja pada Lapisan Akses Data, mari kita luangkan FullContactName
waktu satu menit untuk melihat nilai. Dari Penjelajah Server, klik kanan pada Suppliers
nama tabel dan pilih Kueri Baru dari menu konteks. Ini akan memunculkan jendela Kueri yang meminta kita untuk memilih tabel apa yang akan disertakan dalam kueri.
Suppliers
Tambahkan tabel dan klik Tutup. Selanjutnya, periksa CompanyName
kolom , ContactName
, ContactTitle
, dan FullContactName
dari tabel Pemasok. Terakhir, klik ikon tanda seru merah di Toolbar untuk menjalankan kueri dan menampilkan hasilnya.
Seperti yang ditunjukkan Gambar 2, hasilnya mencakup , yang mencantumkan FullContactName
CompanyName
kolom , ContactName
, dan ContactTitle
menggunakan format ContactName
(ContactTitle
, CompanyName
) .
Gambar 2: FullContactName
Menggunakan Format ContactName
(ContactTitle
, CompanyName
) (Klik untuk melihat gambar ukuran penuh)
Langkah 3: Menambahkan keSuppliersTableAdapter
Lapisan Akses Data
Untuk bekerja dengan informasi pemasok dalam aplikasi kami, kita perlu terlebih dahulu membuat TableAdapter dan DataTable di DAL kita. Idealnya, ini akan dicapai menggunakan langkah-langkah mudah yang sama yang diperiksa dalam tutorial sebelumnya. Namun, bekerja dengan kolom komputasi memperkenalkan beberapa kerutan yang berjasa dalam diskusi.
Jika Anda menggunakan TableAdapter yang menggunakan pernyataan SQL ad-hoc, Anda cukup menyertakan kolom komputasi dalam kueri utama TableAdapter melalui wizard Konfigurasi TableAdapter. Namun, ini akan menghasilkan INSERT
otomatis dan UPDATE
pernyataan yang menyertakan kolom komputasi. Jika Anda mencoba menjalankan salah satu metode ini, SqlException
dengan pesan ColumnName kolom tidak dapat dimodifikasi karena merupakan kolom komputasi atau merupakan hasil dari operator UNION akan dilemparkan.
INSERT
Meskipun pernyataan dan UPDATE
dapat disesuaikan secara manual melalui properti dan InsertCommand
TableAdapterUpdateCommand
, penyesuaian ini akan hilang setiap kali wizard Konfigurasi TableAdapter dijalankan kembali.
Karena rapuhnya TableAdapters yang menggunakan pernyataan SQL ad-hoc, disarankan agar kita menggunakan prosedur tersimpan saat bekerja dengan kolom komputasi. Jika Anda menggunakan prosedur tersimpan yang ada, cukup konfigurasikan TableAdapter seperti yang dibahas dalam tutorial Menggunakan Prosedur Tersimpan yang Ada untuk TableAdapters s Set Data Yang Diketik. Namun, jika Anda memiliki wizard TableAdapter, buat prosedur tersimpan untuk Anda, penting untuk awalnya menghilangkan kolom komputasi dari kueri utama. Jika Anda menyertakan kolom komputasi dalam kueri utama, wizard Konfigurasi TableAdapter akan memberi tahu Anda, setelah selesai, bahwa kolom tersebut tidak dapat membuat prosedur tersimpan yang sesuai. Singkatnya, kita perlu mengonfigurasi TableAdapter secara awal menggunakan kueri utama bebas kolom komputasi lalu memperbarui prosedur tersimpan yang sesuai secara manual dan TableAdapter untuk SelectCommand
menyertakan kolom komputasi. Pendekatan ini mirip dengan yang digunakan dalam tutorial Memperbarui TableAdapter to UseJOIN
s.
Untuk tutorial ini, mari kita tambahkan TableAdapter baru dan membuatnya secara otomatis membuat prosedur tersimpan untuk kita. Akibatnya, kita awalnya perlu menghilangkan FullContactName
kolom komputasi dari kueri utama.
Mulailah dengan membuka Himpunan NorthwindWithSprocs
Data di ~/App_Code/DAL
folder. Klik kanan di Perancang dan, dari menu konteks, pilih untuk menambahkan TableAdapter baru. Ini akan meluncurkan wizard Konfigurasi TableAdapter. Tentukan database untuk mengkueri data dari (NORTHWNDConnectionString
dari Web.config
) dan klik Berikutnya. Karena kami belum membuat prosedur tersimpan untuk mengkueri atau memodifikasi Suppliers
tabel, pilih opsi Buat prosedur tersimpan baru sehingga panduan akan membuatnya untuk kami dan klik Berikutnya.
Gambar 3: Pilih Opsi Buat prosedur tersimpan baru (Klik untuk melihat gambar ukuran penuh)
Langkah berikutnya meminta kueri utama. Masukkan kueri berikut, yang mengembalikan SupplierID
kolom , , CompanyName
ContactName
, dan ContactTitle
untuk setiap pemasok. Perhatikan bahwa kueri ini sengaja menghilangkan kolom komputasi (FullContactName
); kami akan memperbarui prosedur tersimpan yang sesuai untuk menyertakan kolom ini di Langkah 4.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
Setelah memasukkan kueri utama dan mengklik Berikutnya, wizard memungkinkan kami memberi nama empat prosedur tersimpan yang akan dihasilkannya. Beri nama prosedur tersimpan Suppliers_Select
ini , , Suppliers_Insert
Suppliers_Update
, dan Suppliers_Delete
, seperti yang diilustrasikan Gambar 4.
Gambar 4: Sesuaikan Nama Prosedur Tersimpan yang Dihasilkan Otomatis (Klik untuk melihat gambar ukuran penuh)
Langkah wizard berikutnya memungkinkan kami memberi nama metode TableAdapter s dan menentukan pola yang digunakan untuk mengakses dan memperbarui data. Biarkan ketiga kotak centang dicentang, tetapi ganti nama metode menjadi GetData
GetSuppliers
. Klik Selesai untuk menyelesaikan wizard.
Gambar 5: Ganti nama Metode menjadi GetData
GetSuppliers
(Klik untuk melihat gambar ukuran penuh)
Setelah mengklik Selesai, wizard akan membuat empat prosedur tersimpan dan menambahkan TableAdapter dan DataTable terkait ke Himpunan Data Yang Dijenis.
Langkah 4: Menyertakan Kolom Komputasi di Kueri Utama TableAdapter
Kita sekarang perlu memperbarui TableAdapter dan DataTable yang dibuat di Langkah 3 untuk menyertakan FullContactName
kolom komputasi. Ini melibatkan dua langkah:
- Memperbarui prosedur tersimpan
Suppliers_Select
untuk mengembalikanFullContactName
kolom komputasi, dan - Memperbarui DataTable untuk menyertakan kolom terkait
FullContactName
.
Mulailah dengan menavigasi ke Penjelajah Server dan menelusuri paling detail ke folder Prosedur Tersimpan. Buka prosedur tersimpan Suppliers_Select
SELECT
dan perbarui kueri untuk menyertakan FullContactName
kolom komputasi:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Simpan perubahan ke prosedur tersimpan dengan mengklik ikon Simpan di Toolbar, dengan menekan Ctrl+S, atau dengan memilih opsi Simpan Suppliers_Select
dari menu File.
Selanjutnya, kembali ke Desainer Himpunan Data, klik kanan pada SuppliersTableAdapter
, dan pilih Konfigurasikan dari menu konteks. Perhatikan bahwa Suppliers_Select
kolom sekarang menyertakan FullContactName
kolom dalam kumpulan Kolom Datanya.
Gambar 6: Jalankan Wizard Konfigurasi TableAdapter s untuk Memperbarui Kolom DataTable (Klik untuk melihat gambar ukuran penuh)
Klik Selesai untuk menyelesaikan wizard. Ini akan secara otomatis menambahkan kolom yang sesuai ke SuppliersDataTable
. Wizard TableAdapter cukup cerdas untuk mendeteksi bahwa FullContactName
kolom adalah kolom komputasi dan oleh karena itu baca-saja. Akibatnya, ia mengatur properti kolom s ReadOnly
ke true
. Untuk memverifikasi ini, pilih kolom dari SuppliersDataTable
lalu buka jendela Properti (lihat Gambar 7). Perhatikan bahwa FullContactName
kolom dan DataType
MaxLength
properti juga diatur dengan sesuai.
Gambar 7: FullContactName
Kolom Ditandai sebagai Baca-Saja (Klik untuk melihat gambar ukuran penuh)
Langkah 5: MenambahkanGetSupplierBySupplierID
Metode ke TableAdapter
Untuk tutorial ini, kami akan membuat halaman ASP.NET yang menampilkan pemasok dalam kisi yang dapat diperbarui. Dalam tutorial sebelumnya kami telah memperbarui satu catatan dari Lapisan Logika Bisnis dengan mengambil rekaman tertentu dari DAL sebagai DataTable yang sangat di ketik, memperbarui propertinya, lalu mengirim DataTable yang diperbarui kembali ke DAL untuk menyebarkan perubahan ke database. Untuk mencapai langkah pertama ini - mengambil rekaman yang diperbarui dari DAL - kita perlu terlebih dahulu menambahkan GetSupplierBySupplierID(supplierID)
metode ke DAL.
Klik kanan pada SuppliersTableAdapter
di Desain Himpunan Data dan pilih opsi Tambahkan Kueri dari menu konteks. Seperti yang kami lakukan di Langkah 3, biarkan wizard menghasilkan prosedur tersimpan baru untuk kami dengan memilih opsi Buat prosedur tersimpan baru (lihat kembali ke Gambar 3 untuk cuplikan layar langkah wizard ini). Karena metode ini akan mengembalikan rekaman dengan beberapa kolom, tunjukkan bahwa kita ingin menggunakan kueri SQL yang merupakan SELECT yang mengembalikan baris dan klik Berikutnya.
Gambar 8: Pilih SELECT yang mengembalikan Opsi baris (Klik untuk melihat gambar ukuran penuh)
Langkah berikutnya meminta kueri untuk digunakan untuk metode ini. Masukkan yang berikut ini, yang mengembalikan bidang data yang sama dengan kueri utama tetapi untuk pemasok tertentu.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
Layar berikutnya meminta kami untuk memberi nama prosedur tersimpan yang akan dibuat secara otomatis. Beri nama prosedur Suppliers_SelectBySupplierID
tersimpan ini dan klik Berikutnya.
Gambar 9: Beri nama Prosedur Suppliers_SelectBySupplierID
Tersimpan (Klik untuk melihat gambar ukuran penuh)
Terakhir, wizard meminta pola akses data dan nama metode yang akan digunakan untuk TableAdapter. Biarkan kedua kotak centang dicentang, tetapi ganti nama FillBy
metode dan GetDataBy
menjadi FillBySupplierID
dan GetSupplierBySupplierID
, masing-masing.
Gambar 10: Beri nama Metode FillBySupplierID
TableAdapter dan GetSupplierBySupplierID
(Klik untuk melihat gambar ukuran penuh)
Klik Selesai untuk menyelesaikan wizard.
Langkah 6: Membuat Lapisan Logika Bisnis
Sebelum kita membuat halaman ASP.NET yang menggunakan kolom komputasi yang dibuat di Langkah 1, pertama-tama kita perlu menambahkan metode yang sesuai di BLL. Halaman ASP.NET kami, yang akan kami buat di Langkah 7, akan memungkinkan pengguna untuk melihat dan mengedit pemasok. Oleh karena itu, kita membutuhkan BLL kita untuk menyediakan, minimal, metode untuk mendapatkan semua pemasok dan yang lain untuk memperbarui pemasok tertentu.
Buat file kelas baru bernama SuppliersBLLWithSprocs
di ~/App_Code/BLL
folder dan tambahkan kode berikut:
Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
Private _suppliersAdapter As SuppliersTableAdapter = Nothing
Protected ReadOnly Property Adapter() As SuppliersTableAdapter
Get
If _suppliersAdapter Is Nothing Then
_suppliersAdapter = New SuppliersTableAdapter()
End If
Return _suppliersAdapter
End Get
End Property
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Select, True)> _
Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
Return Adapter.GetSuppliers()
End Function
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateSupplier(companyName As String, contactName As String, _
contactTitle As String, supplierID As Integer) As Boolean
Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
Adapter.GetSupplierBySupplierID(supplierID)
If suppliers.Count = 0 Then
' no matching record found, return false
Return False
End If
Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
supplier.CompanyName = companyName
If contactName Is Nothing Then
supplier.SetContactNameNull()
Else
supplier.ContactName = contactName
End If
If contactTitle Is Nothing Then
supplier.SetContactTitleNull()
Else
supplier.ContactTitle = contactTitle
End If
' Update the product record
Dim rowsAffected As Integer = Adapter.Update(supplier)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End Function
End Class
Seperti kelas BLL lainnya, SuppliersBLLWithSprocs
memiliki Protected
Adapter
properti yang mengembalikan instans SuppliersTableAdapter
kelas bersama dengan dua Public
metode: GetSuppliers
dan UpdateSupplier
. Metode GetSuppliers
memanggil dan mengembalikan yang SuppliersDataTable
dikembalikan oleh metode yang GetSupplier
sesuai di Lapisan Akses Data. Metode ini UpdateSupplier
mengambil informasi tentang pemasok tertentu yang diperbarui melalui panggilan ke metode DAL s GetSupplierBySupplierID(supplierID)
. Kemudian memperbarui CategoryName
properti , , ContactName
dan ContactTitle
dan dan menerapkan perubahan ini ke database dengan memanggil metode Lapisan Akses Data, Update
meneruskan objek yang dimodifikasi SuppliersRow
.
Catatan
Kecuali untuk SupplierID
dan CompanyName
, semua kolom dalam tabel Pemasok mengizinkan NULL
nilai. Oleh karena itu, jika parameter atau yang diteruskan contactName
adalah kita perlu mengatur properti dan contactTitle
yang Nothing
sesuai ke ContactName
nilai database menggunakan ContactTitle
metode dan NULL
.SetContactNameNull
SetContactTitleNull
Langkah 7: Bekerja dengan Kolom Komputasi dari Lapisan Presentasi
Dengan kolom komputasi ditambahkan ke Suppliers
tabel dan DAL dan BLL diperbarui sesuai dengan itu, kami siap untuk membangun halaman ASP.NET yang berfungsi dengan FullContactName
kolom komputasi. Mulailah dengan membuka ComputedColumns.aspx
halaman di AdvancedDAL
folder dan seret GridView dari Kotak Alat ke Perancang. Atur properti GridView ke ID
Suppliers
dan, dari tag pintarnya, ikat ke ObjectDataSource baru bernama SuppliersDataSource
. Konfigurasikan ObjectDataSource untuk menggunakan kelas yang SuppliersBLLWithSprocs
kami tambahkan kembali di Langkah 6 dan klik Berikutnya.
Gambar 11: Mengonfigurasi ObjectDataSource untuk Menggunakan SuppliersBLLWithSprocs
Kelas (Klik untuk melihat gambar ukuran penuh)
Hanya ada dua metode yang ditentukan dalam SuppliersBLLWithSprocs
kelas: GetSuppliers
dan UpdateSupplier
. Pastikan kedua metode ini ditentukan di tab SELECT dan UPDATE, masing-masing, dan klik Selesai untuk menyelesaikan konfigurasi ObjectDataSource.
Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio akan menambahkan BoundField untuk setiap bidang data yang dikembalikan.
SupplierID
Hapus BoundField dan ubah HeaderText
properti CompanyName
ContactName
ContactTitle
FullContactName
BoundFields ke Perusahaan, Nama Kontak, Judul, dan Nama Kontak Lengkap, masing-masing. Dari tag pintar, centang kotak Aktifkan Pengeditan untuk mengaktifkan kemampuan pengeditan bawaan GridView.
Selain menambahkan BoundFields ke GridView, penyelesaian Wizard Sumber Data juga menyebabkan Visual Studio mengatur properti ObjectDataSource ke OldValuesParameterFormatString
original_{0}. Kembalikan pengaturan ini kembali ke nilai defaultnya, {0} .
Setelah melakukan pengeditan ini ke GridView dan ObjectDataSource, markup deklaratifnya akan terlihat mirip dengan yang berikut ini:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="CompanyName"
HeaderText="Company"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName"
HeaderText="Contact Name"
SortExpression="ContactName" />
<asp:BoundField DataField="ContactTitle"
HeaderText="Title"
SortExpression="ContactTitle" />
<asp:BoundField DataField="FullContactName"
HeaderText="Full Contact Name"
SortExpression="FullContactName"
ReadOnly="True" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs"
UpdateMethod="UpdateSupplier">
<UpdateParameters>
<asp:Parameter Name="companyName" Type="String" />
<asp:Parameter Name="contactName" Type="String" />
<asp:Parameter Name="contactTitle" Type="String" />
<asp:Parameter Name="supplierID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Selanjutnya, kunjungi halaman ini melalui browser. Seperti yang ditunjukkan Gambar 12, setiap pemasok tercantum dalam kisi yang menyertakan FullContactName
kolom, yang nilainya hanyalah perangkaian tiga kolom lainnya yang diformat sebagai ContactName
(ContactTitle
, CompanyName
) .
Gambar 12: Setiap Pemasok Tercantum di Kisi (Klik untuk melihat gambar ukuran penuh)
Mengklik tombol Edit untuk pemasok tertentu menyebabkan postback dan baris tersebut dirender di antarmuka pengeditannya (lihat Gambar 13). Tiga kolom pertama dirender di antarmuka pengeditan defaultnya - kontrol TextBox yang propertinya Text
diatur ke nilai bidang data. Namun FullContactName
, kolom tetap sebagai teks. Ketika BoundFields ditambahkan ke GridView pada penyelesaian wizard Konfigurasi Sumber Data, FullContactName
properti BoundField s ReadOnly
diatur ke True
karena kolom terkait FullContactName
di SuppliersDataTable
properti telah ReadOnly
diatur ke True
. Seperti yang disebutkan di Langkah 4, FullContactName
properti s ReadOnly
diatur ke True
karena TableAdapter mendeteksi bahwa kolom adalah kolom komputasi.
Gambar 13: FullContactName
Kolom Tidak Dapat Diedit (Klik untuk melihat gambar ukuran penuh)
Lanjutkan dan perbarui nilai satu atau beberapa kolom yang dapat diedit dan klik Perbarui. Perhatikan bagaimana FullContactName
nilai s diperbarui secara otomatis untuk mencerminkan perubahan.
Catatan
GridView saat ini menggunakan BoundFields untuk bidang yang dapat diedit, menghasilkan antarmuka pengeditan default.
CompanyName
Karena bidang diperlukan, bidang harus dikonversi menjadi TemplateField yang menyertakan RequiredFieldValidator. Saya meninggalkan ini sebagai latihan untuk pembaca yang tertarik.
Lihat tutorial Menambahkan Kontrol Validasi ke tutorial Mengedit dan Menyisipkan Antarmuka untuk instruksi langkah demi langkah tentang mengonversi BoundField ke TemplateField dan menambahkan kontrol validasi.
Ringkasan
Saat menentukan skema untuk tabel, Microsoft SQL Server memungkinkan penyertaan kolom komputasi. Ini adalah kolom yang nilainya dihitung dari ekspresi yang biasanya mereferensikan nilai dari kolom lain dalam rekaman yang sama. Karena nilai untuk kolom komputasi didasarkan pada ekspresi, nilai tersebut bersifat baca-saja dan tidak dapat ditetapkan nilai dalam pernyataan INSERT
atau UPDATE
. Ini memperkenalkan tantangan saat menggunakan kolom komputasi dalam kueri utama TableAdapter yang mencoba menghasilkan pernyataan , , INSERT
dan UPDATE
yang sesuai DELETE
secara otomatis.
Dalam tutorial ini kita membahas teknik untuk menghindari tantangan yang ditimbulkan oleh kolom komputasi. Secara khusus, kami menggunakan prosedur tersimpan di TableAdapter kami untuk mengatasi kerapahan yang melekat dalam TableAdapters yang menggunakan pernyataan SQL ad-hoc. Saat wizard TableAdapter membuat prosedur tersimpan baru, penting bahwa kami memiliki kueri utama awalnya menghilangkan kolom komputasi apa pun karena kehadirannya mencegah modifikasi data prosedur tersimpan dihasilkan. Setelah TableAdapter awalnya dikonfigurasi, prosedur tersimpannya SelectCommand
dapat diputar ulang untuk menyertakan kolom komputasi apa pun.
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.
Terima kasih khusus untuk
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Hilton Geisenow dan Teresa Murphy. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.