แนะนำ: การเขียนโปรแกรมขั้นสูง ASP 3.0 (สิบสอง) 4.2.3 ตัวอย่างของคำแนะนำที่มีอยู่ฝั่งเซิร์ฟเวอร์ส่วนนี้ให้หน้าตัวอย่างที่สามารถใช้ในการทดสอบกับข้อความที่มีฝั่งเซิร์ฟเวอร์ต่างๆ เปิดไดเรกทอรีย่อยของหน้าเว็บตัวอย่างบทที่ 04 แสดงคำสั่ง SSI และออบเจ็กต์เซิร์ฟเวอร์ ASP & RDQU
9.2.3 ขั้นตอนที่เก็บไว้การใช้ขั้นตอนที่เก็บไว้เป็นพื้นที่ที่มีการใช้วัตถุคำสั่ง ขั้นตอนที่เก็บไว้ (บางครั้งเรียกว่าการสืบค้นที่เก็บข้อมูล) เป็นคำสั่ง SQL แบบสอบถามที่กำหนดไว้ล่วงหน้าในฐานข้อมูล
ทำไมคุณควรสร้างและใช้ขั้นตอนที่เก็บไว้แทนการใช้สตริง SQL โดยตรงในรหัสของคุณ มีเหตุผลหลักหลายประการ:
·ขั้นตอนที่เก็บไว้ได้รับการรวบรวมโดยฐานข้อมูล สิ่งนี้ส่งผลให้เกิดแผนปฏิบัติการดังนั้นฐานข้อมูลจึงรู้ว่ามันจะทำอะไรได้อย่างชัดเจนดังนั้นจึงเร่งการดำเนินการของกระบวนการ
ขั้นตอนที่เก็บไว้มักจะถูกแคชโดยฐานข้อมูลซึ่งทำให้พวกเขาทำงานได้เร็วขึ้นเพราะไม่จำเป็นต้องอ่านจากดิสก์ในเวลานี้ ฐานข้อมูลทั้งหมดไม่สนับสนุนกลไกการแคชนี้ ตัวอย่างเช่นการเข้าถึงของ Microsoft ไม่รองรับ แต่ SQL Server รองรับ
·โดยการระบุว่าตารางในฐานข้อมูลสามารถแก้ไขได้โดยขั้นตอนที่เก็บไว้เท่านั้นข้อมูลสามารถทำให้มั่นใจได้ว่าปลอดภัยยิ่งขึ้น ซึ่งหมายความว่าการดำเนินการ SQL ที่อาจเป็นอันตรายจะไม่ถูกดำเนินการ
·รหัส ASP สามารถหลีกเลี่ยงการผสมร่วมกับคำสั่ง SQL ที่มีความยาวทำให้รหัส ASP ง่ายต่อการบำรุงรักษา
·รหัส SQL ทั้งหมดสามารถเก็บไว้ตรงกลางบนเซิร์ฟเวอร์
·พารามิเตอร์เอาท์พุทสามารถใช้ในขั้นตอนที่เก็บไว้เพื่ออนุญาตให้ส่งคืนของชุดระเบียนหรือค่าอื่น ๆ
โดยทั่วไปขั้นตอนที่เก็บไว้มักจะเร็วกว่าคำสั่ง SQL ที่เทียบเคียงได้
หากต้องการใช้ขั้นตอนที่เก็บไว้เพียงใช้ชื่อขั้นตอนที่เก็บไว้เป็นข้อความคำสั่งและตั้งค่าประเภทที่เกี่ยวข้อง ตัวอย่างเช่นพิจารณาตัวอย่างก่อนหน้าของราคาหนังสือที่อัปเดต หากคุณสร้างขั้นตอนที่เก็บไว้บน SQL Server คุณสามารถเขียนโค้ด:
สร้างโพรซีเดอร์ usp_updateprices
เช่น
อัปเดตชื่อเรื่อง
ตั้งราคา = ราคา * 1.10
โดยที่ประเภท = 'ธุรกิจ'
สำหรับฐานข้อมูลการเข้าถึงของ Microsoft งานเดียวกันสามารถทำได้โดยใช้คำสั่ง Query Update Simple
ในการเรียกใช้ขั้นตอนที่เก็บไว้นี้ในหน้าเว็บ ASP เพียงใช้รหัสต่อไปนี้:
ตั้งค่า cmdupdate = server.createObject (adoDb.Command)
cmdupdate.activeConnection = strconn
cmdupdate.CommandText = USP_UPDATEPRICES
CMDUPDATE.COMMANDTYPE = ADCMDSTORDPROC
cmdupdate.execute ,, adexecutenorecords
นี่เป็นเพียงการเรียกใช้ขั้นตอนที่เก็บไว้ ไม่มีชุดบันทึกส่งคืนเนื่องจากข้อมูลเพิ่งได้รับการอัปเดต เป็นสิ่งสำคัญที่ต้องจำไว้ว่าคุณไม่ได้สร้างชุดบันทึกเว้นแต่คุณต้องการมันจริงๆ
ในขณะที่นี่ก็โอเคมันไม่ได้มีความยืดหยุ่นมากนักเนื่องจากเป็นเพียงการจัดการกับหนังสือประเภทหนึ่งเท่านั้น วิธีที่ดีกว่าคือการสร้างกระบวนการที่ช่วยให้เราสามารถเลือกประเภทหนังสือเพื่อที่เราจะได้ไม่ต้องสร้างกระบวนการสำหรับหนังสือแต่ละประเภท นอกจากนี้การอัปเดต 10% คงที่สามารถลบออกได้ซึ่งทำให้ความยืดหยุ่นดีขึ้น แล้วฉันจะทำสิ่งนี้ได้อย่างไร? มันง่ายมากใช้พารามิเตอร์
1. พารามิเตอร์
พารามิเตอร์ (หรือตัวแปร) ของขั้นตอนที่เก็บไว้นั้นเหมือนกับขั้นตอนและฟังก์ชั่นทั่วไป พวกเขาสามารถส่งผ่านไปยังฟังก์ชั่นและฟังก์ชั่นสามารถใช้ค่าได้ ขั้นตอนที่เก็บไว้ใน SQL Server (เช่นเดียวกับฐานข้อมูลอื่น ๆ รวมถึงการเข้าถึง) มีฟังก์ชั่นนี้
เพื่อให้ขั้นตอนที่เก็บไว้ในการจัดการหนังสือหลายประเภทและยังอนุญาตให้ผู้ใช้ระบุการเพิ่มขึ้น (หรือลดลง) ของราคาจำเป็นต้องเพิ่มพารามิเตอร์บางอย่าง:
สร้างโพรซีเดอร์ usp_updateprices
@type Char (12)
@percent money
เช่น
อัปเดตชื่อเรื่อง
ตั้งราคา = ราคา * (1 @percent / 100)
โดยที่ type = @type
ตอนนี้ขั้นตอนที่เก็บไว้ USP_UPDATEPRICES ใช้เวลาสองพารามิเตอร์:
·หนึ่งคือประเภทของหนังสือ (@type)
·หนึ่งคือเปอร์เซ็นต์ของการเปลี่ยนแปลงราคาหนังสือ (@percent)
เช่นเดียวกับฟังก์ชั่นของ VBScript พารามิเตอร์เหล่านี้เป็นตัวแปร อย่างไรก็ตามแตกต่างจาก VBScript และภาษาสคริปต์อื่น ๆ ตัวแปรในภาษาสคริปต์เหล่านี้เป็นประเภทตัวแปรทั้งหมดในขณะที่ตัวแปร SQL มีประเภทที่แน่นอน (ถ่านเงิน ฯลฯ ) ข้อกำหนดการตั้งชื่อของตัวแปร SQL จะต้องปฏิบัติตามนั่นคือตัวแปรจะต้องเริ่มต้นด้วยสัญลักษณ์ @
โปรดทราบว่าเรามีเปอร์เซ็นต์ที่ผ่านเข้าสู่กระบวนการนี้เป็นจำนวนเต็ม (เช่น 10 หมายถึง 10%) แทนที่จะเป็นค่าเศษส่วน สิ่งนี้ทำให้ขั้นตอนที่เก็บไว้ใช้งานง่ายขึ้นเล็กน้อย
2. การรวบรวมพารามิเตอร์
ดังนั้นตอนนี้มีขั้นตอนที่เก็บไว้พร้อมพารามิเตอร์ แต่คุณเรียกมันผ่าน ADO ได้อย่างไร? เราได้เห็นวิธีการเรียกขั้นตอนที่เก็บไว้โดยไม่มีพารามิเตอร์ที่มีวัตถุคำสั่งและในความเป็นจริงไม่มีความแตกต่างระหว่างพวกเขา ความแตกต่างคือการใช้คอลเลกชันพารามิเตอร์
การรวบรวมพารามิเตอร์มีวัตถุพารามิเตอร์สำหรับแต่ละพารามิเตอร์ในขั้นตอนที่เก็บไว้ อย่างไรก็ตาม ADO ไม่ทราบโดยอัตโนมัติว่าพารามิเตอร์เหล่านี้คืออะไรดังนั้นพวกเขาจึงต้องสร้างโดยใช้วิธี createParameter ในรูปแบบต่อไปนี้:
ตั้งค่าพารามิเตอร์ = command.createparameter (ชื่อ, [type], [ทิศทาง], [ขนาด], [value])
พารามิเตอร์และคำอธิบายแสดงในตารางที่ 9-3:
ตารางที่ 9-3 พารามิเตอร์และคำอธิบายของวิธี createparameter
พารามิเตอร์
อธิบาย
ชื่อ
ชื่อพารามิเตอร์ นี่คือชื่อพารามิเตอร์ในการรวบรวมพารามิเตอร์ไม่ใช่ชื่อพารามิเตอร์ในโพรซีเดอร์ที่เก็บไว้ อย่างไรก็ตามการใช้ชื่อเดียวกันเป็นวิธีปฏิบัติที่ดี
พิมพ์
ประเภทข้อมูลของพารามิเตอร์ อาจเป็นค่าคงที่ addatatype ดูภาคผนวกสำหรับรายละเอียด
ทิศทาง
ทิศทางของพารามิเตอร์ระบุว่าพารามิเตอร์ให้ข้อมูลไปยังขั้นตอนที่เก็บไว้หรือขั้นตอนที่เก็บคืนข้อมูลส่งคืนข้อมูลไปยัง ADO มันสามารถเป็นหนึ่งในค่าต่อไปนี้:
adparaminput พารามิเตอร์คือพารามิเตอร์อินพุตที่ส่งผ่านไปยังขั้นตอนที่เก็บไว้
adparamoutput พารามิเตอร์คือพารามิเตอร์เอาต์พุตที่ดึงมาจากขั้นตอนที่เก็บไว้
AdParamInputOutput พารามิเตอร์สามารถใช้เป็นพารามิเตอร์ทั้งอินพุตและเอาต์พุต
adparamreturnValue พารามิเตอร์นี้มีสถานะที่ส่งคืนโดยขั้นตอนที่เก็บไว้
ขนาด
ความยาวพารามิเตอร์ สำหรับประเภทความยาวคงที่เช่นจำนวนเต็มค่านี้สามารถละเว้นได้
ค่า
ค่าของพารามิเตอร์
เมื่อสร้างพารามิเตอร์แล้วสามารถผนวกเข้ากับคอลเลกชันพารามิเตอร์ได้เช่น:
ตั้งค่า parvalue = cmdupdate.createparameter (@type, advarwchar, adparaminput, _
12, ธุรกิจ)
cmdupdate.parameters.append Parvalue
ตั้งค่า parvalue = cmdupdate.createparameter (@percent, adcurrency, _
adparaminput ,, 10)
cmdupdate.parameters.append Parvalue
ไม่จำเป็นต้องสร้างวัตถุอย่างชัดเจนเพื่อบันทึกพารามิเตอร์ประเภทตัวแปรเริ่มต้นสามารถทำงานได้ค่อนข้างดี หากคุณไม่ต้องการสร้างตัวแปรคุณสามารถใช้ทางลัดเช่นรหัสต่อไปนี้:
cmdupdate.parameters.append = _
cmdupdate.createparameter (@percent, adcurrency, adparaminput, 10)
สิ่งนี้ใช้วิธี createParameter เพื่อส่งคืนวัตถุพารามิเตอร์และรับด้วยวิธีการผนวก วิธีนี้ทำงานได้เร็วกว่าการใช้ตัวแปร แต่ยืดเส้นโค้ดให้ยาวขึ้นทำให้สามารถอ่านได้น้อยลง คุณสามารถเลือกหนึ่งในวิธีการเหล่านี้ตามงานอดิเรกของคุณ
หลังจากเพิ่มพารามิเตอร์ลงในการรวบรวมพารามิเตอร์แล้วพวกเขาจะถูกเก็บไว้ในนั้นดังนั้นพารามิเตอร์แต่ละตัวไม่จำเป็นต้องกำหนดค่าเมื่อสร้างพารามิเตอร์ ค่าของพารามิเตอร์สามารถตั้งค่าได้ตลอดเวลาก่อนที่คำสั่งจะถูกเรียกใช้ ตัวอย่างเช่น:
cmdupdate.parameters.append = _
cmdupdate.createparameter (@percent, adcurrency, adparaminput)
cmdupdate.parameters (@percent) = 10
บทก่อนหน้ากล่าวว่ามีหลายวิธีในการเข้าถึงค่าในการรวบรวมและการรวบรวมพารามิเตอร์ไม่แตกต่างกัน ตัวอย่างด้านบนใช้ชื่อของพารามิเตอร์เพื่อดึงพารามิเตอร์ในชุดหรือสามารถค้นหาได้โดยใช้หมายเลขดัชนี:
cmdupdate.parameters (0) = 10
รหัสด้านบนกำหนดพารามิเตอร์แรกในชุดพารามิเตอร์ (พารามิเตอร์ที่ตั้งค่าหมายเลขจาก 0)
แบ่งปัน: ความรู้ที่เกี่ยวข้องเกี่ยวกับวัตถุข้อผิดพลาด ASP ขั้นสูงสำหรับแอปพลิเคชัน ASP ใน VBScript มีคำสั่ง onerrorresumenext ที่ทำให้สคริปต์ล่ามที่จะละเว้นข้อผิดพลาดรันไทม์และดำเนินการต่อของรหัสสคริปต์ต่อไป จากนั้นสคริปต์สามารถตรวจสอบค่าของคุณสมบัติ err.number เพื่อตรวจสอบว่าเกิดข้อผิดพลาดหรือไม่ หากเกิดข้อผิดพลาดค่าที่ไม่เป็นศูนย์จะถูกส่งคืน