Bagikan melalui


Menggunakan Kueri Berparameter dengan SqlDataSource (VB)

oleh Scott Mitchell

Unduh PDF

Dalam tutorial ini, kami melanjutkan melihat 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.

Pengantar

Dalam tutorial sebelumnya kita melihat cara menggunakan kontrol SqlDataSource untuk mengambil data langsung dari database. Dengan menggunakan wizard Konfigurasi Sumber Data, kita dapat memilih database lalu: pilih kolom yang akan dikembalikan dari tabel atau tampilan; masukkan pernyataan SQL kustom; atau gunakan prosedur tersimpan. Baik memilih kolom dari tabel atau tampilan atau memasukkan pernyataan SQL kustom, properti kontrol SelectCommand SqlDataSource diberi pernyataan SQL SELECT ad-hoc yang dihasilkan dan pernyataan inilah SELECT yang dijalankan saat metode SqlDataSource dipanggil Select() (baik secara terprogram atau otomatis dari kontrol Web data).

Pernyataan SQL SELECT yang digunakan dalam demo tutorial sebelumnya tidak memiliki WHERE klausa. Dalam pernyataan SELECT , WHERE klausul dapat digunakan untuk membatasi hasil yang dikembalikan. Misalnya, untuk menampilkan nama produk dengan biaya lebih dari $50,00, kita dapat menggunakan kueri berikut:

SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00

Biasanya, nilai yang digunakan dalam WHERE klausul 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 ditandai menggunakan @parameterName, seperti dalam:

SELECT ProductName
FROM Products
WHERE UnitPrice > @Price

SqlDataSource mendukung kueri berparameter, baik untuk SELECT pernyataan dan INSERTpernyataan , UPDATE, dan DELETE . 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.

Catatan

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 dalam kueri SQL. Kedua kontrol memiliki kumpulan parameter untuk Select()metode , , Insert(), Update()dan Delete() mereka, 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 Konfigurasi Sumber Data kontrol SqlDataSource menawarkan tiga jalan untuk menentukan perintah yang akan dijalankan untuk mengambil rekaman database:

  • Dengan memilih kolom dari tabel atau tampilan yang sudah ada,
  • Dengan memasukkan pernyataan SQL kustom, atau
  • Dengan memilih prosedur tersimpan

Saat memilih kolom dari tabel atau tampilan yang sudah 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 klausul (menggunakan @parameterName untuk menunjukkan setiap parameter). Prosedur tersimpan terdiri dari satu atau beberapa pernyataan SQL, dan pernyataan ini dapat diparameterkan. Parameter yang digunakan dalam pernyataan SQL, bagaimanapun, harus diteruskan sebagai parameter input ke prosedur tersimpan.

Karena membuat kueri berparameter tergantung pada bagaimana SqlDataSource ditentukan SelectCommand , mari kita lihat ketiga pendekatan tersebut. Untuk memulai, buka ParameterizedQueries.aspx halaman di SqlDataSource folder, seret kontrol SqlDataSource dari Kotak Alat ke Designer, dan atur ID ke Products25BucksAndUnderDataSource. Selanjutnya, klik tautan Konfigurasi 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 Konfigurasi Sumber Data memungkinkan kami memilih kolom untuk dikembalikan dari tabel atau tampilan yang sudah ada (lihat Gambar 1). Melakukannya secara otomatis membangun pernyataan SQL SELECT , yang merupakan apa yang dikirim ke database ketika metode SqlDataSource dipanggil Select() . Seperti yang kami lakukan di tutorial sebelumnya, pilih tabel Produk dari daftar drop-down dan periksa ProductIDkolom , ProductName, dan UnitPrice .

Pilih Kolom untuk Dikembalikan dari Tabel atau Tampilan

Gambar 1: Pilih Kolom untuk Dikembalikan dari Tabel atau Tampilan (Klik untuk melihat gambar ukuran penuh)

