Asp sqlserver ดำเนินการขั้นตอนการจัดเก็บเพื่อส่งคืนโซลูชันชั่วคราวที่ไม่อนุญาตให้ดำเนินการเมื่อปิดวัตถุชุดระเบียน หากคุณมีวิธีที่ดีกว่ากรุณาบอกฉัน หากคุณต้องการรับค่าที่ส่งคืนคุณต้องใช้วิธีคำสั่ง
ประการแรก มีค่าส่งคืนสองประเภท วิธีหนึ่งคือการส่งคืนค่าโดยตรงในกระบวนงานที่เก็บไว้ เช่นเดียวกับค่าส่งคืนฟังก์ชันของ C และ VB อีกอย่างคือการส่งคืนค่าหลายค่า และต้องระบุชื่อตัวแปรเพื่อจัดเก็บค่าเหล่านี้ในพารามิเตอร์การเรียกก่อน .
ตัวอย่างนี้ต้องจัดการกับพารามิเตอร์หลายตัว พารามิเตอร์อินพุต พารามิเตอร์เอาต์พุต ชุดบันทึกส่งคืน และค่าส่งคืนโดยตรง (สมบูรณ์เพียงพอหรือไม่)
ขั้นตอนการจัดเก็บมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ใช้ผับ
ไป
- สร้างขั้นตอนการจัดเก็บ
สร้างขั้นตอน sp_PubsTest
--กำหนดตัวแปรพารามิเตอร์สามตัว โปรดทราบว่าตัวแปรตัวที่สามถูกทำเครื่องหมายไว้เป็นพิเศษสำหรับเอาต์พุต
@au_lname วาร์ชาร์ (20),
@intID อินท์
@intIDOut int เอาท์พุต
เช่น
เลือก @intIDOut = @intID + 1
เลือก *
จากผู้เขียน
โดยที่ au_lname ชอบ @au_lname + ''%''
--ส่งกลับค่าโดยตรง
กลับ @intID + 2
โปรแกรม asp ที่เรียกกระบวนงานที่เก็บไว้นี้จะเป็นดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
<%@ ภาษา=VBScript %>
-
Dim CmdSP
ดิมาโดรเอส
หรี่ adCmdSPStoredProc
Dim adParamReturnValue
ดิมแอดพารามินพุต
Dim adParamOutput
Dim adInteger
ดิม ไอวาล
ดิมโอวัล
ลืมตาดูสนาม
ติ่ม adVarChar
'ค่าเหล่านี้เป็นค่าคงที่ที่กำหนดไว้ล่วงหน้าใน VB และสามารถเรียกได้โดยตรง แต่ไม่ได้กำหนดไว้ล่วงหน้าใน VBScript
adCmdSPStoredProc = 4
adParamReturnValue = 4
โฆษณาพารามินพุต = 1
adParamOutput = 2
จำนวนเต็มโฆษณา = 3
แอดวาร์ชาร์ = 200
iVal = 5
โอวัล = 3
''สร้างวัตถุคำสั่ง
ตั้ง CmdSP = Server.CreateObject (ADODB.Command)
''สร้างลิงค์
CmdSP.ActiveConnection = ไดรเวอร์ = {SQL Server}; เซิร์ฟเวอร์ = (ท้องถิ่น); Uid = sa; Pwd =; ฐานข้อมูล = Pubs
''กำหนดชื่อการเรียกวัตถุคำสั่ง
CmdSP.CommandText = sp_PubsTest
'' ตั้งค่าประเภทการเรียกคำสั่งให้เป็นขั้นตอนการจัดเก็บ (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''เพิ่มพารามิเตอร์ให้กับวัตถุคำสั่ง
''กำหนดขั้นตอนการจัดเก็บเพื่อให้มีค่าส่งคืนโดยตรงและเป็นจำนวนเต็ม ค่าเริ่มต้นคือ 4
CmdSP.Parameters.Append CmdSP.CreateParameter(RETURN_VALUE, adInteger, adParamReturnValue, 4)
''กำหนดพารามิเตอร์อินพุตอักขระ
CmdSP.Parameters.Append CmdSP.CreateParameter(@au_lname, adVarChar, adParaminput, 20, M)
''กำหนดพารามิเตอร์อินพุตจำนวนเต็ม
CmdSP.Parameters.Append CmdSP.CreateParameter(@intID, adInteger, adParamInput, , iVal)
''กำหนดพารามิเตอร์เอาต์พุตจำนวนเต็ม
CmdSP.Parameters.Append CmdSP.CreateParameter(@intIDOut, adInteger, adParamOutput, oVal)
''เรียกใช้ขั้นตอนที่เก็บไว้และรับชุดระเบียนที่ส่งคืน
ตั้งค่า adoRS = CmdSP.Execute
'' พิมพ์แต่ละระเบียนออกมา ฟิลด์เหล่านี้เป็นเสมือนและสามารถละเว้นได้
ในขณะที่ไม่ adoRS.EOF
สำหรับแต่ละ adoField ใน adoRS.Fields
การตอบกลับเขียน adoField.Name & = & adoField.Value & <br> & vbCRLF
ต่อไป
การตอบสนองเขียน<br>
adoRS.MoveNext
เวนด์
'' พิมพ์ค่าเอาต์พุตสองค่า:
Response.Write <p>@intIDOut = & CmdSP.Parameters(@intIDOut).Value & </p>
Response.Write <p>ค่าส่งกลับ = & CmdSP.Parameters(RETURN_VALUE).Value & </p>
''ทำความสะอาด
ตั้งค่า AdRS = ไม่มีเลย
ตั้งค่า CmdSP.ActiveConnection = ไม่มีเลย
ตั้งค่า CmdSP = ไม่มีเลย
-
เมื่อใช้ asp เพื่อเรียกขั้นตอนที่เก็บไว้และส่งคืนชุดบันทึก มันจะรายงานข้อผิดพลาดที่ไม่อนุญาตให้ดำเนินการเมื่อวัตถุถูกปิด ฉันค้นหาคำถามมากมาย แต่ไม่พบวิธีแก้ไขที่ถูกต้อง โค้ดที่เชื่อถือได้มากขึ้น
ในที่สุด ฉันพบว่าปัญหาเกิดขึ้นใน Stored Procedure ในตัวอย่างไม่มีปัญหา แต่เมื่อฉันใช้ Stored Procedure ของตัวเอง เกิดข้อผิดพลาด
วิธีแก้ปัญหาสุดท้ายคือนำไปไว้ในขั้นตอนการจัดเก็บที่ฉันใช้
ก่อนแต่ละคำสั่ง Insert ให้เพิ่ม nocount ที่กำหนดไว้ในประโยค กล่าวคือ เพิ่มประโยคภายในเคอร์เซอร์วนซ้ำ
ฉันยังไม่ได้เจาะลึกเหตุผลใด ๆ ใครรู้สามารถชี้ให้เห็นได้