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 Microsoft
Kontrol DataGrid di ASP.NET 1.x menandai peningkatan besar dalam akses data di aplikasi Web. Namun, itu tidak ramah pengguna seperti yang bisa terjadi. Ini masih membutuhkan sejumlah besar kode untuk mendapatkan fungsionalitas yang jauh berguna darinya. Demikianlah model di semua upaya akses data dalam 1.x.
Kontrol DataGrid di ASP.NET 1.x menandai peningkatan besar dalam akses data di aplikasi Web. Namun, itu tidak ramah pengguna seperti yang bisa terjadi. Ini masih membutuhkan sejumlah besar kode untuk mendapatkan fungsionalitas yang jauh berguna darinya. Demikianlah model di semua upaya akses data dalam 1.x.
ASP.NET 2.0 mengatasi ini sebagian dengan kontrol sumber data. Kontrol sumber data di ASP.NET 2.0 memberi pengembang model deklaratif untuk mengambil data, menampilkan data, dan mengedit data. Tujuan kontrol sumber data adalah untuk memberikan representasi data yang konsisten ke kontrol terikat data terlepas dari sumber data tersebut. Inti dari kontrol sumber data di ASP.NET 2.0 adalah kelas abstrak DataSourceControl. Kelas DataSourceControl menyediakan implementasi dasar antarmuka IDataSource dan antarmuka IListSource, yang terakhir memungkinkan Anda menetapkan kontrol sumber data sebagai Sumber Data kontrol terikat data (melalui properti DataSourceId baru yang dibahas nanti) dan mengekspos data di dalamnya sebagai daftar. Setiap daftar data dari kontrol sumber data diekspos sebagai objek DataSourceView. Akses ke instans DataSourceView disediakan oleh antarmuka IDataSource. Misalnya, metode GetViewNames mengembalikan ICollection yang memungkinkan Anda menghitung DataSourceViews yang terkait dengan kontrol sumber data tertentu, dan metode GetView memungkinkan Anda mengakses instans DataSourceView tertentu berdasarkan nama.
Kontrol sumber data tidak memiliki antarmuka pengguna. Mereka diimplementasikan sebagai kontrol server sehingga mereka dapat mendukung sintaksis deklaratif dan sehingga mereka memiliki akses ke status halaman jika diinginkan. Kontrol sumber data tidak merender markup HTML apa pun ke klien.
Catatan
Seperti yang akan Anda lihat nanti, ada juga manfaat penembolokan yang diperoleh dengan menggunakan kontrol sumber data.
Menyimpan String Koneksi
Sebelum kita melihat cara mengonfigurasi kontrol sumber data, kita harus membahas kemampuan baru di ASP.NET 2.0 mengenai string koneksi. ASP.NET 2.0 memperkenalkan bagian baru dalam file konfigurasi yang memungkinkan Anda untuk dengan mudah menyimpan string koneksi yang dapat dibaca secara dinamis saat runtime. Bagian <connectionStrings> memudahkan untuk menyimpan string koneksi.
Cuplikan di bawah ini menambahkan string koneksi baru.
<connectionStrings> <add name="Northwind" connectionString="Data Source=localhost; Integrated Security=SSPI;Initial Catalog=Northwind;" providerName="System.Data.SqlClient" /> </connectionStrings>
Catatan
Sama seperti bagian <appSettings> , bagian <connectionStrings> muncul di luar <bagian system.web> dalam file konfigurasi.
Untuk menggunakan string koneksi ini, Anda dapat menggunakan sintaks berikut saat mengatur atribut ConnectionString kontrol server.
ConnectionString="<%$ ConnectionStrings:Northwind%>"
Bagian <connectionStrings> juga dapat dienkripsi sehingga informasi sensitif tidak terekspos. Kemampuan itu akan tercakup dalam modul selanjutnya.
Sumber Data Penembolokan
Setiap DataSourceControl menyediakan empat properti untuk mengonfigurasi penembolokan; EnableCaching, CacheDuration, CacheExpirationPolicy, dan CacheKeyDependency.
EnableCaching
EnableCaching adalah properti Boolean yang menentukan apakah penembolokan diaktifkan atau tidak untuk kontrol sumber data.
Properti CacheDuration
Properti CacheDuration menetapkan jumlah detik bahwa cache tetap valid. Mengatur properti ini ke 0 menyebabkan cache tetap valid hingga secara eksplisit tidak valid.
Properti CacheExpirationPolicy
Properti CacheExpirationPolicy dapat diatur ke Absolute atau Sliding. Mengaturnya ke Absolute berarti bahwa jumlah waktu maksimum data akan di-cache adalah jumlah detik yang ditentukan oleh properti CacheDuration. Dengan mengaturnya ke Geser, waktu kedaluwarsa diatur ulang saat setiap operasi dilakukan.
Properti CacheKeyDependency
Jika nilai string ditentukan untuk properti CacheKeyDependency, ASP.NET akan menyiapkan dependensi cache baru berdasarkan string tersebut. Ini memungkinkan Anda untuk secara eksplisit membatalkan cache hanya dengan mengubah atau menghapus CacheKeyDependency.
Penting: Jika peniruan identitas diaktifkan dan akses ke sumber data dan/atau konten data didasarkan pada identitas klien, disarankan agar penembolokan dinonaktifkan dengan mengatur EnableCaching ke False. Jika penembolokan diaktifkan dalam skenario ini dan pengguna selain pengguna yang awalnya meminta data mengeluarkan permintaan, otorisasi ke sumber data tidak diberlakukan. Data hanya akan disajikan dari cache.
Kontrol SqlDataSource
Kontrol SqlDataSource memungkinkan pengembang untuk mengakses data yang disimpan dalam database relasional apa pun yang mendukung ADO.NET. Ini dapat menggunakan penyedia System.Data.SqlClient untuk mengakses database SQL Server, penyedia System.Data.OleDb, penyedia System.Data.Odbc, atau penyedia System.Data.OracleClient untuk mengakses Oracle. Oleh karena itu, SqlDataSource tentu tidak hanya digunakan untuk mengakses data dalam database SQL Server.
Untuk menggunakan SqlDataSource, Anda cukup memberikan nilai untuk properti ConnectionString dan menentukan perintah SQL atau prosedur tersimpan. Kontrol SqlDataSource mengurus pekerjaan dengan arsitektur ADO.NET yang mendasar. Ini membuka koneksi, mengkueri sumber data atau menjalankan prosedur tersimpan, mengembalikan data, lalu menutup koneksi untuk Anda.
Catatan
Karena kelas DataSourceControl secara otomatis menutup koneksi untuk Anda, kelas tersebut harus mengurangi jumlah panggilan pelanggan yang dihasilkan dengan membocorkan Penghubungan Database.
Cuplikan kode di bawah ini mengikat kontrol DropDownList ke kontrol SqlDataSource menggunakan string koneksi yang disimpan dalam file konfigurasi seperti yang ditunjukkan di atas.
<asp:SqlDataSource id="SqlDataSource1" runat="server" DataSourceMode="DataReader" ConnectionString="<%$ ConnectionStrings:Northwind%>" SelectCommand="SELECT EmployeeID, LastName FROM Employees"> </asp:SqlDataSource><asp:DropDownList id="ListBox1" runat="server" DataTextField="LastName" DataValueField="EmployeeID" DataSourceID="SqlDataSource1"> </asp:DropDownList>
Seperti yang diilustrasikan di atas, properti DataSourceMode dari SqlDataSource menentukan mode untuk sumber data. Dalam contoh di atas, DataSourceMode diatur ke DataReader. Dalam hal ini, SqlDataSource akan mengembalikan objek IDataReader menggunakan kursor hanya-maju dan baca-saja. Jenis objek yang ditentukan yang dikembalikan dikontrol oleh penyedia yang digunakan. Dalam hal ini, saya menggunakan penyedia System.Data.SqlClient seperti yang ditentukan di bagian <connectionStrings> dari file web.config. Oleh karena itu, objek yang dikembalikan akan berjenis SqlDataReader. Dengan menentukan nilai DataSourceMode dari Himpunan Data, data dapat disimpan dalam Himpunan Data di server. Mode ini memungkinkan Anda menambahkan fitur seperti pengurutan, penomoran halaman, dll. Jika saya telah mengikat data SqlDataSource ke kontrol GridView, saya akan memilih mode Himpunan Data. Namun, dalam kasus DropDownList, mode DataReader adalah pilihan yang benar.
Catatan
Saat penembolokan SqlDataSource atau AccessDataSource, properti DataSourceMode harus diatur ke Himpunan Data. Pengecualian akan terjadi jika Anda mengaktifkan penembolokan dengan DataSourceMode dari DataReader.
Properti SqlDataSource
Berikut ini adalah beberapa properti kontrol SqlDataSource.
CancelSelectOnNullParameter
Nilai Boolean yang menentukan apakah perintah pilih dibatalkan jika salah satu parameter null. True secara default.
ConflictDetection
Dalam situasi di mana beberapa pengguna mungkin memperbarui sumber data secara bersamaan, properti ConflictDetection menentukan perilaku kontrol SqlDataSource. Properti ini mengevaluasi ke salah satu nilai enumerasi ConflictOptions. Nilai-nilai tersebut adalah CompareAllValues dan OverwriteChanges. Jika diatur ke OverwriteChanges, orang terakhir yang menulis data ke sumber data akan menimpa perubahan sebelumnya. Namun, jika properti ConflictDetection diatur ke CompareAllValues, parameter dibuat untuk kolom yang dikembalikan oleh SelectCommand dan parameter juga dibuat untuk menyimpan nilai asli di setiap kolom tersebut yang memungkinkan SqlDataSource menentukan apakah nilai telah berubah atau tidak sejak SelectCommand dijalankan.
DeleteCommand
Mengatur atau mendapatkan string SQL yang digunakan saat menghapus baris dari database. Ini bisa berupa kueri SQL atau nama prosedur tersimpan.
DeleteCommandType
Mengatur atau mendapatkan jenis perintah hapus, baik kueri SQL (Teks) atau prosedur tersimpan (StoredProcedure).
DeleteParameters
Mengembalikan parameter yang digunakan oleh DeleteCommand dari objek SqlDataSourceView yang terkait dengan kontrol SqlDataSource.
OldValuesParameterFormatString
Properti ini digunakan untuk menentukan format parameter nilai asli dalam kasus di mana properti ConflictDetection diatur ke CompareAllValues. Defaultnya adalah {0} yang berarti bahwa parameter nilai asli akan mengambil nama yang sama dengan parameter asli. Dengan kata lain, jika nama bidang adalah EmployeeID, parameter nilai aslinya adalah @EmployeeID.
Pilih Perintah
Mengatur atau mendapatkan string SQL yang digunakan untuk mengambil data dari database. Ini bisa berupa kueri SQL atau nama prosedur tersimpan.
PilihCommandType
Mengatur atau mendapatkan jenis perintah pilih, baik kueri SQL (Teks) atau prosedur tersimpan (StoredProcedure).
PilihParameters
Mengembalikan parameter yang digunakan oleh SelectCommand dari objek SqlDataSourceView yang terkait dengan kontrol SqlDataSource.
SortParameterName
Mendapatkan atau mengatur nama parameter prosedur tersimpan yang digunakan saat mengurutkan data yang diambil oleh kontrol sumber data. Hanya valid saat SelectCommandType diatur ke StoredProcedure.
SqlCacheDependency
String yang dibatasi titik koma yang menentukan database dan tabel yang digunakan dalam dependensi cache SQL Server. (Dependensi cache SQL akan dibahas dalam modul selanjutnya.)
UpdateCommand
Mengatur atau mendapatkan string SQL yang digunakan saat memperbarui data dalam database. Ini bisa berupa kueri SQL atau nama prosedur tersimpan.
UpdateCommandType
Mengatur atau mendapatkan jenis perintah pembaruan, baik kueri SQL (Teks) atau prosedur tersimpan (StoredProcedure).
UpdateParameters
Mengembalikan parameter yang digunakan oleh UpdateCommand dari objek SqlDataSourceView yang terkait dengan kontrol SqlDataSource.
Kontrol AccessDataSource
Kontrol AccessDataSource berasal dari kelas SqlDataSource dan digunakan untuk mengikat data ke database Microsoft Access. Properti ConnectionString untuk kontrol AccessDataSource adalah properti baca-saja. Alih-alih menggunakan properti ConnectionString, properti DataFile digunakan untuk menunjuk ke Database Access seperti yang ditunjukkan di bawah ini.
<asp:AccessDataSource id="AccessDataSource1" runat="server" DataFile="~/App_Data/Northwind.mdb"> </asp:AccessDataSource>
AccessDataSource akan selalu mengatur ProviderName dari SqlDataSource dasar ke System.Data.OleDb dan terhubung ke database menggunakan penyedia Microsoft.Jet.OLEDB.4.0 OLE DB. Anda tidak dapat menggunakan kontrol AccessDataSource untuk menyambungkan ke database Access yang dilindungi kata sandi. Jika Anda harus tersambung ke database yang dilindungi kata sandi, Anda harus menggunakan kontrol SqlDataSource.
Catatan
Database access yang disimpan dalam situs Web harus ditempatkan di direktori App_Data. ASP.NET tidak memperbolehkan berkas dalam direktori ini dijelajahi. Anda harus memberikan izin Baca dan Tulis akun proses ke direktori App_Data saat menggunakan database Access.
Kontrol XmlDataSource
XmlDataSource digunakan untuk data XML yang mengikat data ke kontrol terikat data. Anda dapat mengikat ke file XML menggunakan properti DataFile atau Anda dapat mengikat string XML menggunakan properti Data. XmlDataSource mengekspos atribut XML sebagai bidang yang dapat diikat. Dalam kasus di mana Anda perlu mengikat ke nilai yang tidak direpresentasikan sebagai atribut, Anda harus menggunakan transformasi XSL. Anda juga dapat menggunakan ekspresi JalurX untuk memfilter data XML.
Pertimbangkan file XML berikut:
<?xml version="1.0" encoding="utf-8" ?> <People> <Person FirstName="Jake" LastName="Stone"> <Address> <Street>345 Maple St.</Street> <City>Redmond</City> <Region>WA</Region> <ZipCode>01434</ZipCode> </Address> <Job> <Title>CEO</Title> <Description>Develops company strategies.</Description> </Job> </Person> <Person FirstName="Jacob" LastName="Ladder"> <Address> <Street>123 Elm St.</Street> <City>Seattle</City> <Region>WA</Region> <ZipCode>11223</ZipCode> </Address> <Job> <Title>Attorney</Title> <Description>Reviews legal issues.</Description> </Job> </Person> <Person FirstName="Angela" LastName="Hound"> <Address> <Street>34 Palm Avenue</Street> <City>Renton</City> <Region>WA</Region> <ZipCode>63910</ZipCode> </Address> <Job> <Title>IT Director</Title> <Description>In charge of corporate network.</Description> </Job> </Person> </People>
Perhatikan bahwa XmlDataSource menggunakan properti JalurX Orang/Orang untuk memfilter hanya <pada simpul Orang>. DropDownList kemudian mengikat data ke atribut LastName menggunakan properti DataTextField.
Meskipun kontrol XmlDataSource terutama digunakan untuk mengikat data ke data XML baca-saja, dimungkinkan untuk mengedit file data XML. Perhatikan bahwa dalam kasus seperti itu, penyisipan otomatis, pembaruan, dan penghapusan informasi dalam file XML tidak terjadi secara otomatis seperti halnya dengan kontrol sumber data lainnya. Sebagai gantinya, Anda harus menulis kode untuk mengedit data secara manual menggunakan metode kontrol XmlDataSource berikut.
GetXmlDocument
Mengambil objek XmlDocument yang berisi kode XML yang diambil oleh XmlDataSource.
Simpan
Menyimpan XmlDocument dalam memori kembali ke sumber data.
Penting untuk menyadari bahwa metode Simpan hanya akan berfungsi ketika dua kondisi berikut terpenuhi:
- XmlDataSource menggunakan properti DataFile untuk mengikat ke file XML alih-alih properti Data untuk mengikat data XML dalam memori.
- Tidak ada transformasi yang ditentukan melalui properti Transformasi atau TransformFile.
Perhatikan juga bahwa metode Simpan dapat menghasilkan hasil yang tidak terduga ketika dipanggil oleh beberapa pengguna secara bersamaan.
Kontrol ObjectDataSource
Kontrol sumber data yang telah kami bahas hingga saat ini adalah pilihan yang sangat baik untuk aplikasi dua tingkat di mana kontrol sumber data berkomunikasi langsung ke penyimpanan data. Namun, banyak aplikasi dunia nyata adalah aplikasi multi-tingkat di mana kontrol sumber data mungkin perlu berkomunikasi dengan objek bisnis yang, pada gilirannya, berkomunikasi dengan lapisan data. Dalam situasi ini, ObjectDataSource mengisi tagihan dengan baik. ObjectDataSource bekerja bersama dengan objek sumber. Kontrol ObjectDataSource akan membuat instans objek sumber, memanggil metode yang ditentukan, dan membuang instans objek semuanya dalam cakupan satu permintaan, jika objek Anda memiliki metode instans alih-alih metode statis (Dibagikan dalam Visual Basic). Oleh karena itu, objek Anda harus stateless. Artinya, objek Anda harus memperoleh dan melepaskan semua sumber daya yang diperlukan dalam rentang satu permintaan. Anda dapat mengontrol bagaimana objek sumber dibuat dengan menangani peristiwa ObjectCreating kontrol ObjectDataSource. Anda dapat membuat instans objek sumber, lalu mengatur properti ObjectInstance dari kelas ObjectDataSourceEventArgs ke instans tersebut. Kontrol ObjectDataSource akan menggunakan instans yang dibuat dalam peristiwa ObjectCreating alih-alih membuat instans sendiri.
Jika objek sumber untuk kontrol ObjectDataSource mengekspos metode statis publik (Dibagikan dalam Visual Basic) yang dapat dipanggil untuk mengambil dan memodifikasi data, kontrol ObjectDataSource akan memanggil metode tersebut secara langsung. Jika kontrol ObjectDataSource harus membuat instans objek sumber untuk melakukan panggilan metode, objek harus menyertakan konstruktor publik yang tidak mengambil parameter. Kontrol ObjectDataSource akan memanggil konstruktor ini saat membuat instans baru objek sumber.
Jika objek sumber tidak berisi konstruktor publik tanpa parameter, Anda dapat membuat instans objek sumber yang akan digunakan oleh kontrol ObjectDataSource dalam peristiwa ObjectCreating.
Menentukan Metode Objek
Objek sumber untuk kontrol ObjectDataSource dapat berisi sejumlah metode yang digunakan untuk memilih, menyisipkan, memperbarui, atau menghapus data. Metode ini dipanggil oleh kontrol ObjectDataSource berdasarkan nama metode, seperti yang diidentifikasi dengan menggunakan properti SelectMethod, InsertMethod, UpdateMethod, atau DeleteMethod dari kontrol ObjectDataSource. Objek sumber juga dapat menyertakan metode SelectCount opsional, yang diidentifikasi oleh kontrol ObjectDataSource menggunakan properti SelectCountMethod, yang mengembalikan jumlah total objek di sumber data. Kontrol ObjectDataSource akan memanggil metode SelectCount setelah metode Select dipanggil untuk mengambil jumlah total rekaman di sumber data untuk digunakan saat penomoran.
Lab Menggunakan Kontrol Sumber Data
Latihan 1 - Menampilkan Data dengan Kontrol SqlDataSource
Latihan berikut menggunakan kontrol SqlDataSource untuk menyambungkan ke database Northwind. Ini mengasumsikan bahwa Anda memiliki akses ke database Northwind pada instans SQL Server 2000.
Buat situs Web ASP.NET baru.
Tambahkan file web.config baru.
- Klik kanan proyek di Penjelajah Solusi dan klik Tambahkan Item Baru.
- Pilih File Konfigurasi Web dari daftar templat dan klik Tambahkan.
Edit bagian <connectionStrings> sebagai berikut:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ConnectionStrings:Northwind%>" SelectCommand="SELECT * FROM Products"> </asp:SqlDataSource>
Beralih ke tampilan Kode dan tambahkan atribut ConnectionString dan atribut SelectCommand ke <kontrol asp:SqlDataSource> sebagai berikut:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ConnectionStrings:Northwind%>" SelectCommand="SELECT * FROM Products"> </asp:SqlDataSource>
Dari tampilan Desain, tambahkan kontrol GridView baru.
Dari menu dropdown Pilih Sumber Data di menu Tugas Tampilan Kisi, pilih SqlDataSource1.
Klik kanan default.aspx dan pilih Tampilkan di Browser dari menu. Klik Ya saat diminta untuk menyimpan.
GridView menampilkan data dari tabel Produk.
Latihan 2 - Mengedit Data dengan Kontrol SqlDataSource
Latihan berikut menunjukkan cara mengikat data kontrol DropDownList menggunakan sintaks deklaratif dan memungkinkan Anda mengedit data yang disajikan dalam kontrol DropDownList.
Dalam tampilan Desain, hapus kontrol GridView dari Default.aspx.
Penting: Biarkan kontrol SqlDataSource di halaman.
Tambahkan kontrol DropDownList ke Default.aspx.
Beralih ke tampilan Sumber.
Tambahkan atribut DataSourceId, DataTextField, dan DataValueField ke <kontrol asp:DropDownList> sebagai berikut:
<asp:DropDownList ID="ddlProducts" runat="server" DataSourceId="SqlDataSource1" DataTextField="ProductName" DataValueField="ProductID"> </asp:DropDownList>
Simpan Default.aspx dan lihat di browser. Perhatikan bahwa DropDownList berisi semua produk dari database Northwind.
Tutup browser.
Di Tampilan sumber Default.aspx, tambahkan kontrol TextBox baru di bawah kontrol DropDownList. Ubah properti ID TextBox menjadi txtProductName.
Di bawah kontrol Kotak Teks, tambahkan kontrol Tombol baru. Ubah properti ID Tombol menjadi btnUpdate dan properti Teks menjadi Perbarui Nama Produk.
Dalam tampilan Sumber Default.aspx, tambahkan properti UpdateCommand dan dua UpdateParameters baru ke tag SqlDataSource sebagai berikut:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ConnectionStrings:Northwind%>" SelectCommand="SELECT * FROM Products" UpdateCommand="UPDATE Products SET ProductName=@ProductName WHERE ProductID=@ProductID"> <UpdateParameters> <asp:ControlParameter Name="ProductName" ControlID="txtProductName" PropertyName="Text" /> <asp:ControlParameter Name="ProductID" ControlID="ddlProducts" PropertyName="SelectedValue" /> </asp:SqlDataSource>
Catatan
Perhatikan bahwa ada dua parameter pembaruan (ProductName dan ProductID) yang ditambahkan dalam kode ini. Parameter ini dipetakan ke properti Teks dari txtProductName TextBox dan properti SelectedValue dari ddlProducts DropDownList.
Beralih ke tampilan Desain dan klik dua kali kontrol Tombol untuk menambahkan penanganan aktivitas.
Tambahkan kode berikut ke kode btnUpdate_Click:
SqlDataSource1.Update();
Klik kanan pada Default.aspx dan pilih untuk melihatnya di browser. Klik Ya saat diminta untuk menyimpan semua perubahan.
ASP.NET 2.0 kelas parsial memungkinkan kompilasi saat runtime. Tidak perlu membangun aplikasi untuk melihat perubahan kode berlaku.
Pilih produk dari DropDownList.
Masukkan nama baru untuk produk yang dipilih di Kotak Teks lalu klik tombol Perbarui.
Nama produk diperbarui dalam database.
Latihan 3 Menggunakan Kontrol ObjectDataSource
Latihan ini akan menunjukkan cara menggunakan kontrol ObjectDataSource dan objek sumber untuk berinteraksi dengan database Northwind.
Klik kanan pada proyek di Penjelajah Solusi dan klik Tambahkan Item Baru.
Pilih Formulir Web di daftar templat. Ubah nama menjadi object.aspx dan klik Tambahkan.
Klik kanan pada proyek di Penjelajah Solusi dan klik Tambahkan Item Baru.
Pilih Kelas di daftar templat. Ubah nama kelas menjadi NorthwindData.cs dan klik Tambahkan.
Klik Ya saat diminta untuk menambahkan kelas ke folder App_Code.
Tambahkan kode berikut ke file NorthwindData.cs:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; public class NorthwindData { private string _connectionString; public NorthwindData() { Initialize(); } private void Initialize() { if (ConfigurationManager.ConnectionStrings["Northwind"] == null || ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString.Trim() == "") { throw new Exception("A connection string named 'Northwind' with " + "a valid connection string must exist in the <connectionStrings> " + "configuration section for the application."); } _connectionString = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; } public DataTable GetAllEmployees(string sortColumns, int startRecord, int maxRecords) { VerifySortColumns(sortColumns); string sqlCmd = "SELECT EmployeeID, LastName, FirstName, Address, " + "City, Region, PostalCode FROM Employees "; if (sortColumns.Trim() == "") sqlCmd += "ORDER BY EmployeeID"; else sqlCmd += "ORDER BY " + sortColumns; SqlConnection conn = new SqlConnection(_connectionString); SqlDataAdapter da = new SqlDataAdapter(sqlCmd, conn); DataSet ds = new DataSet(); try { conn.Open(); da.Fill(ds, startRecord, maxRecords, "Employees"); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return ds.Tables["Employees"]; } public int SelectCount() { SqlConnection conn = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Employees", conn); int result = 0; try { conn.Open(); result = (int)cmd.ExecuteScalar(); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return result; } ////////// // Verify that only valid columns are specified in the sort expression to // avoid a SQL Injection attack. private void VerifySortColumns(string sortColumns) { if (sortColumns.ToLowerInvariant().EndsWith(" desc")) sortColumns = sortColumns.Substring(0, sortColumns.Length - 5); string[] columnNames = sortColumns.Split(','); foreach (string columnName in columnNames) { switch (columnName.Trim().ToLowerInvariant()) { case "employeeid": break; case "lastname": break; case "firstname": break; case "": break; default: throw new ArgumentException("SortColumns contains an " + "invalid column name."); break; } } } // Select an employee. public DataTable GetEmployee(int EmployeeID) { SqlConnection conn = new SqlConnection(_connectionString); SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, " + "Address, City, Region, PostalCode " + " FROM Employees WHERE EmployeeID = @EmployeeID", conn); da.SelectCommand.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID; DataSet ds = new DataSet(); try { conn.Open(); da.Fill(ds, "Employees"); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return ds.Tables["Employees"]; } // Delete the Employee by ID. public int DeleteEmployee(int EmployeeID) { SqlConnection conn = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("DELETE FROM Employees WHERE " + "EmployeeID = @EmployeeID", conn); cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID; int result = 0; try { conn.Open(); result = cmd.ExecuteNonQuery(); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return result; } // Update the Employee by original ID. public int UpdateEmployee(int EmployeeID, string LastName, string FirstName, string Address, string City, string Region, string PostalCode) { if (String.IsNullOrEmpty(FirstName)) throw new ArgumentException("FirstName cannot be null or an empty string."); if (String.IsNullOrEmpty(LastName)) throw new ArgumentException("LastName cannot be null or an empty string."); if (Address == null) { Address = String.Empty; } if (City == null) { City = String.Empty; } if (Region == null) { Region = String.Empty; } if (PostalCode == null) { PostalCode = String.Empty; } SqlConnection conn = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("UPDATE Employees " + " SET FirstName=@FirstName, " + "LastName=@LastName, " + "Address=@Address, City=@City, " + "Region=@Region, " + "PostalCode=@PostalCode " + "WHERE EmployeeID=@EmployeeID", conn); cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName; cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName; cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address; cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City; cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region; cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode; cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID; int result = 0; try { conn.Open(); result = cmd.ExecuteNonQuery(); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return result; } // Insert an Employee. public int InsertEmployee(string LastName, string FirstName, string Address, string City, string Region, string PostalCode) { if (String.IsNullOrEmpty(FirstName)) throw new ArgumentException("FirstName cannot be null or an empty string."); if (String.IsNullOrEmpty(LastName)) throw new ArgumentException("LastName cannot be null or an empty string."); if (Address == null) { Address = String.Empty; } if (City == null) { City = String.Empty; } if (Region == null) { Region = String.Empty; } if (PostalCode == null) { PostalCode = String.Empty; } SqlConnection conn = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("INSERT INTO Employees " + " (FirstName, LastName, Address, " + " City, Region, PostalCode) " + " Values(@FirstName, @LastName, " + "@Address, @City, @Region, @PostalCode); " + "SELECT @EmployeeID = SCOPE_IDENTITY()", conn); cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName; cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName; cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address; cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City; cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region; cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode; SqlParameter p = cmd.Parameters.Add("@EmployeeID", SqlDbType.Int); p.Direction = ParameterDirection.Output; int newEmployeeID = 0; try { conn.Open(); cmd.ExecuteNonQuery(); newEmployeeID = (int)p.Value; } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return newEmployeeID; } // // Methods that support Optimistic Concurrency checks. // // Delete the Employee by ID. public int DeleteEmployee(int original_EmployeeID, string original_LastName, string original_FirstName, string original_Address, string original_City, string original_Region, string original_PostalCode) { if (String.IsNullOrEmpty(original_FirstName)) throw new ArgumentException("FirstName cannot be null or an empty string."); if (String.IsNullOrEmpty(original_LastName)) throw new ArgumentException("LastName cannot be null or an empty string."); if (original_Address == null) { original_Address = String.Empty; } if (original_City == null) { original_City = String.Empty; } if (original_Region == null) { original_Region = String.Empty; } if (original_PostalCode == null) { original_PostalCode = String.Empty; } string sqlCmd = "DELETE FROM Employees WHERE EmployeeID = " + @original_EmployeeID SqlConnection conn = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand(sqlCmd, conn); cmd.Parameters.Add("@original_EmployeeID", SqlDbType.Int).Value = original_EmployeeID; cmd.Parameters.Add("@original_FirstName", SqlDbType.VarChar, 10).Value = original_FirstName; cmd.Parameters.Add("@original_LastName", SqlDbType.VarChar, 20).Value = original_LastName; cmd.Parameters.Add("@original_Address", SqlDbType.VarChar, 60).Value = original_Address; cmd.Parameters.Add("@original_City", SqlDbType.VarChar, 15).Value = original_City; cmd.Parameters.Add("@original_Region", SqlDbType.VarChar, 15).Value = original_Region; cmd.Parameters.Add("@original_PostalCode", SqlDbType.VarChar, 10).Value = original_PostalCode; int result = 0; try { conn.Open(); result = cmd.ExecuteNonQuery(); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return result; } // Update the Employee by original ID. public int UpdateEmployee(string LastName, string FirstName, string Address, string City, string Region, string PostalCode, int original_EmployeeID, string original_LastName, string original_FirstName, string original_Address, string original_City, string original_Region, string original_PostalCode) { if (String.IsNullOrEmpty(FirstName)) throw new ArgumentException("FirstName cannot be null or an empty string."); if (String.IsNullOrEmpty(LastName)) throw new ArgumentException("LastName cannot be null or an empty string."); if (Address == null) { Address = String.Empty; } if (City == null) { City = String.Empty; } if (Region == null) { Region = String.Empty; } if (PostalCode == null) { PostalCode = String.Empty; } if (original_Address == null) { original_Address = String.Empty; } if (original_City == null) { original_City = String.Empty; } if (original_Region == null) { original_Region = String.Empty; } if (original_PostalCode == null) { original_PostalCode = String.Empty; } string sqlCmd = "UPDATE Employees " + " SET FirstName = @FirstName, LastName = @LastName, " + " Address = @Address, City = @City, Region = @Region, " + " PostalCode = @PostalCode " + " WHERE EmployeeID = @original_EmployeeID"; SqlConnection conn = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand(sqlCmd, conn); cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName; cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName; cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address; cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City; cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region; cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode; cmd.Parameters.Add("@original_EmployeeID", SqlDbType.Int).Value = original_EmployeeID; cmd.Parameters.Add("@original_FirstName", SqlDbType.VarChar, 10).Value = original_FirstName; cmd.Parameters.Add("@original_LastName", SqlDbType.VarChar, 20).Value = original_LastName; cmd.Parameters.Add("@original_Address", SqlDbType.VarChar, 60).Value = original_Address; cmd.Parameters.Add("@original_City", SqlDbType.VarChar, 15).Value = original_City; cmd.Parameters.Add("@original_Region", SqlDbType.VarChar, 15).Value = original_Region; cmd.Parameters.Add("@original_PostalCode", SqlDbType.VarChar, 10).Value = original_PostalCode; int result = 0; try { conn.Open(); result = cmd.ExecuteNonQuery(); } catch (SqlException e) { // Handle exception. } finally { conn.Close(); } return result; } }
Tambahkan kode berikut ke tampilan Sumber object.aspx:
<%@ Page language="C#" %> <script RunAt="server"> void EmployeesDetailsView_ItemInserted(Object sender, DetailsViewInsertedEventArgs e) { EmployeesGridView.DataBind(); } void EmployeesDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e) { EmployeesGridView.DataBind(); } void EmployeesDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e) { EmployeesGridView.DataBind(); } void EmployeesGridView_OnSelectedIndexChanged(object sender, EventArgs e) { EmployeeDetailsObjectDataSource.SelectParameters["EmployeeID"].DefaultValue = EmployeesGridView.SelectedDataKey.Value.ToString(); EmployeesDetailsView.DataBind(); } void EmployeeDetailsObjectDataSource_OnInserted(object sender, ObjectDataSourceStatusEventArgs e) { EmployeeDetailsObjectDataSource.SelectParameters["EmployeeID"].DefaultValue = e.ReturnValue.ToString(); EmployeesDetailsView.DataBind(); } void EmployeeDetailsObjectDataSource_OnUpdated(object sender, ObjectDataSourceStatusEventArgs e) { if ((int)e.ReturnValue == 0) Msg.Text = "Employee was not updated. Please try again."; } void EmployeeDetailsObjectDataSource_OnDeleted(object sender, ObjectDataSourceStatusEventArgs e) { if ((int)e.ReturnValue == 0) Msg.Text = "Employee was not deleted. Please try again."; } void Page_Load() { Msg.Text = ""; } </script> <html> <body> <form id="Form1" runat="server"> <h3>ObjectDataSource Example</h3> <asp:Label id="Msg" runat="server" ForeColor="Red" /> <asp:ObjectDataSource ID="EmployeesObjectDataSource" runat="server" TypeName="NorthwindData" SortParameterName="SortColumns" EnablePaging="true" SelectCountMethod="SelectCount" StartRowIndexParameterName="StartRecord" MaximumRowsParameterName="MaxRecords" SelectMethod="GetAllEmployees" > </asp:ObjectDataSource> <asp:ObjectDataSource ID="EmployeeDetailsObjectDataSource" runat="server" TypeName="NorthwindData" ConflictDetection="CompareAllValues" OldValuesParameterFormatString="{0}" SelectMethod="GetEmployee" InsertMethod="InsertEmployee" UpdateMethod="UpdateEmployee" DeleteMethod="DeleteEmployee" OnInserted="EmployeeDetailsObjectDataSource_OnInserted" OnUpdated="EmployeeDetailsObjectDataSource_OnUpdated" OnDeleted="EmployeeDetailsObjectDataSource_OnDeleted"> <SelectParameters> <asp:Parameter Name="EmployeeID" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource> <table cellspacing="10"> <tr> <td valign="top"> <asp:GridView ID="EmployeesGridView" DataSourceID="EmployeesObjectDataSource" AutoGenerateColumns="false" AllowSorting="true" AllowPaging="true" PageSize="5" DataKeyNames="EmployeeID" OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged" RunAt="server"> <HeaderStyle backcolor="lightblue" forecolor="black"/> <Columns> <asp:ButtonField Text="Details..." HeaderText="Show Details" CommandName="Select"/> <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" SortExpression="EmployeeID" /> <asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" /> <asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName, FirstName" /> </Columns> </asp:GridView> </td> <td valign="top"> <asp:DetailsView ID="EmployeesDetailsView" DataSourceID="EmployeeDetailsObjectDataSource" AutoGenerateRows="false" EmptyDataText="No records." DataKeyNames="EmployeeID" Gridlines="Both" AutoGenerateInsertButton="true" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" OnItemInserted="EmployeesDetailsView_ItemInserted" OnItemUpdated="EmployeesDetailsView_ItemUpdated" OnItemDeleted="EmployeesDetailsView_ItemDeleted" RunAt="server"> <HeaderStyle backcolor="Navy" forecolor="White"/> <RowStyle backcolor="White"/> <AlternatingRowStyle backcolor="LightGray"/> <EditRowStyle backcolor="LightCyan"/> <Fields> <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/> <asp:BoundField DataField="FirstName" HeaderText="First Name"/> <asp:BoundField DataField="LastName" HeaderText="Last Name"/> <asp:BoundField DataField="Address" HeaderText="Address"/> <asp:BoundField DataField="City" HeaderText="City"/> <asp:BoundField DataField="Region" HeaderText="Region"/> <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/> </Fields> </asp:DetailsView> </td> </tr> </table> </form> </body> </html>
Simpan semua file dan telusuri object.aspx.
Berinteraksi dengan antarmuka dengan melihat detail, mengedit karyawan, menambahkan karyawan, dan menghapus karyawan.