Untuk menyertakan WHERE klausa dalam SELECT pernyataan, klik tombol WHERE , yang memunculkan kotak dialog Tambahkan WHERE Klausa (lihat Gambar 2). Untuk menambahkan parameter guna membatasi hasil yang dikembalikan oleh kueri, pertama-tama SELECT pilih kolom untuk memfilter data. Selanjutnya, pilih operator yang akan digunakan untuk pemfilteran (=, <, <=, >, dan sebagainya). Terakhir, pilih sumber nilai parameter, seperti dari querystring atau status sesi. Setelah mengonfigurasi parameter, klik tombol Tambahkan untuk menyertakannya dalam SELECT kueri.

Untuk contoh ini, mari kita hanya mengembalikan hasil tersebut UnitPrice di mana nilainya 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 permanen (seperti $25,00) atau jika nilai parameter akan ditentukan secara terprogram, pilih Tidak Ada dari daftar drop-down Sumber. Selanjutnya, masukkan nilai parameter yang dikodekan secara permanen di kotak teks Nilai 25.00 dan selesaikan proses dengan mengklik tombol Tambahkan.

Batasi Hasil yang Dikembalikan dari Kotak Dialog Tambahkan Klausa WHERE

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 Konfigurasi Sumber Data. Pernyataan SELECT di bagian bawah wizard sekarang harus menyertakan WHERE klausul dengan parameter bernama @UnitPrice:

SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)

Catatan

Jika Anda menentukan beberapa kondisi dalam WHERE klausa dari kotak dialog Tambahkan WHERE Klausa, wizard menggabungkannya dengan AND operator. Jika Anda perlu menyertakan OR dalam WHERE klausul (seperti WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) maka Anda harus membangun SELECT pernyataan melalui layar pernyataan SQL kustom.

Selesaikan konfigurasi SqlDataSource (klik Berikutnya, lalu Selesai) lalu periksa markup deklaratif SqlDataSource. Markup sekarang menyertakan <SelectParameters> koleksi, yang mengeja 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 dipanggil Select() , UnitPrice nilai parameter (25.00) diterapkan ke @UnitPrice parameter dalam SelectCommand sebelum dikirim ke database. Hasil bersihnya adalah hanya produk yang kurang dari atau sama dengan $25,00 yang dikembalikan dari Products tabel. Untuk mengonfirmasi hal ini, tambahkan GridView ke halaman, ikat ke sumber data ini, lalu lihat halaman melalui browser. Anda hanya akan melihat produk-produk tersebut tercantum yang kurang dari atau sama dengan $25,00, seperti yang dikonfirmasi Gambar 3.

Hanya Produk Yang Kurang dari atau Sama dengan $25,00 yang Ditampilkan

Gambar 3: Hanya Produk Yang 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 WHERE klausa secara eksplisit atau menentukan nilai di sel Filter Penyusun Kueri. Untuk menunjukkan hal ini, mari kita tampilkan hanya produk-produk tersebut di GridView yang harganya kurang dari ambang batas tertentu. Mulailah dengan menambahkan Kotak Teks ke ParameterizedQueries.aspx halaman untuk mengumpulkan nilai ambang ini dari pengguna. Atur properti TextBox ID ke MaxPrice. Tambahkan kontrol Web Tombol dan atur propertinya Text ke Tampilkan Produk yang Cocok.

Selanjutnya, seret GridView ke halaman dan dari tag pintarnya pilih untuk membuat SqlDataSource baru bernama ProductsFilteredByPriceDataSource. Dari wizard Konfigurasi Sumber Data, lanjutkan ke layar Tentukan pernyataan SQL kustom atau prosedur tersimpan (lihat Gambar 4) dan masukkan kueri berikut ini:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0

Setelah memasukkan kueri (baik secara manual atau melalui Penyusun Kueri), klik Berikutnya.

Hanya Mengembalikan Produk Tersebut Kurang dari atau Sama dengan Nilai Parameter

