ASP การบรรยายที่ 9: ASP และฐานข้อมูล (4)
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-05-30 19:54:56
ในการบรรยายนี้ เราจะแนะนำวิธีการใช้พารามิเตอร์และขั้นตอนการจัดเก็บเป็นหลัก
1. ใช้อ็อบเจ็กต์ Command และอ็อบเจ็กต์พารามิเตอร์เพื่อถ่ายโอนพารามิเตอร์ การบรรยายนี้จะใช้ฐานข้อมูล Microsoft SQL Server7.0 เป็นหลัก ขั้นแรกให้สร้างไฟล์เชื่อมต่อ AdoSQL7.asp สำหรับการสำรองข้อมูล อนาคต.
<% 'AdoSQL7.asp
ตัวเลือกที่ชัดเจน
การตอบกลับหมดอายุ = 0
'ส่วนที่ 1: การสร้างการเชื่อมต่อ
ดิมซีเอ็นน์, StrCnn
ตั้งค่า Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provider=sqloledb; ID ผู้ใช้=sa; รหัสผ่าน=; แค็ตตาล็อกเริ่มต้น=pubs; แหล่งข้อมูล=ICBCZJP"
Cnn.เปิด StrCnn
-
หมายเหตุ: เมื่อใช้ด้วยตนเอง ให้ตั้งค่าแหล่งข้อมูลเป็นชื่อเครื่องของเซิร์ฟเวอร์ฐานข้อมูลของคุณ
นอกจากนี้ เมื่อใช้ฐานข้อมูล Access ในอดีต การใช้ Microsoft Access97 เพื่อดูฟิลด์และข้อมูลจะสะดวกมาก อย่างไรก็ตาม เมื่อใช้ฐานข้อมูล SQL Server โดยเฉพาะอย่างยิ่งเมื่อทำการดีบักสคริปต์ ASP ที่ไม่ได้อยู่ในเซิร์ฟเวอร์ฐานข้อมูล แต่อยู่บนเครื่องอื่น จำเป็นสำหรับการดูฟิลด์และข้อมูล ต้องติดตั้งข้อมูลแยกต่างหาก นี่คือเครื่องมือสำหรับคุณ: Msqry32.exe (Microsoft Query) ไฟล์นี้ได้รับการติดตั้งด้วย Office97 และโดยทั่วไปจะอยู่ในไดเร็กทอรี "Microsoft OfficeOffice"
ตัวอย่าง wuf70.asp:
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf70.asp
หรี่ cmdTest, prmTest, rsTest
'สร้างวัตถุคำสั่ง
ตั้งค่า cmdTest = Server.CreateObject("ADODB.Command")
'วัตถุชุดระเบียนและคำสั่งสามารถเชื่อมต่อกับวัตถุการเชื่อมต่อผ่านคุณสมบัติ ActiveConnection
cmdTest.ActiveConnection = Cnn
'คำสั่ง SQL - มีสองพารามิเตอร์ ใช้ไหม? ด่วน
cmdTest.CommandText = "อัปเดตงาน ตั้งค่า job_desc = ? โดยที่ job_id = ?"
'กำหนดประเภทคำสั่งให้เป็นคำสั่ง SQL'
cmdTest.CommandType = adCmdText
'แอตทริบิวต์ที่เตรียมไว้จะกำหนดว่าจะคอมไพล์คำสั่ง SQL ก่อนหรือไม่ การตั้งค่าเป็น True จะทำให้การดำเนินการเร็วขึ้นหรือไม่
cmdTest.Prepared = จริง
'สร้างวัตถุพารามิเตอร์
ตั้งค่า prmTest=cmdTest.CreateParameter("job_desc",adVarChar,adParamInput,50,"เครือข่าย")
'ผนวกข้อมูลเข้ากับการรวบรวมข้อมูลพารามิเตอร์
cmdTest.Parameters.Append prmTest
ตั้งค่า prmTest = cmdTest.CreateParameter("job_id",adSmallInt,adParamInput,,"12")
cmdTest.Parameters.Append prmTest
'ดำเนินการแก้ไข - ไม่จำเป็นต้องส่งคืนผลลัพธ์ เพียงใช้ cmdTest.Execute
cmdTest.Execute
'รีเซ็ตพารามิเตอร์แล้วรัน – คุณสามารถแก้ไขข้อมูลชิ้นอื่นได้
cmdTest.Parameters("job_id") = "1"
cmdTest.Parameters("job_desc") = "ทดสอบ"
cmdTest.Execute
'รีเซ็ตพารามิเตอร์เพื่อรัน'
cmdTest("job_id") = "14"
cmdTest("job_desc") = "การเงิน"
cmdTest.Execute
ตั้งค่า rsTest = Cnn.Execute("เลือก job_id,job_desc จากงาน")
ในขณะที่ไม่ใช่ rsTest.EOF
การตอบกลับเขียน rsTest(0) & rsTest(1) & "<br>"
rsTest.MoveNext
เวนด์
Cnn.close : ตั้งค่า prmTest = ไม่มีเลย
ตั้งค่า cmdTest = ไม่มีเลย: ตั้งค่า Cnn = ไม่มีเลย
-
วิเคราะห์:
1. เมธอด CreateParameter ของออบเจ็กต์ Command ใช้เพื่อสร้างออบเจ็กต์พารามิเตอร์สำหรับคำสั่ง SQL หรือขั้นตอนที่เก็บไว้ มีทั้งหมด 5 พารามิเตอร์ (ทั้ง 5 พารามิเตอร์เป็นทางเลือก):
พารามิเตอร์แรก: ชื่อของวัตถุพารามิเตอร์;
พารามิเตอร์ที่สอง : ประเภทข้อมูลของวัตถุพารามิเตอร์มีหลายประเภทเกินไป โปรดดูวิธีใช้ ADO ที่นี่ adVarChar (ค่าสตริง) adSmallInt (จำนวนเต็มลงนาม 2 ไบต์);
พารามิเตอร์ที่สาม: ประเภทพารามิเตอร์ สามารถเป็น: adParamInput (ระบุพารามิเตอร์อินพุต), adParamOutput (ระบุพารามิเตอร์เอาต์พุต), adParamReturnValue (ระบุค่าที่ส่งคืน), adParamUnknown (ระบุว่าไม่สามารถระบุประเภทพารามิเตอร์ได้), adParamInputOutput (ระบุพารามิเตอร์อินพุต/เอาต์พุต);
พารามิเตอร์ที่สี่: ความยาวข้อมูลของพารามิเตอร์ เป็นการดีที่สุดที่จะระบุให้เท่ากับความยาวของฟิลด์ที่เกี่ยวข้องในฐานข้อมูลเพื่อหลีกเลี่ยงข้อผิดพลาดเมื่อใช้งานโดยเฉพาะอย่างยิ่งเมื่อประเภทข้อมูลเป็น VarChar หากเป็นจำนวนเต็มหรือ ประเภทวันที่ คุณไม่จำเป็นต้องระบุค่านี้
พารามิเตอร์ที่ห้า: ค่าเริ่มต้นของการตั้งค่าพารามิเตอร์
2. เมธอด cmdTest.Parameters.Append เพิ่มอ็อบเจ็กต์พารามิเตอร์ในการรวบรวมข้อมูลพารามิเตอร์ จากตัวอย่างนี้ คุณยังสามารถดูวิธีใช้พารามิเตอร์หลายตัวได้
3. ดังที่คุณเห็นจากตัวอย่างนี้ คุณเพียงแค่ต้องรีเซ็ตพารามิเตอร์อินพุตเพื่อแก้ไขข้อมูลอื่น ๆ ซึ่งสะดวกมาก แนวคิดนี้ยังเป็นหนึ่งในวิธีการที่ใช้บ่อยที่สุดในการเขียนโปรแกรมอีกด้วย
4. หากต้องการรีเซ็ตพารามิเตอร์ คุณสามารถใช้ cmdTest.Parameters หรือละเว้นเป็น cmdTest("job_id")
2. การใช้ Stored Procedure ใน ASP คืออะไร Stored Procedures ( Stored Procedure อยู่ในเซิร์ฟเวอร์ฐานข้อมูลและเป็นชุดของคำสั่ง SQL ที่สามารถมีคำสั่ง SQL ตั้งแต่หนึ่งคำสั่งขึ้นไป) เนื้อหาการบรรยายครั้งนี้ ส่วนใหญ่จะยกตัวอย่างเพื่ออธิบายวิธีการเรียก Stored Procedure ใน ASP
ประโยชน์ของการใช้โพรซีเจอร์ที่เก็บไว้นั้นมีประสิทธิภาพมากกว่าการรันคำสั่ง SQL ในสคริปต์ ASP โดยสามารถปรับปรุงประสิทธิภาพโดยรวมและลดภาระของเครือข่ายได้ (ลดการโต้ตอบระหว่างเซิร์ฟเวอร์เครือข่ายและเซิร์ฟเวอร์ข้อมูล) และเพิ่มความยืดหยุ่นของโค้ด ฯลฯ
(1) การใช้พารามิเตอร์อินพุตในกระบวนงานที่เก็บไว้ ขั้นตอนการจัดเก็บที่ใช้ในตัวอย่างนี้คือ "byroyalty" ที่มาพร้อมกับ SQL Server 7.0 คำสั่ง SQL ในนั้นไม่มีอะไรมากไปกว่า CREATE PROCEDURE เพิ่มเติมและอินพุต พารามิเตอร์คือ @percentage:
สร้างขั้นตอนโดยroyalty @percentage int
เช่น
เลือก au_id จาก titleauthor
โดยที่ titleauthor.royaltyper = @percentage
ตัวอย่าง wuf71.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf71.asp
หรี่ cmdTest, prmTest, rsTest
ตั้งค่า cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.CommandText = "byroyalty" 'ชื่อกระบวนงานที่เก็บไว้
'ตั้งค่าประเภทคำสั่งเป็นขั้นตอนการจัดเก็บ
cmdTest.CommandType = adCmdStoredProc
'สร้างวัตถุพารามิเตอร์
ตั้งค่า prmTest = Server.CreateObject("ADODB.Parameter")
'แอตทริบิวต์ประเภทสอดคล้องกับพารามิเตอร์ตัวที่สองใน wuf70.asp
prmTest.Type = adInteger แอตทริบิวต์ทิศทาง 'จำนวนเต็ม 4 ไบต์ที่ลงนาม' สอดคล้องกับพารามิเตอร์ที่สามใน wuf70.asp
prmTest.Direction = adParamInput
'แอตทริบิวต์ค่าสอดคล้องกับพารามิเตอร์ที่ห้าใน wuf70.asp
prmTest.Value = 30
cmdTest.Parameters.Append prmTest
ตั้งค่า cmdTest.ActiveConnection = Cnn
'คุณต้องส่งคืนชุดระเบียน ดังนั้นให้ใช้ Set rsTest = cmdTest.Execute
ตั้งค่า rsTest = cmdTest.Execute
ในขณะที่ไม่ใช่ rsTest.EOF
การตอบกลับเขียน rsTest(0) & "<br>"
rsTest.MoveNext
เวนด์
ซีเอ็น.ปิด
ตั้งค่า rsTest = ไม่มีเลย : ตั้งค่า prmTest = ไม่มีเลย
ตั้งค่า cmdTest = ไม่มีเลย: ตั้งค่า Cnn = ไม่มีเลย
-
คุณสมบัติ CommandText สามารถระบุคำสั่ง SQL, กระบวนงานที่เก็บไว้ หรือชื่อตารางได้
ในตัวอย่างนี้ การสร้างอ็อบเจ็กต์พารามิเตอร์จะแตกต่างจาก wuf70.asp เล็กน้อย จริงๆ แล้ว ถ้าคุณดูให้ดี ความหมายจะคล้ายกัน มีแอตทริบิวต์ที่ไม่ได้ใช้สองตัวในตัวอย่างนี้: prmTest.Name, prmTest.Size บวกกับ Type, Direction และ Value ซึ่งสอดคล้องกับพารามิเตอร์ทั้งห้าตัวใน wuf70.asp
(2) เมื่อใช้พารามิเตอร์เอาต์พุตเพื่อรับบันทึกหรือคำนวณค่าจากตารางฐานข้อมูล คุณจำเป็นต้องใช้ขั้นตอนการจัดเก็บที่ส่งคืนพารามิเตอร์เอาต์พุต เพื่อประโยชน์ของตัวอย่าง ขั้นแรกให้สร้างกระบวนงานที่เก็บไว้ใหม่ OUTemploy ในไลบรารี pubs ของ SQL Server
สร้างขั้นตอนการจ้างงาน
-
@job_lvl เอาท์พุทจิ๋วๆ
@hire_date1 วันที่และเวลา
@hire_date2 วันที่และเวลา
-
เช่น
เลือก @job_lvl = MAX(job_lvl) จากพนักงาน
โดยที่ Hire_date >= @hire_date1 และ Hire_date <= @hire_date2
มีหลายวิธีในการสร้างขั้นตอนการจัดเก็บ:
1. ใช้ Enterprise Manager ของ Microsoft SQL Server หลังจากเปิดแล้ว ให้เปิดในไดเรกทอรีต้นไม้ทางด้านซ้าย: Console Root – Microsoft SQL Servers – SQL Server Group – ICBCZJP (Windows NT) – ฐานข้อมูล – pubs – กระบวนการจัดเก็บ – ขั้นตอนการจัดเก็บใหม่ เข้าสู่ขั้นตอนการจัดเก็บ ในที่สุด การตรวจจับไวยากรณ์ก็สามารถทำได้เช่นกัน
2. ใช้ Query Analyzer ของ Microsoft SQL Server ขั้นแรกให้เชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลและเลือกฐานข้อมูล Pubs ป้อนขั้นตอนการจัดเก็บด้านบนแล้วคลิกดำเนินการค้นหา (หรือกด F5)
3. ใช้ VB6.0 หลังจากเปิดเมนู "มุมมอง"/"หน้าต่างมุมมองข้อมูล" ให้คลิกขวาที่ "ลิงก์ข้อมูล"/"ลิงก์ข้อมูลใหม่";
4. ใช้สคริปต์ ASP เพื่อสร้างขั้นตอนการจัดเก็บ เช่น wuf75.asp:
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf75.asp
DimStrSQL
'หมายเหตุ: & Chr(10) & Chr(13) ไม่จำเป็นเลย เพราะเน้นความดูดีเป็นหลัก
StrSQL = "สร้างขั้นตอนการทำงาน ( @job_lvl Tinyint OUTPUT, " & Chr (10) & Chr (13) &_
"@hire_date1 datetime, @hire_date2 datetime) AS " & Chr(10) & Chr(13) &_
"เลือก @job_lvl = MAX(job_lvl) จากพนักงาน" &_
"โดยที่ Hire_date >= @hire_date1 และ Hire_date <= @hire_date2"
Cnn.ดำเนินการ StrSQL
ตอบกลับเขียน "สร้างขั้นตอนการจัดเก็บสำเร็จ"
Cnn.close: ตั้งค่า Cnn = ไม่มีเลย
-
หลังจากที่สร้างกระบวนงานที่เก็บไว้แล้ว นอกเหนือจากการใช้เมนูแล้ว คุณยังสามารถใช้คำสั่ง SQL "Drop Procedure OUTemploy" เพื่อลบออกได้
ตัวอย่าง wuf72.asp – ส่งพารามิเตอร์อินพุตที่ต้องการไปยังกระบวนงานที่เก็บไว้และรับผลลัพธ์เอาต์พุต
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf72.asp
หรี่ cmdTest, prmTest
ตั้งค่า cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.ActiveConnection = Cnn
cmdTest.CommandText = "OUTemploy" 'ชื่อขั้นตอนที่เก็บไว้
cmdTest.CommandType = adCmdStoredProc
'สร้างวัตถุพารามิเตอร์
ตั้งค่า prmTest = cmdTest.CreateParameter("job_lvl",adTinyInt,adParamOutput)
cmdTest.Parameters.Append prmTest
'adTinyInt - จำนวนเต็มลงนาม 1 ไบต์
'adDbDate - ค่าวันที่ (yyyymmdd)
ตั้งค่า prmTest = cmdTest.CreateParameter("hiredate1",adDBDate,adParamInput,,"1993-05-09")
cmdTest.Parameters.Append prmTest
ตั้งค่า prmTest = cmdTest.CreateParameter("hiredate2",adDBDate,adParamInput,,"1994-02-01")
cmdTest.Parameters.Append prmTest
cmdTest.Execute
“สามสำนวนต่อไปนี้มีความหมายเหมือนกัน
การตอบกลับเขียน cmdtest("job_lvl") & "<br>"
การตอบสนองเขียน cmdTest.Parameters("job_lvl") & "<br>"
Response.Write cmdTest.Parameters("job_lvl").ค่า
ซีเอ็น.ปิด
ตั้งค่า prmTest = ไม่มีเลย
ตั้งค่า cmdTest = ไม่มีเลย: ตั้งค่า Cnn = ไม่มีเลย
-
(3) ใช้พารามิเตอร์โค้ดส่งคืนเพื่อใช้คำสั่ง Return เพื่อส่งคืนโค้ดส่งคืนอื่นจากกระบวนงานที่เก็บไว้ ตัวอย่างเช่น ขั้นตอนการจัดเก็บต่อไปนี้จะได้รับชุดเร็กคอร์ดก่อน แล้วจึงส่งคืน 1 ถ้ามีพนักงานชื่อ Margaret มิฉะนั้น ส่งกลับ 0
สร้างขั้นตอนการส่งคืนพนักงาน
เช่น
เลือก emp_id fname จากพนักงาน
ถ้ามี (เลือก fname จากพนักงาน โดยที่ fname='Margaret')
กลับ(1)
อื่น
กลับ(0)
ตัวอย่าง wuf73.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf73.asp
หรี่ cmdTest, prmTest, rsTest
ตั้งค่า cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.ActiveConnection = Cnn
cmdTest.CommandText = "Returnemploy" 'ชื่อขั้นตอนที่เก็บไว้
cmdTest.CommandType = adCmdStoredProc
ตั้งค่า prmTest = cmdTest.CreateParameter("ReturnValue",adInteger,adParamReturnValue)
cmdTest.Parameters.Append prmTest
ตั้งค่า rsTest = cmdTest.Execute()
ในขณะที่ไม่ใช่ rsTest.EOF
การตอบกลับเขียน rsTest(0) & " ][ " & rsTest(1) & "<br>"
rsTest.MoveNext
เวนด์
rsTest.Close: ตั้งค่า rsTest = ไม่มีเลย
'ก่อนที่จะส่งคืน cmdtest("ReturnValue") จะต้องปิด rsTest ก่อน ไม่เช่นนั้นผลลัพธ์จะผิดพลาด
ถ้า cmdtest("ReturnValue") = 1 แล้ว
ตอบกลับ เขียนว่า "มีพนักงานคนนี้"
อื่น
ตอบกลับเขียนว่า "ไม่มีพนักงานดังกล่าว"
สิ้นสุดถ้า
ซีเอ็น.ปิด
ตั้งค่า prmTest = ไม่มีเลย
ตั้งค่า cmdTest = ไม่มีเลย: ตั้งค่า Cnn = ไม่มีเลย
-
3. วิธีการประมวลผลข้อมูลขนาดใหญ่ "ข้อมูลขนาดใหญ่" ในที่นี้หมายถึงช่องข้อความ (ข้อความขนาดใหญ่) และรูปภาพ (รูปภาพ) เป็นหลัก ซึ่งไม่สามารถรับข้อมูลได้อย่างถูกต้องโดยใช้วิธีการที่อธิบายไว้ข้างต้น ขั้นแรกคุณต้องใช้ Size = rsTest(0).ActualSize เพื่อรับความยาวจริงของค่าฟิลด์ จากนั้นใช้ rsTest(0).GetChunk(Size) เพื่อรับข้อมูล ในการใช้งานจริง เนื่องจากฟิลด์เหล่านี้มีขนาดค่อนข้างใหญ่ เพื่อประหยัดและใช้ทรัพยากรเซิร์ฟเวอร์อย่างมีเหตุผล โดยทั่วไปการอ่านแบบแบ่งส่วนจะถูกนำมาใช้ ตัวอย่าง wuf74.asp:
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf74.asp
หรี่ StrSQL, rsTest
'pr_info เป็นช่องข้อความ
StrSQL = "เลือก pr_info,pub_id จาก pub_info"
ตั้งค่า rsTest = Cnn.Execute(StrSQL)
Dim BasicSize, BeginSize, LText
ทำในขณะที่ไม่ใช่ rsTest.EOF
การตอบกลับเขียน rsTest(1) & "<br>"
'อ่านครั้งละ 1,024 ไบต์'
ขนาดพื้นฐาน = 1024
ขนาดเริ่มต้น = 0
ในขณะที่ BeginSize < rsTest(0).ActualSize
LText = rsTest(0).GetChunk(ขนาดพื้นฐาน)
BeginSize = ขนาดเริ่มต้น + ขนาดพื้นฐาน
'ส่งออกไปยังกลุ่มลูกค้าตามกลุ่ม
ตอบกลับเขียน LText
เวนด์
ตอบกลับเขียน "<br><br>"
rsTest.MoveNext
วนซ้ำ
ซีเอ็น.ปิด
ตั้งค่า rsTest = ไม่มีเลย: ตั้งค่า Cnn = ไม่มีเลย
-
ในตัวอย่างนี้ จะมีการอ่านแต่ละครั้งสูงสุด 1,024 ไบต์ และข้อมูลจะถูกอ่านหลายครั้ง ในทางตรงกันข้าม ถ้าคุณเขียนข้อมูลขนาดใหญ่ลงในฐานข้อมูล วิธีการจะคล้ายกับข้างต้น แต่แทนที่จะใช้วิธี GetChunk คุณจะใช้วิธี AppendChunk:
rsTest(0).ผนวกChunkLtext
หมายเหตุ: สุดท้ายนี้ ผมจะแนะนำเคล็ดลับเล็กๆ น้อยๆ เกี่ยวกับฐานข้อมูล SQL Server หากคุณประสบปัญหานี้ ข้อมูลภาษาจีนในฐานข้อมูลจะแสดงเป็นอักขระที่อ่านไม่ออก โปรดอย่าตกใจ คุณเพียงแค่ต้องไปที่ไซต์ของฉันเพื่อดาวน์โหลด sqlsrv32.dll และเขียนทับไฟล์ด้วยชื่อเดียวกันภายใต้ "C:WindowsSystem" สาเหตุของปัญหาคือไดรเวอร์ SQL Server ซึ่งโดยทั่วไปเกิดขึ้นใน Windows 98 Second Edition (หมายเลขเวอร์ชันของไดรเวอร์ SQL Server คือ 3.70.06.23) หรือ Windows 2000 หรือเมื่อมีการติดตั้ง MDAC2.5 (หมายเลขเวอร์ชันคือ 3.70.08.20) .