Asp sqlserver menjalankan prosedur tersimpan untuk mengembalikan solusi sementara bahwa operasi tidak diperbolehkan ketika objek kumpulan catatan ditutup. Jika Anda memiliki cara yang lebih baik, tolong beri tahu saya.
Jika Anda ingin mendapatkan nilai kembalian, Anda perlu menggunakan metode Command.
Pertama-tama, ada dua jenis nilai kembalian. Salah satunya adalah mengembalikan nilai secara langsung dalam prosedur tersimpan, seperti fungsi mengembalikan nilai C dan VB; yang lainnya adalah mengembalikan beberapa nilai, dan nama variabel untuk menyimpan nilai-nilai ini harus ditentukan dalam parameter pemanggilan terlebih dahulu .
Contoh ini perlu menangani beberapa parameter, parameter masukan, parameter keluaran, kumpulan catatan pengembalian, dan nilai pengembalian langsung (apakah cukup lengkap?)
Prosedur tersimpannya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
menggunakan pub
PERGI
-- Membuat prosedur tersimpan
buat prosedur sp_PubsTest
--Tentukan tiga variabel parameter. Perhatikan bahwa variabel ketiga ditandai khusus untuk keluaran.
@au_lname varchar (20),
@intID ke dalam,
@intIDOut ke KELUARAN
SEBAGAI
PILIH @intIDOut = @intID + 1
PILIH *
DARI penulis
DIMANA au_lname SEPERTI @au_lname + ''%''
--Kembalikan nilai secara langsung
KEMBALI @intID + 2
Program asp yang memanggil prosedur tersimpan ini adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
<%@ Bahasa=VBScript %>
<%
Redupkan CmdSP
DimadoRS
Redupkan iklanCmdSPStoredProc
Redupkan adParamReturnValue
Redupkan adParaminput
Redupkan keluaran Param iklan
Redupkan bilangan bulat iklan
Redupkan iVal
Redupkan oval
Redupkan adoField
Redupkan adVarChar
'Nilai-nilai ini adalah konstanta yang telah ditentukan sebelumnya di VB dan dapat dipanggil secara langsung, tetapi tidak ditentukan sebelumnya di VBScript
iklanCmdSPStoredProc = 4
adParamReturnValue = 4
adParaminput = 1
keluaranParamiklan = 2
bilangan bulat iklan = 3
adVarChar = 200
iVal = 5
bulat telur = 3
''Buat objek perintah
set CmdSP = Server.CreateObject("ADODB.Command")
''Buat tautan
CmdSP.ActiveConnection = "Driver={SQL Server};server=(lokal);Uid=sa;Pwd=;Database=Pubs"
''Tentukan nama panggilan objek perintah
CmdSP.CommandText = "sp_PubsTest"
''Atur jenis panggilan perintah menjadi prosedur tersimpan (adCmdSPStoredProc = 4)
CmdSP.CommandType = iklanCmdSPStoredProc
''Tambahkan parameter ke objek perintah
''Tentukan prosedur tersimpan untuk memiliki nilai pengembalian langsung, dan itu adalah bilangan bulat
CmdSP.Parameters.Tambahkan CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
''Tentukan parameter input karakter
CmdSP.Parameters.Tambahkan CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
''Tentukan parameter masukan bilangan bulat
CmdSP.Parameters.Tambahkan CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
''Tentukan parameter keluaran bilangan bulat
CmdSP.Parameters.Tambahkan CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
''Jalankan prosedur tersimpan dan dapatkan kumpulan data yang dikembalikan
Setel adoRS = CmdSP.Jalankan
''Cetak setiap catatan. Bidangnya virtual dan dapat diabaikan.
Meskipun Tidak adoRS.EOF
untuk setiap adoField di adoRS.Fields
Respon.Tulis adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
Berikutnya
Respon.Tulis "<br>"
adoRS.MoveNext
Pergi ke
''Cetak dua nilai keluaran:
Respon.Tulis "<p>@intIDOut = " & CmdSP.Parameters("@intIDOut").Nilai & "</p>"
Respon.Tulis "<p>Nilai pengembalian = " & CmdSP.Parameters("RETURN_VALUE").Nilai & "</p>"
''Pembersihan
Setel adoRS = tidak ada
Setel CmdSP.ActiveConnection = tidak ada
Setel CmdSP = tidak ada
%>
Saat menggunakan asp untuk memanggil prosedur tersimpan dan mengembalikan kumpulan catatan, kesalahan "Operasi tidak diizinkan saat objek ditutup" terus dilaporkan. Saya mencari banyak pertanyaan, tetapi saya tidak dapat menemukan solusi yang tepat kode yang lebih andal.
Akhirnya saya menemukan bahwa masalah terjadi pada prosedur tersimpan dalam contoh. Tidak ada masalah dengan prosedur tersimpan, tetapi ketika saya menggunakan prosedur tersimpan saya sendiri, terjadi kesalahan.
Solusi terakhir adalah memasukkannya ke dalam prosedur tersimpan yang saya gunakan
Sebelum setiap pernyataan Sisipkan, tambahkan satu set nocount pada kalimat, yaitu menambahkan kalimat di dalam lingkaran kursor.
Saya belum menyelidiki alasan spesifiknya. Siapa pun yang tahu dapat menunjukkannya.