Bagikan melalui


Bekerja dengan Kolom Komputasi (VB)

oleh Scott Mitchell

Unduh PDF

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, , EmployeeIDRate, 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 keSuppliersTabel

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

Menambahkan Kolom Komputasi Bernama FullContactName ke Tabel Pemasok

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 CompanyNamekolom , 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 FullContactNameCompanyNamekolom , ContactName, dan ContactTitle menggunakan format ContactName (ContactTitle, CompanyName) .

FullContactName Menggunakan Format ContactName (ContactTitle, CompanyName)

Gambar 2: FullContactName Menggunakan Format ContactName (ContactTitle, CompanyName) (Klik untuk melihat gambar ukuran penuh)

Langkah 3: Menambahkan keSuppliersTableAdapterLapisan 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 UseJOINs.

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.

Pilih Opsi Buat prosedur tersimpan baru

Gambar 3: Pilih Opsi Buat prosedur tersimpan baru (Klik untuk melihat gambar ukuran penuh)

Langkah berikutnya meminta kueri utama. Masukkan kueri berikut, yang mengembalikan SupplierIDkolom , , CompanyNameContactName, 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_Selectini , , Suppliers_InsertSuppliers_Update, dan Suppliers_Delete, seperti yang diilustrasikan Gambar 4.

Mengkustomisasi Nama Prosedur Tersimpan yang Dibuat Otomatis

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 GetDataGetSuppliers. Klik Selesai untuk menyelesaikan wizard.

Ganti nama Metode GetData menjadi GetSuppliers

Gambar 5: Ganti nama Metode menjadi GetDataGetSuppliers (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:

  1. Memperbarui prosedur tersimpan Suppliers_Select untuk mengembalikan FullContactName kolom komputasi, dan
  2. 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_SelectSELECT 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.

Jalankan Wizard Konfigurasi TableAdapter s untuk Memperbarui Kolom DataTable

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 DataTypeMaxLength properti juga diatur dengan sesuai.

Kolom FullContactName Ditandai sebagai Baca-Saja

Gambar 7: FullContactName Kolom Ditandai sebagai Baca-Saja (Klik untuk melihat gambar ukuran penuh)

Langkah 5: MenambahkanGetSupplierBySupplierIDMetode 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.

Pilih OPSI SELECT yang mengembalikan baris

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.

Beri nama Suppliers_SelectBySupplierID Prosedur Tersimpan

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.

Beri nama Metode TableAdapter FillBySupplierID dan GetSupplierBySupplierID

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 ProtectedAdapter 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 CategoryNameproperti , , ContactNamedan 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 .SetContactNameNullSetContactTitleNull

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

Mengonfigurasi ObjectDataSource untuk Menggunakan Kelas SuppliersBLLWithSprocs

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

Setiap Pemasok Tercantum di Kisi

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.

Kolom FullContactName Tidak Dapat Diedit

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 , , INSERTdan UPDATE yang sesuai DELETEsecara 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.