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
Dalam tutorial ini, kita melanjutkan pandangan kita pada kontrol SqlDataSource dan mempelajari cara menentukan kueri berparameter. Parameter dapat ditentukan baik secara deklaratif maupun terprogram, dan dapat ditarik dari sejumlah lokasi seperti querystring, status Sesi, kontrol lain, dan banyak lagi.
Pendahuluan
Dalam tutorial sebelumnya kita melihat cara menggunakan kontrol SqlDataSource untuk mengambil data langsung dari database. Dengan menggunakan wizard Konfigurasikan Sumber Data, kita dapat memilih database dan kemudian: memilih kolom yang akan dikembalikan dari tabel atau tampilan; masukkan pernyataan SQL kustom; atau gunakan prosedur yang disimpan. Baik memilih kolom dari tabel atau tampilan atau memasukkan pernyataan SQL kustom, properti kontrol SqlDataSource ditetapkan SelectCommand pernyataan SQL SELECT ad-hoc yang dihasilkan dan pernyataan inilah SELECT yang dijalankan ketika metode SqlDataSource s Select() dipanggil (baik secara terprogram atau otomatis dari kontrol Web data).
Pernyataan SQL SELECT yang digunakan dalam demo tutorial sebelumnya tidak memiliki WHERE klausa. Dalam sebuah SELECT pernyataan, WHERE klausa dapat digunakan untuk membatasi hasil yang dikembalikan. Misalnya, untuk menampilkan nama produk dengan harga lebih dari $50,00, kita dapat menggunakan kueri berikut:
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
Biasanya, nilai yang digunakan dalam WHERE klausa ditentukan oleh beberapa sumber eksternal, seperti nilai querystring, variabel sesi, atau input pengguna dari kontrol Web di halaman. Idealnya, input tersebut ditentukan melalui penggunaan parameter. Dengan Microsoft SQL Server, parameter dilambangkan menggunakan @parameterName, seperti dalam:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource mendukung kueri berparameter, baik untuk SELECT pernyataan dan INSERT, UPDATE, dan DELETE pernyataan. Selain itu, nilai parameter dapat secara otomatis ditarik dari berbagai sumber querystring, status sesi, kontrol pada halaman, dan sebagainya atau dapat ditetapkan secara terprogram. Dalam tutorial ini, kita akan melihat cara menentukan kueri berparameter serta cara menentukan nilai parameter baik secara deklaratif maupun terprogram.
Nota
Dalam tutorial sebelumnya kami membandingkan ObjectDataSource yang telah menjadi alat pilihan kami selama 46 tutorial pertama dengan SqlDataSource, mencatat kesamaan konseptual mereka. Kesamaan ini juga meluas ke parameter. Parameter ObjectDataSource dipetakan ke parameter input untuk metode di Lapisan Logika Bisnis. Dengan SqlDataSource, parameter ditentukan langsung di dalam kueri SQL. Kedua kontrol memiliki kumpulan parameter untuk Select(), Insert(), , Update()dan Delete() metodenya, dan keduanya dapat memiliki nilai parameter ini yang diisi dari sumber yang telah ditentukan sebelumnya (nilai querystring, variabel sesi, dan sebagainya) atau ditetapkan secara terprogram.
Membuat Kueri Berparameter
Wizard Konfigurasikan Sumber Data kontrol SqlDataSource menawarkan tiga jalan untuk menentukan perintah yang akan dijalankan untuk mengambil catatan database:
- Dengan memilih kolom dari tabel atau tampilan yang ada,
- Dengan memasukkan pernyataan SQL kustom, atau
- Dengan memilih prosedur tersimpan
Saat memilih kolom dari tabel atau tampilan yang ada, parameter untuk WHERE klausa harus ditentukan melalui kotak dialog Tambahkan WHERE Klausa. Namun, saat membuat pernyataan SQL kustom, Anda dapat memasukkan parameter langsung ke dalam WHERE klausa (menggunakan @parameterName untuk menunjukkan setiap parameter). Prosedur tersimpan terdiri dari satu atau beberapa pernyataan SQL, dan pernyataan ini dapat diparameterisasi. Parameter yang digunakan dalam pernyataan SQL, bagaimanapun, harus diteruskan sebagai parameter input ke prosedur tersimpan.
Karena membuat kueri berparameter bergantung pada bagaimana SqlDataSource s ditentukan SelectCommand , mari kita lihat ketiga pendekatan. Untuk memulai, buka ParameterizedQueries.aspx halaman di SqlDataSource folder, seret kontrol SqlDataSource dari Toolbox ke Designer, dan atur ID ke Products25BucksAndUnderDataSource. Selanjutnya, klik tautan Konfigurasikan Sumber Data dari tag pintar kontrol. Pilih database yang akan digunakan (NORTHWINDConnectionString) dan klik Berikutnya.
Langkah 1: Menambahkan Klausa WHERE Saat Memilih Kolom dari Tabel atau Tampilan
Saat memilih data yang akan dikembalikan dari database dengan kontrol SqlDataSource, wizard Konfigurasikan Sumber Data memungkinkan kita untuk memilih kolom untuk dikembalikan dari tabel atau tampilan yang ada (lihat Gambar 1). Melakukannya secara otomatis membangun pernyataan SQL SELECT , yang dikirim ke database saat metode SqlDataSource s dipanggil Select() . Seperti yang kita lakukan di tutorial sebelumnya, pilih tabel Produk dari daftar drop-down dan centang ProductID, ProductName, dan UnitPrice kolom.
Gambar 1: Pilih Kolom yang akan Dikembalikan dari Tabel atau Tampilan (Klik untuk melihat gambar ukuran penuh)
Untuk menyertakan WHERE klausa dalam pernyataan SELECT , klik WHERE tombol, yang memunculkan kotak dialog Tambahkan WHERE Klausa (lihat Gambar 2). Untuk menambahkan parameter untuk membatasi hasil yang dikembalikan oleh SELECT kueri, pertama-tama pilih kolom untuk memfilter data. Selanjutnya, pilih operator yang akan digunakan untuk pemfilteran (=, <, <=, >, dan seterusnya). Terakhir, pilih sumber nilai parameter s, seperti dari string kueri atau status sesi. Setelah mengonfigurasi parameter, klik tombol Tambahkan untuk memasukkannya ke dalam SELECT kueri.
Untuk contoh ini, biarkan s hanya mengembalikan hasil yang nilainya UnitPrice kurang dari atau sama dengan $25.00. Oleh karena itu, pilih UnitPrice dari daftar drop-down Kolom dan <= dari daftar drop-down Operator. Saat menggunakan nilai parameter yang dikodekan secara keras (seperti $25.00) atau jika nilai parameter akan ditentukan secara terprogram, pilih Tidak Ada dari daftar drop-down Sumber. Selanjutnya, masukkan nilai parameter hard-coded di kotak teks Value 25.00 dan selesaikan proses dengan mengklik tombol Tambah.
Gambar 2: Batasi Hasil yang Dikembalikan dari Kotak Dialog Tambahkan WHERE Klausa (Klik untuk melihat gambar ukuran penuh)
Setelah menambahkan parameter, klik OK untuk kembali ke wizard Konfigurasikan Sumber Data. Pernyataan SELECT di bagian bawah wizard sekarang harus menyertakan WHERE klausa dengan parameter bernama @UnitPrice:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Nota
Jika Anda menentukan beberapa kondisi dalam WHERE klausa dari kotak dialog Tambahkan WHERE Klausa, wizard menggabungkannya dengan AND operator. Jika Anda perlu menyertakan klausa ORWHERE (seperti WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) maka Anda harus membuat SELECT pernyataan melalui layar pernyataan SQL kustom.
Selesaikan konfigurasi SqlDataSource (klik Berikutnya, lalu Selesai) lalu periksa markup deklaratif SqlDataSource. Markup sekarang menyertakan koleksi<SelectParameters>, yang menjabarkan sumber untuk parameter di .SelectCommand
<asp:SqlDataSource ID="Products25BucksAndUnderDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products] WHERE ([UnitPrice] <= @UnitPrice)">
<SelectParameters>
<asp:Parameter DefaultValue="25.00" Name="UnitPrice" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
Ketika metode SqlDataSource s Select() dipanggil, UnitPrice nilai parameter (25.00) diterapkan ke @UnitPrice parameter di sebelum SelectCommand dikirim ke database. Hasil bersihnya adalah hanya produk yang kurang dari atau sama dengan $25.00 yang dikembalikan dari Products tabel. Untuk mengonfirmasi ini, tambahkan GridView ke halaman, ikat ke sumber data ini, lalu lihat halaman melalui browser. Anda hanya akan melihat produk yang terdaftar yang kurang dari atau sama dengan $25,00, seperti yang dikonfirmasi oleh Gambar 3.
Gambar 3: Hanya Produk Kurang Dari atau Sama dengan $25.00 yang Ditampilkan (Klik untuk melihat gambar ukuran penuh)
Langkah 2: Menambahkan Parameter ke Pernyataan SQL Kustom
Saat menambahkan pernyataan SQL kustom, Anda dapat memasukkan klausa secara WHERE eksplisit atau menentukan nilai di sel Filter Pembuat Kueri. Untuk menunjukkan hal ini, mari kita tampilkan hanya produk tersebut di GridView yang harganya kurang dari ambang batas tertentu. Mulailah dengan menambahkan Kotak Teks ke ParameterizedQueries.aspx halaman untuk mengumpulkan nilai ambang batas ini dari pengguna. Atur properti TextBox s ke IDMaxPrice. Tambahkan kontrol Web Tombol dan atur propertinya Text ke Tampilkan Produk yang Pencocokan .
Selanjutnya, seret GridView ke halaman dan dari tag pintarnya pilih untuk membuat SqlDataSource baru bernama ProductsFilteredByPriceDataSource. Dari wizard Konfigurasikan Sumber Data, lanjutkan ke layar Tentukan pernyataan SQL kustom atau prosedur tersimpan (lihat Gambar 4) dan masukkan kueri berikut:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
Setelah memasukkan kueri (baik secara manual atau melalui Pembuat Kueri), klik Berikutnya.
Gambar 4: Hanya mengembalikan produk yang kurang dari atau sama dengan nilai parameter (klik untuk melihat gambar ukuran penuh)
Karena kueri menyertakan parameter, layar berikutnya di wizard meminta kita untuk sumber nilai parameter. Pilih Kontrol dari daftar drop-down Sumber parameter dan MaxPrice (nilai kontrol TextBox s ID ) dari daftar drop-down ControlID. Anda juga dapat memasukkan nilai default opsional untuk digunakan jika pengguna belum memasukkan teks apa pun ke MaxPrice dalam Kotak Teks. Untuk saat ini, jangan masukkan nilai default.
Gambar 5: MaxPrice Properti TextBox Text Digunakan sebagai Sumber Parameter (Klik untuk melihat gambar ukuran penuh)
Selesaikan wizard Konfigurasikan Sumber Data dengan mengklik Berikutnya, lalu Selesai. Markup deklaratif untuk GridView, TextBox, Button, dan SqlDataSource sebagai berikut:
Maximum price:
$<asp:TextBox ID="MaxPrice" runat="server" Columns="5" />
<asp:Button ID="DisplayProductsLessThanButton" runat="server"
Text="Display Matching Products" />
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataSourceID="ProductsFilteredByPriceDataSource" EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
HtmlEncode="False" DataFormatString="{0:c}"
SortExpression="UnitPrice" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsFilteredByPriceDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT ProductName, UnitPrice
FROM Products WHERE UnitPrice <= @MaximumPrice">
<SelectParameters>
<asp:ControlParameter ControlID="MaxPrice" Name="MaximumPrice"
PropertyName="Text" />
</SelectParameters>
</asp:SqlDataSource>
Perhatikan bahwa parameter dalam bagian SqlDataSource s <SelectParameters> adalah ControlParametera , yang mencakup properti tambahan seperti ControlID dan PropertyName. Saat metode SqlDataSource s dipanggilSelect(), ControlParameter mengambil nilai dari properti kontrol Web yang ditentukan dan menetapkannya ke parameter yang sesuai di .SelectCommand Dalam contoh ini, MaxPrice properti s Text digunakan sebagai @MaxPrice nilai parameter.
Luangkan waktu sejenak untuk melihat halaman ini melalui browser. Saat pertama kali mengunjungi halaman atau setiap kali MaxPrice TextBox tidak memiliki nilai, tidak ada rekaman yang ditampilkan di GridView.
Gambar 6: Tidak Ada Catatan yang Ditampilkan Saat MaxPrice Kotak Teks Kosong (Klik untuk melihat gambar ukuran penuh)
Alasan tidak ada produk yang ditampilkan adalah karena, secara default, string kosong untuk nilai parameter dikonversi menjadi nilai database NULL . Karena perbandingan [UnitPrice] <= NULL selalu dievaluasi sebagai False, tidak ada hasil yang ditampilkan.
Masukkan nilai ke dalam kotak teks, seperti 5,00, dan klik tombol Tampilkan Produk yang Cocok. Pada postback, SqlDataSource memberi tahu GridView bahwa salah satu sumber parameternya telah berubah. Akibatnya, GridView mengikat ulang ke SqlDataSource, menampilkan produk tersebut kurang dari atau sama dengan $5,00.
Gambar 7: Produk Kurang Dari atau Sama dengan $5.00 Ditampilkan (Klik untuk melihat gambar ukuran penuh)
Awalnya Menampilkan Semua Produk
Alih-alih tidak menampilkan produk saat halaman pertama kali dimuat, kami mungkin ingin menampilkan semua produk. Salah satu cara untuk mencantumkan semua produk setiap kali MaxPrice Kotak Teks kosong adalah dengan mengatur nilai default parameter ke beberapa nilai yang sangat tinggi, seperti 1000000, karena tidak mungkin Pedagang Northwind akan memiliki inventaris yang harga satuannya melebihi $ 1.000.000. Namun, pendekatan ini picik dan mungkin tidak berhasil dalam situasi lain.
Dalam tutorial sebelumnya - Parameter Deklaratif dan Pemfilteran Master/Detail Dengan DropDownList kami dihadapkan pada masalah serupa. Solusi kami di sana adalah menempatkan logika ini di Lapisan Logika Bisnis. Secara khusus, BLL memeriksa nilai masuk dan, jika itu atau NULL beberapa nilai cadangan, panggilan dirutekan ke metode DAL yang mengembalikan semua rekaman. Jika nilai masuk adalah nilai pemfilteran normal, panggilan dilakukan ke metode DAL yang mengeksekusi pernyataan SQL yang menggunakan klausa berparameter WHERE dengan nilai yang disediakan.
Sayangnya, kami melewati arsitektur saat menggunakan SqlDataSource. Sebagai gantinya, kita perlu menyesuaikan pernyataan SQL untuk secara cerdas mengambil semua catatan jika parameternya @MaximumPrice atau NULL beberapa nilai cadangan. Untuk latihan ini, biarkan s memilikinya sehingga jika parameternya @MaximumPrice sama dengan -1.0, maka semua catatan harus dikembalikan (-1.0 berfungsi sebagai nilai cadangan karena tidak ada produk yang dapat memiliki nilai negatif UnitPrice ). Untuk mencapai ini kita dapat menggunakan pernyataan SQL berikut:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
Klausa ini WHERE mengembalikan semua rekaman jika parameternya @MaximumPrice sama dengan -1.0. Jika nilai parameter tidak -1.0, hanya produk UnitPrice yang kurang dari atau sama dengan @MaximumPrice nilai parameter yang dikembalikan. Dengan mengatur nilai @MaximumPrice default parameter ke -1.0, pada pemuatan halaman pertama (atau setiap kali MaxPrice Kotak Teks kosong), @MaximumPrice akan memiliki nilai dan -1.0 semua produk akan ditampilkan.
Gambar 8: Sekarang Semua Produk Ditampilkan Saat MaxPrice Kotak Teks Kosong (Klik untuk melihat gambar ukuran penuh)
Ada beberapa peringatan yang perlu diperhatikan dengan pendekatan ini. Pertama, sadari bahwa tipe data parameter s disimpulkan oleh penggunaannya dalam kueri SQL. Jika Anda mengubah WHERE klausa dari @MaximumPrice = -1.0 ke @MaximumPrice = -1, runtime memperlakukan parameter sebagai bilangan bulat. Jika Anda kemudian mencoba menetapkan MaxPrice TextBox ke nilai desimal (seperti 5.00 ), kesalahan akan terjadi karena tidak dapat mengonversi 5.00 ke bilangan bulat. Untuk memperbaikinya, pastikan Anda menggunakan @MaximumPrice = -1.0WHERE klausa atau, lebih baik lagi, atur ControlParameter properti objek s Type ke Decimal .
Kedua, dengan menambahkan klausa OR @MaximumPrice = -1.0 ke WHERE klausa, mesin kueri tidak dapat menggunakan indeks pada UnitPrice (dengan asumsi ada satu), sehingga menghasilkan pemindaian tabel. Hal ini dapat memengaruhi performa jika ada jumlah rekaman yang cukup besar dalam Products tabel. Pendekatan yang lebih baik adalah memindahkan logika ini ke prosedur tersimpan di mana IF pernyataan akan melakukan SELECT kueri dari Products tabel tanpa WHERE klausa ketika semua catatan perlu dikembalikan atau yang WHERE klausanya hanya UnitPrice berisi kriteria, sehingga indeks dapat digunakan.
Langkah 3: Membuat dan Menggunakan Prosedur Tersimpan Berparameter
Prosedur tersimpan dapat mencakup serangkaian parameter input yang kemudian dapat digunakan dalam pernyataan SQL yang ditentukan dalam prosedur tersimpan. Saat mengonfigurasi SqlDataSource untuk menggunakan prosedur tersimpan yang menerima parameter input, nilai parameter ini dapat ditentukan menggunakan teknik yang sama seperti dengan pernyataan SQL ad-hoc.
Untuk mengilustrasikan penggunaan prosedur tersimpan di SqlDataSource, mari s membuat prosedur tersimpan baru dalam database Northwind bernama GetProductsByCategory, yang menerima parameter bernama @CategoryID dan mengembalikan semua kolom produk CategoryID yang kolomnya cocok dengan @CategoryID. Untuk membuat prosedur tersimpan, buka Server Explorer dan telusuri NORTHWND.MDF database. (Jika Anda tidak melihat Server Explorer, munculkan dengan membuka menu View dan memilih opsi Server Explorer.)
Dari NORTHWND.MDF database, klik kanan pada folder Prosedur Tersimpan, pilih Tambahkan Prosedur Tersimpan Baru, dan masukkan sintaks berikut:
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
Klik ikon Simpan (atau Ctrl+S) untuk menyimpan prosedur yang disimpan. Anda dapat menguji prosedur tersimpan dengan mengklik kanan dari folder Prosedur Tersimpan dan memilih Jalankan. Ini akan meminta Anda untuk parameter prosedur tersimpan (@CategoryID, dalam hal ini), setelah itu hasilnya akan ditampilkan di jendela Output.
Gambar 9: Prosedur Tersimpan GetProductsByCategory saat Dijalankan dengan a @CategoryID of 1 (Klik untuk melihat gambar ukuran penuh)
Mari gunakan prosedur tersimpan ini untuk menampilkan semua produk dalam kategori Minuman di GridView. Tambahkan GridView baru ke halaman dan ikat ke SqlDataSource baru bernama BeverageProductsDataSource. Lanjutkan ke layar Tentukan pernyataan SQL kustom atau prosedur tersimpan, pilih tombol radio Prosedur tersimpan, dan pilih GetProductsByCategory prosedur tersimpan dari daftar drop-down.
Gambar 10: Pilih Prosedur Tersimpan GetProductsByCategory dari Daftar Drop-Down (Klik untuk melihat gambar ukuran penuh)
Karena prosedur tersimpan menerima parameter input (@CategoryID), mengklik Berikutnya akan meminta kita untuk menentukan sumber untuk nilai s parameter ini. Minuman CategoryID adalah 1, jadi tinggalkan daftar drop-down sumber parameter di Tidak ada dan masukkan 1 ke dalam kotak teks DefaultValue.
Gambar 11: Gunakan nilai Hard-Coded 1 untuk mengembalikan produk dalam kategori minuman (klik untuk melihat gambar ukuran penuh)
Seperti yang ditunjukkan markup deklaratif berikut, saat menggunakan prosedur tersimpan, properti SqlDataSource s SelectCommand diatur ke nama prosedur tersimpan dan SelectCommandType properti diatur ke StoredProcedure, yang menunjukkan bahwa itu SelectCommand adalah nama prosedur tersimpan daripada pernyataan SQL ad-hoc.
<asp:SqlDataSource ID="BeverageProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter DefaultValue="1" Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
Uji halaman di browser. Hanya produk yang termasuk dalam kategori Minuman yang ditampilkan, meskipun semua bidang produk ditampilkan karena prosedur tersimpan GetProductsByCategory mengembalikan semua kolom dari Products tabel. Kita dapat, tentu saja, membatasi atau menyesuaikan bidang yang ditampilkan di GridView dari kotak dialog Edit Kolom GridView.
Gambar 12: Semua Minuman Ditampilkan (Klik untuk melihat gambar ukuran penuh)
Langkah 4: Memanggil Pernyataan Select() SqlDataSource secara Terprogram
Contoh yang telah kita lihat dalam tutorial sebelumnya dan tutorial ini sejauh ini telah mengikat kontrol SqlDataSource langsung ke GridView. Data kontrol SqlDataSource, bagaimanapun, dapat diakses secara terprogram dan dihitung dalam kode. Ini bisa sangat berguna ketika Anda perlu mengkueri data untuk memeriksanya, tetapi tidak perlu menampilkannya. Daripada harus menulis semua kode ADO.NET boilerplate untuk terhubung ke database, menentukan perintah, dan mengambil hasilnya, Anda dapat membiarkan SqlDataSource menangani kode monoton ini.
Untuk mengilustrasikan bekerja dengan data SqlDataSource secara terprogram, bayangkan atasan Anda telah mendekati Anda dengan permintaan untuk membuat halaman web yang menampilkan nama kategori yang dipilih secara acak dan produk terkaitnya. Artinya, ketika pengguna mengunjungi halaman ini, kami ingin memilih kategori secara acak dari Categories tabel, menampilkan nama kategori, lalu mencantumkan produk yang termasuk dalam kategori tersebut.
Untuk mencapai ini, kita membutuhkan dua kontrol SqlDataSource: satu untuk mengambil kategori acak dari Categories tabel dan satu lagi untuk mendapatkan produk kategori s. Kita akan membangun SqlDataSource yang mengambil rekaman kategori acak dalam langkah ini; Langkah 5 melihat pembuatan SqlDataSource yang mengambil produk kategori s.
Mulailah dengan menambahkan SqlDataSource ke ParameterizedQueries.aspx dan atur ke IDRandomCategoryDataSource. Konfigurasikan sehingga menggunakan kueri SQL berikut:
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID() mengembalikan rekaman yang diurutkan dalam urutan acak (lihat Menggunakan NEWID() untuk Mengurutkan Catatan Secara Acak).
SELECT TOP 1 mengembalikan rekaman pertama dari kumpulan hasil. Bersama-sama, kueri ini mengembalikan CategoryID nilai kolom dan CategoryName dari satu kategori yang dipilih secara acak.
Untuk menampilkan nilai kategori s CategoryName , tambahkan kontrol Web Label ke halaman, atur propertinya ID ke CategoryNameLabel, dan hapus propertinya Text . Untuk mengambil data secara terprogram dari kontrol SqlDataSource, kita perlu memanggil metodenya Select() . Metode ini Select() mengharapkan satu parameter input jenis DataSourceSelectArguments, yang menentukan bagaimana data harus dikirim pesan sebelum dikembalikan. Ini dapat mencakup instruksi tentang pengurutan dan pemfilteran data, dan digunakan oleh kontrol Web data saat mengurutkan atau menelusuri data dari kontrol SqlDataSource. Namun, untuk contoh kita, kita tidak perlu data dimodifikasi sebelum dikembalikan, dan oleh karena itu akan masuk ke DataSourceSelectArguments.Empty dalam objek.
Metode ini Select() mengembalikan objek yang mengimplementasikan IEnumerable. Jenis yang tepat yang ditampilkan bergantung pada nilai properti kontrol SqlDataSource sDataSourceMode. Seperti yang dibahas dalam tutorial sebelumnya, properti ini dapat diatur ke nilai salah satu DataSet atau DataReader. Jika diatur ke DataSet, metode mengembalikan Select() objek DataView ; jika diatur ke DataReader, metode akan mengembalikan objek yang mengimplementasikan IDataReader. Karena RandomCategoryDataSource SqlDataSource memiliki DataSourceMode properti yang diatur ke DataSet (default), kita akan bekerja dengan objek DataView.
Kode berikut mengilustrasikan cara mengambil rekaman dari RandomCategoryDataSource SqlDataSource sebagai DataView serta cara membaca CategoryName nilai kolom dari baris DataView pertama:
protected void Page_Load(object sender, EventArgs e)
{
// Get the data from the SqlDataSource as a DataView
DataView randomCategoryView =
(DataView)RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty);
if (randomCategoryView.Count > 0)
{
// Assign the CategoryName value to the Label
CategoryNameLabel.Text =
string.Format("Here are Products in the {0} Category...",
randomCategoryView[0]["CategoryName"].ToString());
}
}
randomCategoryView[0] mengembalikan yang pertama DataRowView di DataView.
randomCategoryView[0]["CategoryName"] mengembalikan nilai CategoryName kolom di baris pertama ini. Perhatikan bahwa DataView diketik secara longgar. Untuk mereferensikan nilai kolom tertentu kita perlu meneruskan nama kolom sebagai string ( CategoryName, dalam hal ini). Gambar 13 menunjukkan pesan yang ditampilkan saat CategoryNameLabel melihat halaman. Tentu saja, nama kategori sebenarnya yang ditampilkan dipilih secara acak oleh RandomCategoryDataSource SqlDataSource pada setiap kunjungan ke halaman (termasuk postback).
Gambar 13: Nama Kategori yang Dipilih Secara Acak Ditampilkan (Klik untuk melihat gambar ukuran penuh)
Nota
Jika properti kontrol SqlDataSource s DataSourceMode telah diatur ke DataReader, nilai yang ditampilkan dari Select() metode perlu ditransmisikan ke IDataReader. Untuk membaca CategoryName nilai kolom dari baris pertama, kita menggunakan kode seperti:
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
Dengan SqlDataSource secara acak memilih kategori, kami siap untuk menambahkan GridView yang mencantumkan produk kategori s.
Nota
Alih-alih menggunakan kontrol Label Web untuk menampilkan nama kategori, kita bisa menambahkan FormView atau DetailsView ke halaman, mengikatnya ke SqlDataSource. Namun, menggunakan Label, memungkinkan kami untuk mengeksplorasi cara memanggil pernyataan SqlDataSource secara Select() terprogram dan bekerja dengan data yang dihasilkan dalam kode.
Langkah 5: Menetapkan Nilai Parameter Secara Terprogram
Semua contoh yang telah kita lihat sejauh ini dalam tutorial ini telah menggunakan nilai parameter hard-code atau yang diambil dari salah satu sumber parameter yang telah ditentukan sebelumnya (nilai querystring, kontrol Web pada halaman, dan sebagainya). Namun, parameter kontrol SqlDataSource juga dapat diatur secara terprogram. Untuk melengkapi contoh kita saat ini, kita memerlukan SqlDataSource yang mengembalikan semua produk yang termasuk dalam kategori tertentu. SqlDataSource ini akan memiliki parameter yang CategoryID nilainya perlu diatur berdasarkan CategoryID nilai kolom yang dikembalikan oleh RandomCategoryDataSource SqlDataSource di Page_Load penanganan peristiwa.
Mulailah dengan menambahkan GridView ke halaman dan mengikatnya ke SqlDataSource baru bernama ProductsByCategoryDataSource. Sama seperti yang kita lakukan di Langkah 3, konfigurasikan SqlDataSource sehingga memanggil prosedur yang disimpan GetProductsByCategory . Biarkan daftar drop-down sumber parameter diatur ke Tidak Ada, tetapi jangan masukkan nilai default, karena kita akan mengatur nilai default ini secara terprogram.
Gambar 14: Jangan Tentukan Sumber Parameter atau Nilai Default (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard SqlDataSource, markup deklaratif yang dihasilkan akan terlihat mirip dengan berikut ini:
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
Kita dapat menetapkan DefaultValueCategoryID parameter secara terprogram di penanganan Page_Load peristiwa:
// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
randomCategoryView[0]["CategoryID"].ToString();
Dengan penambahan ini, halaman menyertakan GridView yang menampilkan produk yang terkait dengan kategori yang dipilih secara acak.
Gambar 15: Jangan Tentukan Sumber Parameter atau Nilai Default (Klik untuk melihat gambar ukuran penuh)
Ringkasan
SqlDataSource memungkinkan pengembang halaman untuk menentukan kueri berparameter yang nilai parameternya dapat dikodekan secara keras, ditarik dari sumber parameter yang telah ditentukan sebelumnya, atau ditetapkan secara terprogram. Dalam tutorial ini kita melihat cara membuat kueri berparameter dari wizard Konfigurasikan Sumber Data untuk kueri SQL ad-hoc dan prosedur tersimpan. Kami juga melihat penggunaan sumber parameter hard-coded, kontrol Web sebagai sumber parameter, dan menentukan nilai parameter secara terprogram.
Seperti halnya ObjectDataSource, SqlDataSource juga menyediakan kemampuan untuk memodifikasi data yang mendasarinya. Dalam tutorial berikutnya kita akan melihat cara mendefinisikan INSERT, UPDATE, dan DELETE pernyataan dengan SqlDataSource. Setelah pernyataan ini ditambahkan, kita dapat memanfaatkan fitur menyisipkan, mengedit, dan menghapus bawaan yang melekat pada kontrol GridView, DetailsView, dan FormView.
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 Scott Clyde, Randell Schmidt, dan Ken Pespisa. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.
@CategoryID 1" />