Gambar 4: Hanya Mengembalikan Produk Tersebut Kurang dari atau Sama dengan Nilai Parameter (Klik untuk melihat gambar ukuran penuh)

Karena kueri menyertakan parameter, layar berikutnya dalam wizard meminta sumber nilai parameter. Pilih Kontrol dari daftar drop-down Sumber parameter dan MaxPrice (nilai kontrol ID Kotak Teks) dari daftar drop-down ControlID. Anda juga dapat memasukkan nilai default opsional untuk digunakan dalam kasus di mana pengguna belum memasukkan teks apa pun ke MaxPrice dalam Kotak Teks. Untuk saat ini, jangan masukkan nilai default.

Properti Teks Kotak Teks MaxPrice Digunakan sebagai Sumber Parameter

Gambar 5: MaxPrice Properti Kotak Text Teks Digunakan sebagai Sumber Parameter (Klik untuk melihat gambar ukuran penuh)

Selesaikan wizard Konfigurasi Sumber Data dengan mengklik Berikutnya, lalu Selesai. Markup deklaratif untuk GridView, TextBox, Button, dan SqlDataSource mengikuti:

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 adalah <SelectParameters>ControlParameter, yang mencakup properti tambahan seperti ControlID dan PropertyName. Ketika metode SqlDataSource Select() dipanggil, ControlParameter mengambil nilai dari properti kontrol Web yang ditentukan dan menetapkannya ke parameter yang sesuai di SelectCommand. Dalam contoh ini, MaxPrice properti Teks digunakan sebagai @MaxPrice nilai parameter.

Luangkan waktu satu menit untuk melihat halaman ini melalui browser. Saat pertama kali mengunjungi halaman atau setiap kali MaxPrice Kotak Teks tidak memiliki nilai, tidak ada rekaman yang ditampilkan di GridView.

Tidak Ada Rekaman yang Ditampilkan Saat Kotak Teks MaxPrice Kosong

Gambar 6: Tidak Ada Rekaman 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 dikembalikan.

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 kembali ke SqlDataSource, menampilkan produk-produk tersebut kurang dari atau sama dengan $5,00.

Produk Kurang dari atau Sama dengan $5,00 Ditampilkan

Gambar 7: Produk Kurang Dari atau Sama dengan $5,00 Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Awalnya Menampilkan Semua Produk

Daripada tidak menampilkan produk ketika halaman pertama kali dimuat, kami mungkin ingin menampilkan semua produk. Salah satu cara untuk mencantumkan semua produk setiap kali MaxPrice TextBox kosong adalah dengan mengatur nilai default parameter ke beberapa nilai yang sangat tinggi, seperti 1000000, karena tidak mungkin Northwind Traders akan pernah memiliki inventori yang harga satuannya melebihi $1.000.000. Namun, pendekatan ini bersifat singkat dan mungkin tidak berfungsi dalam situasi lain.

Dalam tutorial sebelumnya - Parameter Deklaratif dan Pemfilteran Master/Detail Dengan DropDownList kami dihadapkan dengan masalah serupa. Solusi kami ada untuk menempatkan logika ini di Lapisan Logika Bisnis. Secara khusus, BLL memeriksa nilai masuk dan, jika itu NULL atau nilai yang dipesan, panggilan dirutekan ke metode DAL yang mengembalikan semua rekaman. Jika nilai masuk adalah nilai pemfilteran normal, panggilan dilakukan ke metode DAL yang menjalankan pernyataan SQL yang menggunakan klausa parameter WHERE dengan nilai yang disediakan.

Sayangnya, kami melewati arsitektur saat menggunakan SqlDataSource. Sebagai gantinya, kita perlu menyesuaikan pernyataan SQL untuk secara cerdas mengambil semua rekaman jika @MaximumPrice parameter adalah NULL atau beberapa nilai yang dipesan. Untuk latihan ini, mari kita miliki sehingga jika @MaximumPrice parameter sama dengan -1.0, maka semua rekaman akan dikembalikan (-1.0 berfungsi sebagai nilai yang dipesan karena tidak ada produk yang dapat memiliki nilai negatif UnitPrice ). Untuk mencapai hal 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 @MaximumPrice parameter sama dengan -1.0. Jika nilai parameter bukan -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 TextBox kosong), @MaximumPrice akan memiliki nilai -1.0 dan semua produk akan ditampilkan.

