มีบทความมากมายเกี่ยวกับ ASP และ Stored Procedures (Stored Procedures) แต่ฉันสงสัยว่าผู้เขียนได้ฝึกฝนจริงหรือไม่ ตอนที่ฉันยังเป็นมือใหม่ ฉันศึกษาข้อมูลที่เกี่ยวข้องมากมายและพบว่าวิธีการหลายวิธีที่ให้มานั้นไม่เหมือนกันในทางปฏิบัติ สำหรับการใช้งานแบบง่าย สื่อเหล่านี้อาจมีประโยชน์ แต่จำกัดอยู่เพียงเท่านี้ เนื่องจากโดยพื้นฐานแล้วจะเหมือนกันและคัดลอกซึ่งกันและกัน สำหรับการใช้งานที่ซับซ้อนกว่าเล็กน้อย จึงไม่ชัดเจนทั้งหมด
ตอนนี้ฉันเข้าถึง SQL Server โดยการเรียกขั้นตอนที่เก็บไว้ ข้อความต่อไปนี้เป็นบทสรุปของการปฏิบัติ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน
โพรซีเดอร์ที่เก็บไว้คือคำสั่ง SQL หนึ่งคำสั่งขึ้นไปที่จัดเก็บไว้ในฐานข้อมูลเป็นออบเจ็กต์ที่ปฏิบัติการได้
คำจำกัดความนั้นเป็นนามธรรมเสมอ จริงๆ แล้ว Stored Procedure คือชุดของคำสั่ง SQL ที่สามารถดำเนินการบางอย่างให้เสร็จสิ้นได้ แต่ชุดคำสั่งนี้จะอยู่ในฐานข้อมูล (ในที่นี้เราจะพูดถึง SQL Server เท่านั้น) หากเราสร้าง Stored Procedure และเรียก Stored Procedure ใน ASP เราสามารถหลีกเลี่ยงการผสมคำสั่ง SQL กับโค้ด ASP ได้ การทำเช่นนี้มีประโยชน์อย่างน้อยสามประการ
ประการแรก ช่วยเพิ่มประสิทธิภาพอย่างมาก ความเร็วการดำเนินการของ Stored Procedure นั้นเร็วมาก และการเรียก Stored Procedure สามารถลดจำนวนการโต้ตอบกับฐานข้อมูลได้อย่างมาก
ประการที่สอง ปรับปรุงความปลอดภัย หากคุณผสมคำสั่ง SQL ในโค้ด ASP เมื่อโค้ดถูกโจมตี นั่นหมายความว่าโครงสร้างไลบรารีถูกโจมตีด้วย
ประการที่สาม เอื้อต่อการนำคำสั่ง SQL มาใช้ซ้ำ
ใน ASP โดยทั่วไปจะเรียกกระบวนงานที่เก็บไว้ผ่านวัตถุคำสั่ง ทั้งนี้ขึ้นอยู่กับสถานการณ์ บทความนี้ยังแนะนำวิธีการเรียกอื่นๆ เพื่อความสะดวกในการอธิบาย การจำแนกประเภทง่ายๆ ต่อไปนี้จะจัดทำขึ้นตามอินพุตและเอาต์พุตของขั้นตอนการจัดเก็บ:
1. ขั้นตอนการจัดเก็บที่ส่งคืนชุดระเบียนเดียวเท่านั้น
จะถือว่าขั้นตอนการจัดเก็บต่อไปนี้ (วัตถุประสงค์ของบทความนี้ไม่ได้อธิบายไว้เพื่ออธิบาย ไวยากรณ์ T-SQL ดังนั้น Stored Procedure จะให้เฉพาะโค้ด ไม่มีคำอธิบาย):
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
beginning
select * from dbo.[userinfo]
end
go
Theดังกล่าวข้างต้น Stored Procedure รับบันทึกทั้งหมด ในตาราง userinfo และส่งคืนชุดระเบียน รหัส ASP สำหรับการเรียกกระบวนงานที่เก็บไว้ผ่านวัตถุคำสั่งมีดังนี้:
'**การเรียกขั้นตอนที่เก็บไว้ผ่านวัตถุคำสั่ง**
DIM MyComm,MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr คือการเชื่อมต่อฐานข้อมูล String
MyComm.CommandText = "getUserList" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้
MyComm.CommandType = 4 'ระบุว่านี่เป็นโพรซีเดอร์ที่เก็บไว้
MyComm.Prepared = true 'จำเป็นต้องคอมไพล์คำสั่ง SQL ก่อน
ตั้งค่า MyRst = MyComm.Execute
Set MyComm = ไม่มี
ขั้นตอนการจัดเก็บ ชุดบันทึกที่ได้รับถูกกำหนดให้กับ MyRst จากนั้น MyRst ก็สามารถดำเนินการได้
ในโค้ดข้างต้น คุณลักษณะ CommandType ระบุประเภทของคำขอ ค่าและคำอธิบายมีดังนี้:
-1 ระบุว่าไม่สามารถกำหนดประเภทของพารามิเตอร์ CommandText
1 บ่งชี้ว่าพารามิเตอร์ CommandText เป็นประเภทคำสั่งทั่วไป
2 บ่งชี้ว่า พารามิเตอร์ CommandText เป็นชื่อตารางที่มีอยู่
4 บ่งชี้ว่าพารามิเตอร์ CommandText คือ ชื่อของขั้นตอนที่เก็บไว้
ยังสามารถเรียกขั้นตอนที่เก็บไว้ผ่านวัตถุการเชื่อมต่อหรือวัตถุชุดระเบียน วิธีการดังต่อไปนี้:
'**เรียกขั้นตอนที่เก็บไว้ผ่านการเชื่อมต่อ' object**
DIM MyConn,MyRst
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn .open MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล
Set MyRst = MyConn.Execute("getUserList",0,4) 'พารามิเตอร์สุดท้าย มีความหมายเหมือนกับ CommandType
Set MyConn = Nothing
'**การเรียกขั้นตอนการจัดเก็บผ่านวัตถุ Recordset**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1 ,4
'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล พารามิเตอร์สุดท้ายมีความหมายเหมือนกับ CommandType
2 ไม่มีที่เก็บข้อมูลอินพุตและเอาต์พุต โปรดดูขั้นตอนที่เก็บไว้ต่อไปนี้สำหรับกระบวนการ
:
/*SP2*/
CREATE PROCEDURE dbo.delUserAll
ตามที่
ตั้งค่าไว้ nocount เมื่อ
เริ่มต้น
ลบจาก dbo.[userinfo]
end
go
ขั้นตอนการจัดเก็บนี้จะลบบันทึกทั้งหมดในตาราง userinfo โดยไม่มีอินพุตหรือเอาต์พุตใด ๆ การโทร โดยทั่วไปวิธีการจะเหมือนกับที่กล่าวไว้ข้างต้น ยกเว้นว่าไม่จำเป็นต้องได้รับชุดบันทึก :
'**เรียกขั้นตอนที่เก็บไว้ผ่านวัตถุ Command**
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล
MyComm.CommandText = "delUserAll" 'ระบุ ชื่อโพรซีเดอร์ที่เก็บไว้
MyComm.CommandType = 4 'ระบุว่านี่เป็นโพรซีเดอร์ที่เก็บไว้
MyComm.Prepared = true 'ต้องมีการคอมไพล์คำสั่ง SQL ก่อน
MyComm.Execute 'ไม่จำเป็นต้องได้รับชุดบันทึกที่นี่
ตั้งค่า MyComm = ไม่มีอะไร
เลย แน่นอน กระบวนงานที่เก็บไว้ดังกล่าวสามารถเรียกผ่านวัตถุการเชื่อมต่อหรือวัตถุชุดระเบียนได้ แต่วัตถุชุดระเบียนจะถูกสร้างขึ้นเพื่อรับชุดระเบียน ถ้าชุดระเบียนไม่ถูกส่งคืน จะดีกว่าถ้าใช้วัตถุคำสั่ง
3.เมื่อดำเนินการคล้ายกับ SP2
ขั้นตอนการจัดเก็บที่มีค่าส่งคืน
ควรใช้ความสามารถในการประมวลผลธุรกรรมอันทรงพลังของ SQL Server อย่างเต็มที่เพื่อรักษาความสอดคล้องของข้อมูลนอกจากนี้ เราอาจจำเป็นต้องมีขั้นตอนการจัดเก็บเพื่อส่งคืนสถานะการดำเนินการ ด้วยเหตุนี้ ให้แก้ไข SP2 ดังนี้:
/*SP3*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
beginning
BEGIN TRANSACTION
ลบออกจาก dbo.[userinfo]
IF error= 0
เริ่ม
COMMIT TRANSACTION
ส่งคืน 1
สิ้นสุด
ELSE
เริ่ม
ธุรกรรม ROLLBACK
ส่งคืน 0
สิ้นสุด
ส่งคืน
สิ้นสุด
ไป ขั้น
ตอนที่เก็บไว้ข้างต้นส่งคืน 1 เมื่อดำเนินการลบสำเร็จ มิฉะนั้นจะส่งคืน 0 และดำเนินการย้อนกลับ ในการรับค่าที่ส่งคืนใน ASP คุณต้องใช้คอลเลกชันพารามิเตอร์เพื่อประกาศพารามิเตอร์:
'**เรียกขั้นตอนที่เก็บไว้ด้วยค่าที่ส่งคืนและรับค่าที่ส่งคืน**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject ("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล
MyComm.CommandText = "delUserAll" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้
MyComm.CommandType = 4 'แสดงว่านี่เป็นโพรซีเดอร์ที่เก็บไว้
MyComm.Prepared = true 'ต้องคอมไพล์คำสั่ง SQL ก่อน
' คำสั่ง Return value
Set MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
MyComm.Execute
' Get the return value
DIM retValue
retValue = MyComm(0) ' หรือ retValue = MyComm.Parameters(0)
Set MyComm = Nothing
ใน MyComm.CreateParameter("RETURN",2,4) ความหมายของแต่ละพารามิเตอร์จะเป็นดังนี้:
พารามิเตอร์ตัวแรก ("RETURE") คือชื่อพารามิเตอร์ ชื่อพารามิเตอร์สามารถตั้งค่าได้ตามใจชอบ แต่โดยทั่วไปควรเหมือนกับชื่อพารามิเตอร์ที่ประกาศในขั้นตอนการจัดเก็บ นี่คือค่าส่งคืน ซึ่งฉันมักจะตั้งค่าเป็น "RETURE"
พารามิเตอร์ตัวที่สอง (2) ระบุประเภทข้อมูลของพารามิเตอร์ โปรดดูที่การอ้างอิง ADO ต่อไปนี้เป็นรหัสประเภทที่ใช้กันทั่วไป:
adBigInt: 20 ;
adBinary
: 3 ;
adTinyInt
:
16
;
adVarChar
:
200
;
สามารถนำมาใช้ได้ และ -1 ถึง - 99 เป็นค่าที่สงวนไว้
พารามิเตอร์ตัวที่สาม (4) ระบุถึงลักษณะของพารามิเตอร์ โดยที่ 4 บ่งชี้ว่านี่คือค่าที่ส่งคืน คำอธิบายของค่าของพารามิเตอร์นี้เป็นดังนี้:
0: ไม่สามารถกำหนดประเภทได้ 1: พารามิเตอร์อินพุต 3: พารามิเตอร์อินพุตหรือเอาต์พุต 4: ค่าส่งคืน
ควรกล่าวถึงโค้ด ASP ข้างต้น เป็นโค้ดที่สมบูรณ์ด้วย นั่นคือโค้ดที่ซับซ้อนที่สุด ที่จริงแล้ว
Set MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
สามารถทำให้ง่ายขึ้นเป็น
MyComm.Parameters.Append MyComm.CreateParameter( "RETURN",2,4)
หรือแม้กระทั่ง คุณสามารถทำให้ง่ายขึ้นต่อไปได้ ซึ่งจะอธิบายในภายหลัง
สำหรับกระบวนงานที่เก็บไว้พร้อมพารามิเตอร์สามารถเรียกได้โดยใช้วัตถุ Command เท่านั้น (ยังมีข้อมูลที่สามารถเรียกผ่านวัตถุ Connection หรือวัตถุ Recordset ได้ แต่ฉันยังไม่ได้ลอง)
4. ค่าที่ส่งคืนของกระบวนงานที่เก็บไว้พร้อมกับพารามิเตอร์อินพุตและพารามิเตอร์เอาต์พุต
คือพารามิเตอร์เอาต์พุตพิเศษ ในกรณีส่วนใหญ่ เราใช้ขั้นตอนการจัดเก็บที่มีทั้งพารามิเตอร์อินพุตและเอาต์พุต ตัวอย่างเช่น เราต้องการรับชื่อผู้ใช้ที่มี ID ที่แน่นอนในตารางข้อมูลผู้ใช้ ในขณะนี้ มีพารามิเตอร์อินพุต --user ID และพารามิเตอร์เอาต์พุต----ชื่อผู้ใช้ ขั้นตอนการจัดเก็บเพื่อใช้ฟังก์ชันนี้มีดังนี้:
/*SP4*/
CREATE PROCEDURE dbo.getUserName
@UserID int,
@UserName varchar(40) output
as
set nocount on
beginning
if @UserID is null return
select @UserName=username
from dbo .[ userinfo]
โดยที่ userid=@UserID
return
end
go
รหัส ASP ที่จะเรียกใช้ขั้นตอนที่เก็บไว้มีดังนี้:
'**เรียกขั้นตอนที่เก็บไว้ด้วยพารามิเตอร์อินพุตและเอาต์พุต**
DIM MyComm,UserID,ชื่อผู้ใช้
UserID = 1
ตั้งค่า MyComm = Server.CreateObject(" ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล
MyComm.CommandText = "getUserName" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้
MyComm.CommandType = 4 'บ่งชี้ว่านี่คือโพรซีเดอร์ที่เก็บไว้
MyComm Preparation = true 'ต้องใช้ SQL คอมไพล์คำสั่งก่อน
และประกาศพารามิเตอร์
MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)
MyComm.Parameters.append MyComm.CreateParameter("@UserName", 200,2,40)
MyComm. Execute
'รับพารามิเตอร์
UserName = MyComm(1)
Set MyComm = Nothing
ในโค้ดข้างต้น คุณจะเห็นว่า ไม่เหมือนกับการประกาศค่าที่ส่งคืน จำเป็นต้องมีพารามิเตอร์ 5 ตัวเมื่อประกาศพารามิเตอร์อินพุต และ 4 จำเป็นต้องใช้พารามิเตอร์เมื่อประกาศพารามิเตอร์เอาต์พุต เมื่อประกาศพารามิเตอร์อินพุต พารามิเตอร์ทั้งห้าได้แก่: ชื่อพารามิเตอร์ ประเภทข้อมูลพารามิเตอร์ ประเภทพารามิเตอร์ ความยาวข้อมูล และค่าพารามิเตอร์ เมื่อประกาศพารามิเตอร์เอาต์พุต จะไม่มีพารามิเตอร์สุดท้าย: ค่าพารามิเตอร์
ควรให้ความสนใจเป็นพิเศษ: เมื่อประกาศพารามิเตอร์ ลำดับจะต้องเหมือนกับลำดับที่กำหนดไว้ในขั้นตอนการจัดเก็บ และประเภทข้อมูลและความยาวของแต่ละพารามิเตอร์จะต้องเหมือนกันกับที่กำหนดไว้ในขั้นตอนการจัดเก็บด้วย
หากขั้นตอนการจัดเก็บมีหลายพารามิเตอร์ รหัส ASP จะดูยุ่งยาก คุณสามารถใช้คำสั่ง with เพื่อลดความซับซ้อนของรหัส:
'**เรียกขั้นตอนการจัดเก็บด้วยพารามิเตอร์อินพุตและเอาต์พุต (รหัสแบบง่าย)**
DIM MyComm,UserID,UserName
UserID = 1
ตั้งค่า MyComm = Server.CreateObject("ADODB.Command")
ด้วย MyComm
.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล CommandText
= "getUserName" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้ CommandType
= 4 'ระบุว่านี่คือ ขั้นตอนที่เก็บไว้Prepared
= true 'ต้องคอมไพล์คำสั่ง SQL ก่อน Parameters.append
.CreateParameter("@UserID",3,1,4,UserID)
.Parameters.append .CreateParameter("@UserName",200, 2,40)
.Execute
ลงท้ายด้วย
UserName = MyComm(1)
Set MyComm = Nothing
หากเราต้องการรับชื่อผู้ใช้ 10 ผู้ใช้ที่มี ID 1 ถึง 10 เราจำเป็นต้องสร้าง Command object 10 ครั้งหรือไม่? เลขที่ หากคุณต้องการเรียกใช้ขั้นตอนการจัดเก็บเดียวกันหลายครั้ง เพียงเปลี่ยนพารามิเตอร์อินพุตแล้วคุณจะได้รับเอาต์พุตที่แตกต่างกัน:
'**การเรียกขั้นตอนเดียวกันหลายครั้งไปยังขั้นตอนการจัดเก็บเดียวกัน**
DIM MyComm,UserID,UserName
UserName = ""
Set MyComm = Server .CreateObject( "ADODB.Command")
สำหรับ UserID = 1 ถึง 10
ด้วย MyComm
.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล CommandText
= "getUserName" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้ CommandType
= 4 'ระบุว่านี่คือ Stored Procedure.Prepared
= true 'ต้องคอมไพล์คำสั่ง SQL ก่อน
ถ้า UserID = 1 แล้ว
.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
.Parameters.append .CreateParameter("@UserName" ,200,2,40 )
.ดำเนินการ
อย่างอื่น
'กำหนดพารามิเตอร์อินพุตใหม่ (พารามิเตอร์อินพุตและพารามิเตอร์เอาต์พุตซึ่งค่าพารามิเตอร์ไม่เปลี่ยนแปลงในขณะนี้ ไม่จำเป็นต้องประกาศใหม่)
.Parameters("@UserID") = UserID
.Execute
end if
end with
UserName = UserName + MyComm( 1) + "," 'บางทีคุณอาจต้องการใช้อาร์เรย์เพื่อจัดเก็บ
ถัดไป
Set MyComm = Nothing.
ดังที่คุณเห็นจากโค้ดข้างต้น: เมื่อเรียกใช้ขั้นตอนการจัดเก็บเดียวกัน ซ้ำแล้วซ้ำอีกคุณจะต้องกำหนดพารามิเตอร์อินพุตใหม่ซึ่งมีค่าที่เปลี่ยนแปลงไป วิธีนี้คือ เมื่อมีพารามิเตอร์อินพุตและเอาต์พุตหลายตัว และค่าของพารามิเตอร์อินพุตเพียงตัวเดียวจะเปลี่ยนไปในแต่ละครั้งที่ถูกเรียก จำนวนโค้ดสามารถเป็นได้ ลดลงอย่างมาก
5. ขั้นตอนการจัดเก็บที่มีค่าส่งคืน พารามิเตอร์อินพุต และพารามิเตอร์เอาต์พุตในเวลาเดียวกัน ดังที่
ได้กล่าวไว้ข้างต้น เมื่อเรียกใช้ขั้นตอนที่เก็บไว้ ลำดับในการประกาศพารามิเตอร์จะต้องเหมือนกับลำดับที่กำหนดไว้ในกระบวนงานที่เก็บไว้ . อีกประเด็นที่ควรให้ความสนใจเป็นพิเศษ: หากกระบวนงานที่เก็บไว้มีทั้งค่าที่ส่งคืนและพารามิเตอร์อินพุตและเอาต์พุต จะต้องประกาศค่าที่ส่งคืนก่อน
เพื่อสาธิตวิธีการเรียกในกรณีนี้ เรามาปรับปรุงตัวอย่างข้างต้นกัน ยังคงได้รับชื่อผู้ใช้ของผู้ใช้ที่มี ID 1 แต่อาจเป็นไปได้ว่าไม่มีผู้ใช้อยู่ (ผู้ใช้ถูกลบไปแล้ว และหมายเลขผู้ใช้เป็นฟิลด์ที่เพิ่มขึ้นเอง) ขั้นตอนการจัดเก็บส่งคืนค่าที่แตกต่างกันขึ้นอยู่กับว่ามีผู้ใช้อยู่หรือไม่ ในขณะนี้ ขั้นตอนการจัดเก็บและโค้ด ASP เป็นดังนี้:
/*SP5*/
CREATE PROCEDURE dbo.getUserName
--เพื่อให้การแสดงผลของ "ลำดับ" ลึกซึ้งยิ่งขึ้น ให้กลับลำดับคำจำกัดความของพารามิเตอร์สองตัวต่อไปนี้
@UserName varchar( 40) เอาต์พุต
@UserID int
เป็น
ชุด nocount เมื่อ
เริ่มต้น
หาก @UserID เป็น null ส่งคืน
เลือก @UserName=ชื่อผู้ใช้
จาก dbo.[userinfo]
โดยที่ userid=@UserID
ถ้า rowcount> 0
ส่งคืน 1
อื่น ๆ
ส่งคืน 0
ส่งคืน
0สิ้นสุด
ไป
'** การเรียกมีทั้งค่าส่งคืนและอินพุต Stored Procedure สำหรับพารามิเตอร์และพารามิเตอร์เอาต์พุต**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
ด้วย MyComm
.ActiveConnection = MyConStr 'MyConStr คือการเชื่อมต่อฐานข้อมูล string.CommandText
= "getUserName" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้CommandType
= 4 'ระบุว่านี่เป็นโพรซีเดอร์ที่เก็บไว้
เตรียม = จริง 'ต้องมีการคอมไพล์คำสั่ง SQL ก่อน
' ค่าที่ส่งคืนจะต้องถูกประกาศก่อน พารามิเตอร์ ผนวก
.CreateParameter("RETURN",2,4)
'ลำดับการประกาศของพารามิเตอร์สองตัวต่อไปนี้จะกลับรายการเช่นกัน Parameters.append
.CreateParameter("@UserName",200,2,40)
.Parameters.append .CreateParameter(" @UserID",3,1,4,UserID)
ดำเนินการ
ลงท้ายด้วย
if MyComm(0) = 1 จากนั้น
UserName = MyComm(1)
else
UserName = "This user does not existing"
สิ้นสุดถ้า
Set MyComm = Nothing
6. Stored Procedure ที่ส่งคืนพารามิเตอร์และชุดระเบียนในเวลาเดียวกัน
บางครั้งเราต้องการกระบวนงานที่เก็บไว้ ส่งคืนพารามิเตอร์และชุดระเบียนในเวลาเดียวกัน ตัวอย่างเช่น เมื่อใช้กระบวนงานที่เก็บไว้สำหรับเพจ พารามิเตอร์ เช่น ชุดระเบียนและปริมาณข้อมูลทั้งหมดจะต้องส่งคืนพร้อมกัน เวลา. ต่อไปนี้เป็นขั้นตอนที่เก็บไว้สำหรับการประมวลผลเพจ:
/*SP6*/
CREATE PROCEDURE dbo.getUserList
@iPageCount int OUTPUT, --จำนวนเพจทั้งหมด
@iPage int, --หมายเลขหน้าปัจจุบัน
@iPageSize int --จำนวนบันทึกต่อหน้า
ตามที่
ตั้งค่าไว้ nocount เมื่อ
เริ่มต้น
--สร้างตารางชั่วคราว
สร้างตาราง #t (ID int IDENTITY, --
รหัสผู้ใช้ฟิลด์เพิ่มอัตโนมัติ,
ชื่อผู้ใช้ varchar(40))
--เขียนข้อมูลลงในตารางชั่วคราว
แทรกลงใน #t
เลือกรหัสผู้ใช้ ชื่อผู้ใช้จาก dbo [UserInfo]
เรียงลำดับตาม userid
-- รับจำนวนบันทึกทั้งหมด
ประกาศ @iRecordCount int
set @iRecordCount = rowcount
-- กำหนดจำนวนหน้าทั้งหมด
IF @iRecordCount%@iPageSize=0
SET @iPageCount=CEILING(@ iRecordCount/@iPageSize)
ELSE
SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1
--หากหมายเลขหน้าที่ร้องขอมากกว่าจำนวนหน้าทั้งหมด ให้แสดงหน้าสุดท้าย
IF @iPage > @iPageCount
SELECT @iPage = @iPageCount
--กำหนดบันทึกจุดเริ่มต้นและจุดสิ้นสุดของหน้าปัจจุบัน
DECLARE @iStart int --start record
DECLARE @iEnd int --end record
SELECT @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1
--รับบันทึกหน้าปัจจุบัน
เลือก * จาก # t โดยที่ ID> @iStart และ ID <@iEnd
--ลบตารางชั่วคราว
DROP TABLE #t
--ส่งคืนจำนวนบันทึกทั้งหมด
ส่ง
คืน @iRecordCount
end
goIn
ข้างต้นขั้นตอนการจัดเก็บ ป้อนหมายเลขหน้าปัจจุบันและจำนวนบันทึกต่อหน้า และส่งคืนหน้าปัจจุบัน ชุดบันทึก จำนวนหน้าทั้งหมด และจำนวนบันทึกทั้งหมด เพื่อให้เป็นแบบทั่วไปมากขึ้น จำนวนระเบียนทั้งหมดจะถูกส่งกลับเป็นค่าที่ส่งคืน ต่อไปนี้เป็นรหัส ASP ที่เรียกขั้นตอนการจัดเก็บ (การดำเนินการเพจจิ้งเฉพาะจะถูกละเว้น):
'**เรียกขั้นตอนการจัดเก็บเพจจิ้ง**
DIM pagenow, pagesize, pagecount, recordcount
DIM MyComm, MyRst
pagenow = Request("pn")
'กำหนดเอง ฟังก์ชั่นนี้ใช้ในการตรวจสอบตัวเลขธรรมชาติ
ถ้า CheckNar(pagenow) = false แล้ว pagenow = 1
pagesize = 20
Set MyComm = Server.CreateObject("ADODB.Command")
ด้วย MyComm
.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล .CommandText
= "getUserList " 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้CommandType
= 4 'ระบุว่านี่เป็นโพรซีเดอร์ที่เก็บไว้
เตรียม = จริง 'ต้องคอมไพล์คำสั่ง SQL ก่อน
' ส่งคืนค่า (จำนวนบันทึกทั้งหมด)
.Parameters.Append CreateParameter("RETURN",2,4 )
'พารามิเตอร์เอาต์พุต (จำนวนหน้าทั้งหมด)
.Parameters.Append .CreateParameter("@iPageCount",3,2)
'พารามิเตอร์อินพุต (หมายเลขหน้าปัจจุบัน)
.Parameters.append .CreateParameter( "@iPage",3,1,4 ,pagenow)
'ป้อนพารามิเตอร์ (จำนวนบันทึกต่อหน้า)
.Parameters.append .CreateParameter("@iPageSize",3,1,4,pagesize)
Set MyRst = .Execute
ลงท้ายด้วย
ถ้า MyRst.state = 0 จากนั้น 'ไม่ได้รับข้อมูล MyRst ปิด
บันทึกนับ = -1
อย่างอื่น
MyRst.close 'หมายเหตุ: หากต้องการรับค่าพารามิเตอร์ คุณจะต้องปิดวัตถุชุดบันทึกก่อน
จำนวนหน้าบันทึก = MyComm(0)
จำนวนหน้า = MyComm( 1)
ถ้า cint(pagenow)> =cint(pagecount) แล้ว pagenow=pagecount
end ถ้า
Set MyComm = Nothing
'ต่อไปนี้จะแสดงบันทึก
ถ้า recordcount = 0 แล้ว
Response.Write "No record"
มิฉะนั้น ถ้า recordcount > 0 แล้ว
MyRst.open
ทำ จนกระทั่ง MyRst.EOF
......
วนซ้ำ
'ต่อไปนี้จะแสดงข้อมูลเพจ
...
else 'recordcount=-1
Response.Write "Parameter error"
จบหาก
เกี่ยวกับโค้ดข้างต้น มีเพียงจุดเดียวเท่านั้นที่ต้องเป็น อธิบาย: เมื่อส่งคืนชุดระเบียนและพารามิเตอร์พร้อมกัน หากคุณต้องการรับพารามิเตอร์ คุณต้องปิดชุดระเบียนก่อน จากนั้นจึงเปิดชุดระเบียนเมื่อใช้งาน
7. ขั้นตอนการจัดเก็บที่ส่งคืนชุดระเบียนหลายชุด
สิ่งแรกที่บทความนี้แนะนำคือขั้นตอนการจัดเก็บที่ส่งคืนชุดระเบียน บางครั้ง จำเป็นต้องมีขั้นตอนการจัดเก็บเพื่อส่งคืนชุดระเบียนหลายชุด ใน ASP จะรับชุดระเบียนเหล่านี้พร้อมกันได้อย่างไร เพื่อที่จะอธิบายปัญหานี้ ให้เพิ่มสองฟิลด์ลงในตารางข้อมูลผู้ใช้: usertel และ usermail และตั้งค่าให้เฉพาะผู้ใช้ที่เข้าสู่ระบบเท่านั้นที่สามารถดูเนื้อหาทั้งสองนี้ได้
/*SP7*/
สร้างขั้นตอน dbo.getUserInfo
@userid int,
@checklogin bit
เป็น
ชุด nocount เมื่อ
เริ่มต้น
หาก @userid เป็น null หรือ @checklogin เป็น null ให้ส่งคืน
เลือกชื่อผู้ใช้
จาก dbo.[usrinfo]
โดยที่ userid=@userid
--if Log ในผู้ใช้ ให้รับ usertel และ usermail
หาก @checklogin=1
เลือก usertel,usermail
จาก dbo.[userinfo]
โดยที่ userid=@userid
return
end
go
ต่อไปนี้คือรหัส ASP:
'**เรียกขั้นตอนการจัดเก็บที่ส่งคืนชุดระเบียนหลายชุด**
DIM checklg,UserID,UserName,UserTel,UserMail
DIM MyComm,MyRst
UserID = 1
'checklogin() เป็นฟังก์ชันที่กำหนดเองเพื่อตรวจสอบว่าผู้เยี่ยมชมเข้าสู่ระบบ
checklg = checklogin()
Set MyComm = Server.CreateObject("ADODB.Command" )
ด้วย MyComm
.ActiveConnection = MyConStr 'MyConStr คือสตริงการเชื่อมต่อฐานข้อมูล CommandText
= "getUserInfo" 'ระบุชื่อโพรซีเดอร์ที่เก็บไว้ CommandType
= 4 'ระบุว่านี่เป็นโพรซีเดอร์ที่เก็บไว้ Prepared
= true 'ต้องมีคำสั่ง SQL ที่จะคอมไพล์ first.Parameters.append
.CreateParameter ("@userid",3,1,4,UserID)
.Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)
Set MyRst = .Execute
จบด้วย
Set MyComm = ไม่มี
'ตั้งแต่ชุดแรก รับค่าจากชุดระเบียน
UserName = MyRst(0)
'รับค่าจากชุดระเบียนที่สอง
ถ้าไม่ใช่ MyRst คือ Nothing แล้ว
ตั้งค่า MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail = MyRst(1)
สิ้นสุดถ้า
ตั้งค่า MyRst = ไม่มีเลย
ในโค้ดข้างต้น วิธี NextRecordset ของวัตถุ Recordset จะถูกนำมาใช้เพื่อรับชุดระเบียนหลายชุดที่ส่งคืนโดยขั้นตอนการจัดเก็บ
จนถึงตอนนี้ บทความนี้ได้ให้คำอธิบายที่ค่อนข้างครอบคลุมเกี่ยวกับสถานการณ์ต่างๆ ที่ ASP เรียกกระบวนงานที่เก็บไว้ สุดท้ายนี้ เรามาพูดถึงวิธีการต่างๆ ในการเรียกโพรซีเจอร์ที่เก็บไว้หลายขั้นตอนในโปรแกรม ASP
ในโปรแกรม ASP มีความเป็นไปได้ที่จะเรียกโพรซีเดอร์ที่เก็บไว้หลายตัวอย่างน้อยสามวิธีต่อไปนี้:
1. สร้างออบเจ็กต์คำสั่งหลายรายการ
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'เรียกโพรซีเดอร์ที่เก็บไว้หนึ่ง
.. . ...
Set MyComm = Nothing
Set MyComm = Server.CreateObject("ADODB.Command")
'เรียกกระบวนงานที่เก็บไว้สอง
...
Set MyComm = Nothing
...
2. สร้าง Command object เดียวเท่านั้น เมื่อวางสาย ให้ล้างมัน พารามิเตอร์
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'เรียกกระบวนงานที่เก็บไว้หนึ่ง
...
' ล้างพารามิเตอร์ (สมมติว่ามีพารามิเตอร์สามตัว)
MyComm.Parameters.delete 2
MyComm Parameters.delete 1
MyComm.Parameters ลบ 0
'เรียกขั้นตอนที่เก็บไว้ที่สองและล้างพารามิเตอร์
...
Set MyComm = Nothing
ในขณะนี้ โปรดทราบ: ลำดับการล้างพารามิเตอร์อยู่ตรงข้ามกับลำดับการประกาศพารามิเตอร์ เหตุผลก็คือฉันไม่ทราบ .
3. ใช้วิธีการรีเฟรชของการรวบรวมข้อมูลพารามิเตอร์เพื่อรีเซ็ตออบเจ็กต์พารามิเตอร์
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'เรียกกระบวนงานที่เก็บไว้หนึ่ง
...
'รีเซ็ตออบเจ็กต์พารามิเตอร์ทั้งหมดที่มีอยู่ในการรวบรวมข้อมูลพารามิเตอร์
MyComm.Parameters.Refresh
'เรียกขั้นตอนที่เก็บไว้ 2
...
ตั้งค่า MyComm = Nothing
โดยทั่วไปเชื่อกันว่าการสร้างอ็อบเจ็กต์ซ้ำ ๆ เป็นวิธีที่มีประสิทธิภาพน้อยกว่า แต่หลังจากการทดสอบ (เครื่องมือทดสอบคือ Microsoft Application Center Test) ผลลัพธ์ที่ไม่คาดคิด:
วิธีที่ 2 > = วิธีที่ 1 >> วิธีที่ 3
ความเร็วการทำงานของวิธีที่ 2 มากกว่าหรือเท่ากับวิธีที่ 1 (สูงกว่าประมาณ 4%) ความเร็วการทำงานของทั้งสองวิธีนี้เร็วกว่าวิธีที่ 3 มาก (มากถึง 130) %) ดังนั้นจึงแนะนำให้ใช้ เมื่อมีพารามิเตอร์หลายตัว จะใช้วิธีที่ 1 เมื่อมีพารามิเตอร์น้อย จะใช้วิธีที่ 2
ฉันใช้เวลาหนึ่งวันในการเขียนประสบการณ์ผิวเผินบางส่วนของฉันในการเรียกกระบวนงานที่เก็บไว้ใน ASP ในที่สุด ในหมู่พวกเขาบางคนฉันรู้แค่ผลแต่ไม่รู้สาเหตุและบางคนอาจผิด แต่ทั้งหมดนี้เป็นผลมาจากการปฏิบัติส่วนตัวของฉัน โปรดยอมรับมันอย่างมีวิจารณญาณผู้อ่าน ท่านใดมีความเห็นแตกต่าง กรุณาแจ้งให้ทราบล่วงหน้าครับ.