Proses tersimpan adalah satu atau lebih perintah SQL yang disimpan dalam database sebagai objek yang dapat dieksekusi.
Definisi selalu abstrak. Proses tersimpan sebenarnya adalah sekumpulan pernyataan SQL yang dapat menyelesaikan operasi tertentu, tetapi kumpulan pernyataan ini ditempatkan di database (di sini kita hanya berbicara tentang SQL SERVER). Jika kita membuat proses tersimpan dan memanggil proses tersimpan di ASP, kita dapat menghindari pencampuran pernyataan SQL dengan kode ASP. Setidaknya ada tiga manfaat melakukan hal ini:
Pertama, meningkatkan efisiensi secara signifikan. Kecepatan eksekusi proses tersimpan itu sendiri sangat cepat, dan memanggil proses tersimpan dapat sangat mengurangi jumlah interaksi dengan database.
Kedua, meningkatkan keamanan. Jika Anda mencampur pernyataan SQL dalam kode ASP, setelah kode disusupi, itu juga berarti struktur perpustakaan disusupi.
Ketiga, ini kondusif untuk penggunaan kembali pernyataan SQL.
Di ASP, proses tersimpan umumnya dipanggil melalui objek COMMAND. Tergantung pada situasinya, artikel ini juga memperkenalkan metode pemanggilan lainnya. Untuk memudahkan penjelasan, klasifikasi sederhana berikut dibuat berdasarkan input dan output dari proses tersimpan:
1. Proses tersimpan yang hanya mengembalikan satu kumpulan rekaman
Misalkan ada proses tersimpan berikut (tujuan artikel ini bukan untuk menjelaskan sintaks T-SQL, jadi proses tersimpan hanya memberikan kode tanpa penjelasan):
/*SP1*/
BUAT PROSEDUR DBO.GETUSERLIST
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
PILIH * DARI DBO.[INFO PENGGUNA]
AKHIR
PERGI
Proses tersimpan di atas memperoleh semua catatan dalam tabel USERINFO dan mengembalikan kumpulan catatan. Kode ASP untuk memanggil proses tersimpan melalui objek COMMAND adalah sebagai berikut:
'**Panggil proses tersimpan melalui objek COMMAND**
DIM MYCOMM,MYRST
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
MYCOMM.COMMANDTEXT = GETUSERLIST 'Tentukan nama proses yang disimpan
MYCOMM.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
MYCOMM.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
SET MYRST = MYCOMM.EXECUTE
SETEL MYCOMM = TIDAK ADA
Kumpulan rekaman yang diperoleh dari proses penyimpanan ditugaskan ke MYRST. Selanjutnya, MYRST dapat dioperasikan.
Pada kode di atas, atribut COMMANDTYPE menunjukkan jenis permintaan. Nilai dan deskripsinya adalah sebagai berikut:
-1 menunjukkan bahwa jenis parameter COMMANDTEXT tidak dapat ditentukan
1 menunjukkan bahwa COMMANDTEXT adalah tipe perintah umum
2 menunjukkan bahwa parameter COMMANDTEXT adalah nama tabel dengan
4 menunjukkan bahwa parameter COMMANDTEXT adalah nama proses yang disimpan
Anda juga dapat memanggil proses tersimpan melalui objek CONNECTION atau objek RECORDSET. Metodenya adalah sebagai berikut:
'**Memanggil proses tersimpan melalui objek CONNECTION**
DIMMYCONN, MYRST
SET MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR adalah string koneksi database
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'Parameter terakhir memiliki arti yang sama dengan COMMANDTYPE
SETEL MYCONN = TIDAK ADA
'**Memanggil proses tersimpan melalui objek RECORDSET**
DIMMIRST
SET MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.BUKA GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR adalah string koneksi database, parameter terakhir memiliki arti yang sama dengan COMMANDTYPE
2. Proses tersimpan tanpa input dan output
Lihatlah prosedur tersimpan berikut:
/*SP2*/
BUAT PROSEDUR DBO.DELUSERALL
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
HAPUS DARI DBO.[USERINFO]
AKHIR
PERGI
Proses tersimpan ini menghapus semua record dalam tabel USERINFO tanpa input atau output apa pun. Metode pemanggilannya pada dasarnya sama seperti yang disebutkan di atas, hanya saja tidak perlu mendapatkan kumpulan record:
'**Panggil proses tersimpan melalui objek COMMAND**
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
MYCOMM.COMMANDTEXT = DELUSERALL 'Tentukan nama proses yang disimpan
MYCOMM.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
MYCOMM.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
MYCOMM.EXECUTE 'Tidak perlu mendapatkan kumpulan rekor di sini
SETEL MYCOMM = TIDAK ADA
Tentu saja, jenis proses tersimpan ini juga dapat dipanggil melalui objek CONNECTION atau objek RECORDSET. Namun, objek RECORDSET dibuat untuk mendapatkan kumpulan rekaman. Jika kumpulan rekaman tidak dikembalikan, gunakan objek COMMAND.
3. Prosedur tersimpan dengan nilai kembalian
Saat melakukan operasi seperti SP2, Anda harus memanfaatkan sepenuhnya kemampuan pemrosesan transaksi SQL SERVER yang kuat untuk menjaga konsistensi data. Selain itu, kita mungkin perlu menyimpan status eksekusi yang dikembalikan oleh proses tersebut. Untuk tujuan ini, ubah SP2 sebagai berikut:
/*SP3*/
BUAT PROSEDUR DBO.DELUSERALL
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
MULAI TRANSAKSI
HAPUS DARI DBO.[USERINFO]
JIKA @@ KESALAHAN=0
MULAI
MELAKUKAN TRANSAKSI
KEMBALI 1
AKHIR
KALAU TIDAK
MULAI
TRANSAKSI KEMBALI
KEMBALI 0
AKHIR
KEMBALI
AKHIR
PERGI
Proses tersimpan di atas mengembalikan 1 ketika DELETE berhasil dijalankan, jika tidak maka akan mengembalikan 0 dan melakukan operasi rollback. Untuk mendapatkan nilai kembalian di ASP, Anda perlu menggunakan koleksi PARAMETER untuk mendeklarasikan parameter:
'**Panggil proses tersimpan dengan nilai kembalian dan dapatkan nilai kembalian**
DIM MYCOMM,MYPARA
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
MYCOMM.COMMANDTEXT = DELUSERALL 'Tentukan nama proses yang disimpan
MYCOMM.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
MYCOMM.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
'Deklarasikan nilai pengembalian
SET MYPARA = MYCOMM.CREATEPARAMETER(KEMBALI,2,4)
MYCOMM.PARAMETERS.TAMBAHKAN MYPARA
MYCOMM.EXECUTE
'Dapatkan nilai pengembaliannya
NILAI HASIL DIM
RETVALUE = MYCOMM(0) 'atau RETVALUE = MYCOMM.PARAMETERS(0)
SETEL MYCOMM = TIDAK ADA
Pada MYCOMM.CREATEPARAMETER(RETURN,2,4), arti dari setiap parameter adalah sebagai berikut:
Parameter pertama (RETURE) adalah nama parameter. Nama parameter dapat diatur secara sewenang-wenang, namun umumnya harus sama dengan nama parameter yang dideklarasikan dalam proses tersimpan. Ini nilai kembaliannya, biasanya saya setel ke RETURE;
Parameter kedua (2) menunjukkan tipe data parameter. Silakan merujuk ke referensi ADO untuk kode tipe tertentu yang diberikan di bawah ini:
ADBIGIN: 20;
ADBINARI: 128;
ADBOOLEAN: 11;
ADCHAR: 129;
Stempel WAKTU TAMBAHAN: 135;
KECEPATAN: 0;
ADINTEGER: 3;
ADSMALINT: 2;
ADTINYINT: 16;
ADVARCHAR: 200;
Untuk nilai yang dikembalikan, hanya nilai integer yang dapat diambil, dan -1 hingga -99 adalah nilai yang dicadangkan;
Parameter ketiga (4) menunjukkan sifat parameter, dimana 4 menunjukkan bahwa ini adalah nilai kembalian. Penjelasan nilai parameter ini adalah sebagai berikut:
0: Jenisnya tidak dapat ditentukan; 1: Parameter masukan; 2: Parameter masukan; 3: Parameter masukan atau keluaran;
Kode ASP yang diberikan di atas harus dikatakan sebagai kode lengkap, yaitu kode yang paling kompleks.
SET MYPARA = MYCOMM.CREATEPARAMETER(KEMBALI,2,4)
MYCOMM.PARAMETERS.TAMBAHKAN MYPARA
dapat disederhanakan menjadi
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
Bahkan dapat disederhanakan lagi, seperti yang akan dijelaskan nanti.
Untuk prosedur tersimpan yang memiliki parameter hanya bisa dipanggil menggunakan objek COMMAND (ada juga informasi bisa dipanggil melalui objek CONNECTION atau objek RECORDSET, tapi saya belum mencobanya).
4. Proses tersimpan dengan parameter masukan dan parameter keluaran
Nilai yang dikembalikan sebenarnya adalah parameter keluaran khusus. Dalam kebanyakan kasus, kami menggunakan proses tersimpan yang memiliki parameter input dan output. Misalnya, kami ingin mendapatkan nama pengguna dari pengguna dengan ID tertentu di tabel informasi pengguna. ---ID pengguna. , dan parameter keluaran----nama pengguna. Proses tersimpan yang mengimplementasikan fungsi ini adalah sebagai berikut:
/*SP4*/
BUAT PROSEDUR DBO.GETUSERNAME
@USERIDINT,
@USERNAME VARCHAR(40) KELUARAN
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
JIKA @USERID ADALAH KEMBALI NULL
PILIH @USERNAME=USERNAME
DARI DBO.[INFO PENGGUNA]
DIMANA USERID=@USERID
KEMBALI
AKHIR
PERGI
Kode ASP yang memanggil proses tersimpan adalah sebagai berikut:
'**Panggil proses tersimpan dengan parameter input dan output**
DIM MYCOMM,USERID,USERNAME
ID PENGGUNA=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
MYCOMM.COMMANDTEXT = GETUSERNAME 'Tentukan nama proses yang disimpan
MYCOMM.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
MYCOMM.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
'Deklarasikan parameter
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
MYCOMM.EXECUTE
'Dapatkan parameternya
NAMA PENGGUNA = KOMUNITAS SAYA(1)
SETEL MYCOMM = TIDAK ADA
Dalam kode di atas, Anda dapat melihat bahwa tidak seperti mendeklarasikan nilai kembalian, 5 parameter diperlukan saat mendeklarasikan parameter masukan, dan 4 parameter diperlukan saat mendeklarasikan parameter keluaran. Saat mendeklarasikan parameter masukan, lima parameternya adalah: nama parameter, tipe data parameter, tipe parameter, panjang data, dan nilai parameter. Saat mendeklarasikan parameter keluaran, tidak ada parameter terakhir: nilai parameter.
Perhatian khusus harus diberikan pada: saat mendeklarasikan parameter, urutannya harus sama dengan yang ditentukan dalam proses penyimpanan, dan tipe data serta panjang setiap parameter juga harus sama dengan yang ditentukan dalam proses penyimpanan.
Jika proses tersimpan memiliki beberapa parameter, kode ASP akan tampak rumit. Anda dapat menggunakan perintah WITH untuk menyederhanakan kode:
'**Panggil proses tersimpan dengan parameter input dan output (kode sederhana)**
DIM MYCOMM,USERID,USERNAME
ID PENGGUNA=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
DENGAN KOMUNITAS SAYA
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
.COMMANDTEXT = GETUSERNAME 'Tentukan nama proses yang disimpan
.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.MENJALANKAN
AKHIR DENGAN
NAMA PENGGUNA = KOMUNITAS SAYA(1)
SETEL MYCOMM = TIDAK ADA
Jika kita ingin mendapatkan username 10 user dengan ID 1 sampai 10, apakah kita perlu membuat objek COMMAND sebanyak 10 kali? TIDAK. Jika Anda perlu memanggil proses tersimpan yang sama beberapa kali, cukup ubah parameter masukan dan Anda akan mendapatkan keluaran yang berbeda:
'**Beberapa panggilan ke proses tersimpan yang sama**
DIM MYCOMM,USERID,USERNAME
NAMA PENGGUNA=
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
UNTUK USERID = 1 SAMPAI 10
DENGAN KOMUNITAS SAYA
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
.COMMANDTEXT = GETUSERNAME 'Tentukan nama proses yang disimpan
.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
JIKA USERID = 1 MAKA
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.MENJALANKAN
KALAU TIDAK
'Tetapkan kembali nilai pada parameter masukan (parameter masukan dan parameter keluaran yang nilai parameternya tidak berubah saat ini tidak perlu dideklarasikan ulang)
.PARAMETERS(@USERID) = USERID
.MENJALANKAN
AKHIR JIKA
AKHIR DENGAN
USERNAME = USERNAME + MYCOMM(1) + , 'Mungkin Anda suka menggunakan penyimpanan array
BERIKUTNYA
SETEL MYCOMM = TIDAK ADA
Seperti dapat dilihat dari kode di atas: saat memanggil proses tersimpan yang sama berulang kali, Anda hanya perlu menetapkan ulang parameter masukan yang nilainya telah berubah. Metode ini memiliki beberapa parameter masukan dan keluaran, dan hanya satu nilai parameter masukan yang dipanggil masing-masing waktu. Ketika terjadi perubahan, jumlah kode dapat dikurangi secara signifikan.
5. Proses tersimpan dengan nilai kembalian, parameter masukan, dan parameter keluaran secara bersamaan
Seperti disebutkan sebelumnya, saat memanggil proses tersimpan, urutan deklarasi parameter harus sama dengan urutan yang ditentukan dalam proses tersimpan. Hal lain yang perlu diperhatikan secara khusus: jika proses yang disimpan memiliki nilai kembalian serta parameter input dan output, nilai kembalian harus dideklarasikan terlebih dahulu.
Untuk mendemonstrasikan metode pemanggilan dalam kasus ini, mari kita perbaiki contoh di atas. Tetap mendapatkan nama pengguna dari pengguna dengan ID 1, tetapi ada kemungkinan pengguna tidak memilikinya (pengguna telah dihapus, dan USERID adalah kolom yang bertambah sendiri). Proses yang disimpan mengembalikan nilai yang berbeda tergantung apakah pengguna memilikinya atau tidak. Pada titik ini, proses tersimpan dan kode ASP adalah sebagai berikut:
/*SP5*/
BUAT PROSEDUR DBO.GETUSERNAME
--Untuk memperdalam kesan urutannya, balikkan urutan definisi dua parameter berikut.
@USERNAME VARCHAR(40) KELUARAN,
@USERIDINT
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
JIKA @USERID ADALAH KEMBALI NULL
PILIH @USERNAME=USERNAME
DARI DBO.[INFO PENGGUNA]
DIMANA USERID=@USERID
JIKA @@ROWCOUNT>0
KEMBALI 1
KALAU TIDAK
KEMBALI 0
KEMBALI
AKHIR
PERGI
'**Panggil proses tersimpan dengan nilai kembalian, parameter masukan, dan parameter keluaran**
DIM MYCOMM,USERID,USERNAME
ID PENGGUNA=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
DENGAN KOMUNITAS SAYA
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
.COMMANDTEXT = GETUSERNAME 'Tentukan nama proses yang disimpan
.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
'Nilai yang dikembalikan harus dideklarasikan terlebih dahulu
.PARAMETERS.APPEND .CREATEPARAMETER(KEMBALI,2,4)
'Urutan deklarasi dua parameter berikut juga dibalik.
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.MENJALANKAN
AKHIR DENGAN
JIKA MYCOMM(0) = 1 MAKA
NAMA PENGGUNA = KOMUNITAS SAYA(1)
KALAU TIDAK
USERNAME = Pengguna ini tidak punya
AKHIR JIKA
SETEL MYCOMM = TIDAK ADA
6. Proses tersimpan yang mengembalikan parameter dan kumpulan data secara bersamaan
Terkadang, kita memerlukan proses penyimpanan untuk mengembalikan parameter dan kumpulan rekaman pada saat yang bersamaan. Misalnya, saat menggunakan proses penyimpanan untuk paging, kita perlu mengembalikan parameter seperti kumpulan rekaman dan total volume data pada saat yang bersamaan. Berikut ini adalah proses tersimpan untuk paging:
/*SP6*/
BUAT PROSEDUR DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --Jumlah total halaman
@IPAGE INT, --Nomor halaman saat ini
@IPAGESIZE INT --Jumlah catatan per halaman
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
--Buat tabel sementara
BUAT TABEL #T (ID INT IDENTITAS, bidang --peningkatan otomatis
INT USERID,
NAMA PENGGUNA VARCHAR(40))
--Tulis data ke tabel sementara
MASUKKAN KE #T
PILIH USERID, NAMA PENGGUNA DARI DBO.[USERINFO]
PESANAN BERDASARKAN ID PENGGUNA
--Dapatkan jumlah total catatan
DEKLARASIKAN @IRECORDCOUNT INT
SET @IRECORDCOUNT = @@ROWCOUNT
--Tentukan jumlah total halaman
JIKA @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
KALAU TIDAK
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
--Jika nomor halaman yang diminta lebih besar dari jumlah halaman total, halaman terakhir akan ditampilkan
JIKA @IPAGE > @IPAGECOUNT
PILIH @IPAGE = @IPAGECOUNT
--Tentukan catatan awal dan akhir halaman saat ini
DEKLARASIKAN @ISTART INT --MULAI REKAM
DEKLARASIKAN @IEND INT --END RECORD
PILIH @ISTART = (@IPAGE - 1) * @IPAGESIZE
PILIH @IEND = @ISTART + @IPAGESIZE + 1
--Dapatkan catatan halaman saat ini
PILIH *DARI #T DI MANA ID>@ISTART DAN ID<@IEND
--Hapus tabel sementara
JATUHKAN TABEL #T
--Kembalikan jumlah total catatan
KEMBALI @IRECORDCOUNT
AKHIR
PERGI
Dalam proses penyimpanan di atas, masukkan nomor halaman saat ini dan jumlah catatan per halaman, dan kembalikan kumpulan catatan halaman saat ini, jumlah halaman total, dan jumlah total catatan. Untuk lebih umum, jumlah total catatan dikembalikan sebagai nilai kembalian. Berikut ini adalah kode ASP yang memanggil proses tersimpan (operasi paging tertentu dihilangkan):
'**Panggilan proses penyimpanan paging**
DIM HALAMAN SEKARANG, UKURAN HALAMAN, JUMLAH HALAMAN, JUMLAH REKAM
DIM MYCOMM,MYRST
HALAMAN SEKARANG = PERMINTAAN(PN)
'Fungsi khusus yang digunakan untuk memverifikasi bilangan asli
JIKA CHECKNAR(HALAMAN SEKARANG) = SALAH MAKA HALAMAN SEKARANG = 1
UKURAN HALAMAN = 20
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
DENGAN KOMUNITAS SAYA
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
.COMMANDTEXT = GETUSERLIST 'Tentukan nama proses yang disimpan
.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
'Nilai pengembalian (jumlah total catatan)
.PARAMETERS.APPEND .CREATEPARAMETER(KEMBALI,2,4)
'Parameter keluaran (jumlah total halaman)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'Parameter masukan (nomor halaman saat ini)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'Parameter masukan (jumlah catatan per halaman)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
SET MYRST = .EXECUTE
AKHIR DENGAN
JIKA MYRST.STATE = 0 MAKA 'Tidak ada data yang diperoleh, MYRST ditutup
JUMLAH REKAM = -1
KALAU TIDAK
MYRST.CLOSE 'Catatan: Untuk mendapatkan nilai parameter, Anda harus menutup objek recordset terlebih dahulu
JUMLAH REKAM = MYCOMM(0)
HALAMAN = KOMUNITAS SAYA(1)
JIKA CINT(PAGENOW)>=CINT(PAGECOUNT) MAKA PAGENOW=PAGECOUNT
AKHIR JIKA
SETEL MYCOMM = TIDAK ADA
'Tampilkan catatan di bawah
JIKA RECORDCOUNT = 0 MAKA
RESPON.TULIS Tidak ada catatan
ELSEIF RECORDCOUNT > 0 LALU
SAYA.TERBUKA
LAKUKAN SAMPAI MYRST.EOF
...
LINGKARAN
'Berikut ini menampilkan informasi paging
...
LAINNYA 'JUMLAH REKAM=-1
RESPON.TULIS kesalahan parameter
AKHIR JIKA
Mengenai kode di atas, hanya ada satu hal yang perlu dijelaskan: saat mengembalikan recordset dan parameter secara bersamaan, jika ingin mendapatkan parameter, Anda harus menutup recordset terlebih dahulu, lalu membukanya saat menggunakan kumpulan rekaman.
7. Proses tersimpan yang mengembalikan beberapa kumpulan data
Artikel ini pertama kali memperkenalkan proses tersimpan yang mengembalikan kumpulan data. Terkadang, proses yang disimpan perlu mengembalikan beberapa kumpulan rekaman di ASP, bagaimana cara mendapatkan kumpulan rekaman ini secara bersamaan? Untuk mengilustrasikan masalah ini, tambahkan dua kolom ke tabel USERINFO: USERTEL dan USERMAIL, dan atur agar hanya pengguna yang login yang dapat melihat kedua konten ini.
/*SP7*/
BUAT PROSEDUR DBO.GETUSERINFO
@USERIDINT,
@PERIKSA LOGIN SEDIKIT
SEBAGAI
SETEL NOCOUNT AKTIF
MULAI
JIKA @USERID NULL ATAU @CHECKLOGIN NULL KEMBALI
PILIH NAMA PENGGUNA
DARI DBO.[USRINFO]
DIMANA USERID=@USERID
--Jika Anda adalah pengguna yang masuk, ambil USERTEL dan USERMAIL
JIKA @PERIKSALOGIN=1
PILIH USERTEL, USERMAIL
DARI DBO.[INFO PENGGUNA]
DIMANA USERID=@USERID
KEMBALI
AKHIR
PERGI
Berikut ini adalah kode ASP:
'**Panggil proses tersimpan yang mengembalikan beberapa kumpulan data**
PERIKSA DIM, USERID, USERNAME, USERTEL, USERMAIL
DIM KOMUNITAS SAYA, MYRST
ID PENGGUNA=1
'CHECKLOGIN() adalah fungsi khusus untuk menentukan apakah pengunjung sudah login
PERIKSA = PERIKSA LOGIN()
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
DENGAN KOMUNITAS SAYA
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR adalah string koneksi database
.COMMANDTEXT = GETUSERINFO 'Tentukan nama proses yang disimpan
.COMMANDTYPE = 4 'Menunjukkan bahwa ini adalah proses tersimpan
.PREPARED = TRUE 'Memerlukan perintah SQL untuk dikompilasi terlebih dahulu
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
SET MYRST = .EXECUTE
AKHIR DENGAN
SETEL MYCOMM = TIDAK ADA
'Dapatkan nilai dari kumpulan rekor pertama
NAMA PENGGUNA = MYRST(0)
'Dapatkan nilai dari kumpulan rekor kedua
JIKA BUKAN MYRST TIDAK ADA APA-APA MAKA
SET MYRST = MYRST.NEXTRECORDSET()
USERTEL = MYRST(0)
USERMAIL = MYRST(1)
AKHIR JIKA
SET MYRST = TIDAK ADA
Dalam kode di atas, metode NEXTRECORDSET dari objek RECORDSET digunakan untuk mendapatkan beberapa kumpulan catatan yang dikembalikan oleh proses penyimpanan.
Sejauh ini, artikel ini telah memberikan penjelasan yang relatif komprehensif tentang berbagai situasi di mana ASP memanggil proses tersimpan. Terakhir, mari kita bicara tentang berbagai metode memanggil beberapa proses tersimpan dalam program ASP.
Dalam program ASP, setidaknya tiga metode berikut ini layak untuk memanggil beberapa proses tersimpan:
1. Buat beberapa objek COMMAND
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Panggil proses tersimpan satu
...
SETEL MYCOMM = TIDAK ADA
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Panggilan disimpan proses dua
...
SETEL MYCOMM = TIDAK ADA
...
2. Buat hanya satu objek COMMAND dan hapus parameternya saat mengakhiri panggilan.
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Panggil proses tersimpan satu
.....
'Hapus parameter (dengan asumsi ada tiga parameter)
MYCOMM.PARAMETERS.HAPUS 2
MYCOMM.PARAMETERS.HAPUS 1
MYCOMM.PARAMETERS.HAPUS 0
'Panggil proses tersimpan dua dan hapus parameter
...
SETEL MYCOMM = TIDAK ADA
Saat ini, harap diperhatikan: urutan penghapusan parameter berlawanan dengan urutan deklarasi parameter.
3. Gunakan metode REFRESH pada pengumpulan data PARAMETER untuk mereset objek PARAMETER
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Panggil proses tersimpan satu
.....
'Reset semua objek PARAMETER yang terdapat dalam kumpulan data PARAMETER
MYCOMM.PARAMETERS.REFRESH
'Panggilan disimpan proses dua
.....
SETEL MYCOMM = TIDAK ADA
Secara umum diyakini bahwa membuat objek berulang kali adalah metode yang kurang efisien, tetapi setelah pengujian (alat pengujiannya adalah MICROSOFT APPLICATION CENTER TEST), hasilnya tidak terduga:
Metode 2 >= Metode 1 >> Metode 3
Kecepatan lari metode 2 lebih besar atau sama dengan metode 1 (hingga sekitar 4% lebih tinggi). Kecepatan lari kedua metode ini jauh lebih cepat daripada metode 3 (hingga 130%). metode 1 bila ada banyak parameter. Jika tidak, gunakan metode 2.
Butuh satu hari bagi saya untuk akhirnya menuliskan beberapa pengalaman dangkal saya dalam memanggil prosedur tersimpan di ASP. Diantaranya, ada yang saya hanya tahu akibat tapi tidak tahu penyebabnya, dan ada pula yang mungkin salah, tapi ini semua melalui latihan pribadi saya. Mohon terima secara kritis, para pembaca. Jika Anda memiliki pendapat berbeda, harap beri tahu saya. Terima kasih sebelumnya.