Sekarang Semua Produk Ditampilkan Saat Kotak Teks MaxPrice Kosong

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 jenis data parameter 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.0 dalam WHERE klausa atau, lebih baik lagi, atur ControlParameter properti objek ke Type Desimal .

Kedua, dengan menambahkan OR @MaximumPrice = -1.0 ke WHERE klausul , mesin kueri tidak dapat menggunakan indeks pada UnitPrice (dengan asumsi ada), sehingga menghasilkan pemindaian tabel. Ini dapat berdampak pada performa jika ada sejumlah besar rekaman 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 klausul ketika semua rekaman perlu dikembalikan atau yang klausulnya WHERE hanya UnitPrice berisi kriteria, sehingga indeks dapat digunakan.

Langkah 3: Membuat dan Menggunakan Prosedur Tersimpan Berparameter

Prosedur tersimpan dapat mencakup sekumpulan 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 pernyataan SQL ad-hoc.

Untuk mengilustrasikan menggunakan prosedur tersimpan di SqlDataSource, mari kita buat prosedur tersimpan baru di database Northwind bernama GetProductsByCategory, yang menerima parameter bernama @CategoryID dan mengembalikan semua kolom produk yang kolomnya CategoryID cocok @CategoryID. Untuk membuat prosedur tersimpan, buka Penjelajah Server dan telusuri paling detail database NORTHWND.MDF . (Jika Anda tidak melihat Server Explorer, munculkan dengan masuk ke menu Tampilan 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 tersimpan. 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 instans ini), setelah itu hasilnya akan ditampilkan di jendela Output.

Prosedur Tersimpan GetProductsByCategory saat Dijalankan dengan rentang <class= @CategoryID 1" />

Gambar 9: GetProductsByCategory Prosedur Tersimpan saat Dijalankan dengan @CategoryID 1 (Klik untuk melihat gambar ukuran penuh)

Mari kita gunakan prosedur tersimpan ini untuk menampilkan semua produk dalam kategori Minuman dalam 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 prosedur tersimpan GetProductsByCategory dari daftar drop-down.

Pilih Prosedur Tersimpan GetProductsByCategory dari Daftar Drop-Down

Gambar 10: Pilih GetProductsByCategory Prosedur Tersimpan dari Daftar Drop-Down (Klik untuk melihat gambar ukuran penuh)

Karena prosedur tersimpan menerima parameter input (@CategoryID), mengklik Berikutnya meminta kami untuk menentukan sumber untuk nilai parameter ini. Minuman CategoryID adalah 1, jadi tinggalkan daftar drop-down Sumber parameter di Tidak Ada dan masukkan 1 ke dalam kotak teks DefaultValue.

Gunakan Nilai Hard-Coded 1 untuk Mengembalikan Produk dalam Kategori Minuman

Gambar 11: Gunakan Nilai Hard-Coded 1 untuk Mengembalikan Produk dalam Kategori Minuman (Klik untuk melihat gambar ukuran penuh)

Seperti yang ditunjukkan oleh markup deklaratif berikut, saat menggunakan prosedur tersimpan, properti SqlDataSource s SelectCommand diatur ke nama prosedur tersimpan dan SelectCommandType properti diatur ke StoredProcedure, menunjukkan bahwa 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 GetProductsByCategory prosedur tersimpan mengembalikan semua kolom dari Products tabel. Tentu saja, kita bisa membatasi atau menyesuaikan bidang yang ditampilkan di GridView dari kotak dialog Edit Kolom GridView.

Semua Minuman Ditampilkan

Gambar 12: Semua Minuman Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Langkah 4: Secara Terprogram Memanggil Pernyataan Select() SqlDataSource

Contoh yang telah kita lihat dalam tutorial sebelumnya dan tutorial ini sejauh ini memiliki kontrol SqlDataSource yang terikat langsung ke GridView. Namun, data kontrol SqlDataSource dapat diakses dan dijumlahkan secara terprogram 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 bahwa atasan Anda telah mendekati Anda dengan permintaan untuk membuat halaman web yang menampilkan nama kategori yang dipilih secara acak dan produk terkait. Artinya, ketika pengguna mengunjungi halaman ini, kami ingin secara acak memilih kategori dari Categories tabel, menampilkan nama kategori, lalu mencantumkan produk milik kategori tersebut.

Untuk mencapai hal ini, kita perlu dua kontrol SqlDataSource satu untuk mengambil kategori acak dari Categories tabel dan yang lain untuk mendapatkan kategori produk. Kita akan membangun SqlDataSource yang mengambil rekaman kategori acak dalam langkah ini; Langkah 5 melihat kerajinan SqlDataSource yang mengambil kategori produk.

Mulailah dengan menambahkan SqlDataSource ke ParameterizedQueries.aspx dan atur ID ke RandomCategoryDataSource. 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 Rekaman Secara Acak). SELECT TOP 1 mengembalikan rekaman pertama dari kumpulan hasil. Disatukan CategoryID , kueri ini mengembalikan nilai kolom dan CategoryName dari satu kategori yang dipilih secara acak.

Untuk menampilkan nilai kategori 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() . MetodeSelect() mengharapkan parameter input tunggal jenis DataSourceSelectArguments, yang menentukan bagaimana data harus dikirimkan sebelum dikembalikan. Ini dapat mencakup instruksi tentang pengurutan dan pemfilteran data, dan digunakan oleh kontrol Web data saat mengurutkan atau menomori data dari kontrol SqlDataSource. Namun, sebagai contoh, kami tidak memerlukan data untuk dimodifikasi sebelum dikembalikan, dan oleh karena itu akan meneruskan DataSourceSelectArguments.Empty objek .

Metode Select() mengembalikan objek yang mengimplementasikan IEnumerable. Jenis presisi yang dikembalikan tergantung pada nilai properti kontrol DataSourceModeSqlDataSource. Seperti yang dibahas dalam tutorial sebelumnya, properti ini dapat diatur ke nilai baik DataSet atau DataReader. Jika diatur ke DataSet, Select() metode mengembalikan objek DataView ; jika diatur ke DataReader, maka akan mengembalikan objek yang mengimplementasikan IDataReader. RandomCategoryDataSource Karena SqlDataSource memiliki properti yang DataSourceMode diatur ke DataSet (default), kami akan bekerja dengan objek DataView.

Kode berikut ini menggambarkan cara mengambil rekaman dari RandomCategoryDataSource SqlDataSource sebagai DataView serta cara membaca CategoryName nilai kolom dari baris DataView pertama:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    ' Get the data from the SqlDataSource as a DataView
    Dim randomCategoryView As DataView = CType _
        (RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
    If randomCategoryView.Count > 0 Then
        ' Assign the CategoryName value to the Label
        CategoryNameLabel.Text = String.Format( _
            "Here are Products in the {0} Category...", _
            randomCategoryView(0)("CategoryName").ToString())
    End If
End Sub

randomCategoryView(0) mengembalikan yang pertama DataRowView di DataView. randomCategoryView(0)("CategoryName") mengembalikan nilai CategoryName kolom di baris pertama ini. Perhatikan bahwa DataView ditik secara longgar. Untuk mereferensikan nilai kolom tertentu, kita perlu meneruskan nama kolom sebagai string ( CategoryName, dalam hal ini). Gambar 13 memperlihatkan pesan yang ditampilkan di CategoryNameLabel saat menampilkan halaman. Tentu saja, nama kategori aktual yang ditampilkan dipilih secara acak oleh RandomCategoryDataSource SqlDataSource pada setiap kunjungan ke halaman (termasuk postback).

Nama Kategori yang Dipilih Secara Acak Ditampilkan

Gambar 13: Nama Kategori yang Dipilih Secara Acak Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Catatan

Jika properti kontrol DataSourceMode SqlDataSource telah diatur ke DataReader, nilai pengembalian dari Select() metode akan perlu ditransmisikan ke IDataReader. Untuk membaca CategoryName nilai kolom dari baris pertama, kita akan menggunakan kode seperti:

If randomCategoryReader.Read() Then
   Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
   ...
End If

Dengan SqlDataSource secara acak memilih kategori, kami siap untuk menambahkan GridView yang mencantumkan kategori produk.

Catatan

Daripada menggunakan kontrol Web Label untuk menampilkan nama kategori, kita bisa menambahkan FormView atau DetailsView ke halaman, mengikatnya ke SqlDataSource. Namun, menggunakan Label, memungkinkan kami mengeksplorasi cara memanggil pernyataan SqlDataSource Select() secara 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 yang dikodekan secara permanen atau yang diambil dari salah satu sumber parameter yang telah ditentukan sebelumnya (nilai querystring, kontrol Web di halaman, dan sebagainya). Namun, parameter s kontrol SqlDataSource juga dapat diatur secara terprogram. Untuk menyelesaikan contoh kami saat ini, kami memerlukan SqlDataSource yang mengembalikan semua produk yang termasuk dalam kategori tertentu. SqlDataSource ini akan memiliki CategoryID parameter yang nilainya perlu diatur berdasarkan CategoryID nilai kolom yang dikembalikan oleh RandomCategoryDataSource SqlDataSource di Page_Load penanganan aktivitas.

Mulailah dengan menambahkan GridView ke halaman dan ikat ke SqlDataSource baru bernama ProductsByCategoryDataSource. Seperti yang kami lakukan di Langkah 3, konfigurasikan SqlDataSource sehingga memanggil prosedur tersimpan 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.

Cuplikan layar memperlihatkan jendela Konfigurasi Sumber Data dengan sumber Parameter diatur ke Tidak Ada.

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 yang 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 DefaultValue parameter secara CategoryID terprogram di penanganan Page_Load aktivitas:

' Assign the ProductsByCategoryDataSource's
' CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters("CategoryID").DefaultValue = _
    randomCategoryView(0)("CategoryID").ToString()

Dengan penambahan ini, halaman menyertakan GridView yang menunjukkan produk yang terkait dengan kategori yang dipilih secara acak.

Cuplikan layar memperlihatkan halaman Kategori yang Anda Pilih 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 permanen, ditarik dari sumber parameter yang telah ditentukan sebelumnya, atau ditetapkan secara terprogram. Dalam tutorial ini kita melihat cara membuat kueri berparameter dari wizard Konfigurasi Sumber Data untuk kueri SQL ad-hoc dan prosedur tersimpan. Kita juga melihat menggunakan sumber parameter yang dikodekan secara permanen, kontrol Web sebagai sumber parameter, dan secara terprogram menentukan nilai parameter.

Seperti halnya ObjectDataSource, SqlDataSource juga menyediakan kemampuan untuk memodifikasi data yang mendasarnya. Dalam tutorial berikutnya kita akan melihat cara mendefinisikan INSERTpernyataan , UPDATE, dan DELETE dengan SqlDataSource. Setelah pernyataan ini ditambahkan, kita dapat menggunakan fitur penyisipan, pengeditan, dan penghapusan 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 independen, pelatih, dan penulis. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com. atau melalui blognya, yang dapat ditemukan di http://ScottOnWriting.NET.

Terima Kasih Khusus Kepada

Seri tutorial ini ditinjau oleh banyak peninjau yang membantu. Peninjau utama untuk tutorial ini adalah Scott Clyde, Randell Schmidt, dan Ken Pespisa. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, jatuhkan saya baris di mitchell@4GuysFromRolla.com.