ที่อยู่เดิม: http://www.51la.org/webjx/htmldata/2005-12-24/1135405777.html
บทคัดย่อ การเรียกขั้นตอนที่เก็บไว้มักใช้ในระบบ b/s วิธีการเรียกแบบเดิมไม่เพียงแต่ช้าเท่านั้น แต่โค้ดจะยังคงขยายต่อไปเมื่อจำนวนขั้นตอนการจัดเก็บเพิ่มขึ้น ทำให้ยากต่อการดูแลรักษา วิธีการใหม่นี้ช่วยแก้ปัญหาเหล่านี้ได้ในระดับหนึ่ง
คำสำคัญ asp.net; Stored Procedure ในกระบวนการใช้ .net การเข้าถึงฐานข้อมูลเป็นส่วนสำคัญมากโดยเฉพาะในกระบวนการสร้างระบบ b/s การดำเนินการฐานข้อมูลเกือบจะกลายเป็นการดำเนินการที่สำคัญ การเรียก Stored Procedure เพื่อนำการดำเนินการของฐานข้อมูลไปใช้นั้นเป็นวิธีการที่โปรแกรมเมอร์หลายๆ คนใช้ และโปรแกรมเมอร์ส่วนใหญ่ใช้ Stored Procedure หากทำได้ และไม่ค่อยได้ใช้คำสั่ง SQL โดยตรง ดังนั้น Stored Procedure จึงมีประโยชน์และสำคัญมาก
ข้อมูลเบื้องต้นเกี่ยวกับขั้นตอนการจัดเก็บ
พูดง่ายๆ ก็คือ กระบวนการจัดเก็บเป็นขั้นตอนแบบห่อหุ้มที่ประกอบด้วยคำสั่ง SQL และคำสั่งควบคุมบางส่วน ซึ่งอยู่ในฐานข้อมูลและสามารถเรียกได้โดยแอปพลิเคชันไคลเอนต์หรือจากขั้นตอนหรือทริกเกอร์อื่น พารามิเตอร์สามารถส่งและส่งคืนได้ คล้ายกับกระบวนงานฟังก์ชันในแอปพลิเคชัน กระบวนการจัดเก็บสามารถเรียกตามชื่อได้ และยังมีพารามิเตอร์อินพุตและเอาต์พุตอีกด้วย
ตามประเภทค่าตอบแทนที่แตกต่างกัน เราสามารถแบ่งขั้นตอนการจัดเก็บออกเป็นสามประเภท: ขั้นตอนการจัดเก็บที่ส่งคืนชุดระเบียน ขั้นตอนการจัดเก็บที่ส่งคืนค่าตัวเลข (เรียกอีกอย่างว่าขั้นตอนการจัดเก็บสเกลาร์) และขั้นตอนการจัดเก็บตามพฤติกรรม ตามความหมายของชื่อ ผลลัพธ์การดำเนินการของกระบวนงานที่เก็บไว้ที่ส่งกลับชุดระเบียนคือชุดระเบียน ตัวอย่างทั่วไปคือการดึงข้อมูลระเบียนที่ตรงตามเงื่อนไขหนึ่งข้อหรือหลายข้อจากฐานข้อมูล หลังจากดำเนินการ เช่น ในฐานข้อมูล ดำเนินการฟังก์ชันหรือคำสั่งด้วยค่าที่ส่งคืน ในที่สุด กระบวนการจัดเก็บเชิงพฤติกรรมจะใช้เฉพาะเพื่อนำฟังก์ชันบางอย่างของฐานข้อมูลไปใช้โดยไม่มีค่าส่งคืน เช่น การอัปเดตและการลบการดำเนินการในฐานข้อมูล .
ประโยชน์ของการใช้ Stored Procedure
เมื่อเปรียบเทียบกับการใช้คำสั่ง SQL โดยตรง การเรียก Stored Procedure โดยตรงในแอปพลิเคชันมีประโยชน์ดังต่อไปนี้:
(1) ลดการรับส่งข้อมูลเครือข่าย การรับส่งข้อมูลเครือข่ายอาจไม่มีความแตกต่างมากนักระหว่างการเรียก Stored Procedure ที่มีแถวจำนวนน้อยกับการเรียกคำสั่ง SQL โดยตรง อย่างไรก็ตาม หาก Stored Procedure มีคำสั่ง SQL หลายร้อยคำสั่ง ประสิทธิภาพจะดีกว่าการเรียกคำสั่ง SQL ทีละคำสั่งอย่างแน่นอน หนึ่ง. สูงกว่ามาก.
(2) ความเร็วในการดำเนินการเร็วขึ้น มีเหตุผลสองประการ: ประการแรก เมื่อมีการสร้างขั้นตอนการจัดเก็บ ฐานข้อมูลได้แยกวิเคราะห์และปรับให้เหมาะสมแล้วครั้งหนึ่ง ประการที่สอง เมื่อดำเนินการขั้นตอนที่เก็บไว้ สำเนาของขั้นตอนที่เก็บไว้จะถูกเก็บไว้ในหน่วยความจำ เพื่อให้ครั้งต่อไปที่ขั้นตอนที่เก็บไว้เดียวกันถูกดำเนินการ จะสามารถเรียกได้โดยตรงจากหน่วยความจำ
(3) ความสามารถในการปรับตัวที่แข็งแกร่งยิ่งขึ้น: เนื่องจาก Stored Procedure เข้าถึงฐานข้อมูลผ่าน Stored Procedures นักพัฒนาฐานข้อมูลจึงสามารถเปลี่ยนแปลงฐานข้อมูลได้โดยไม่ต้องเปลี่ยนอินเทอร์เฟซของ Stored Procedure และการเปลี่ยนแปลงเหล่านี้จะไม่ส่งผลกระทบต่อแอปพลิเคชันฐานข้อมูล
(4) งานแบบกระจาย: งานเขียนโค้ดของแอปพลิเคชันและฐานข้อมูลสามารถดำเนินการได้อย่างอิสระโดยไม่ต้องระงับซึ่งกันและกัน
จากการวิเคราะห์ข้างต้น เราจะเห็นได้ว่ามีความจำเป็นต้องใช้ Stored Procedure ในแอปพลิเคชันต่างๆ
วิธีการเรียก Stored Procedure ที่แตกต่างกันสองวิธี
เพื่อเน้นถึงข้อดีของวิธีการใหม่นี้ เรามาแนะนำวิธีการเรียก Stored Procedure ใน .net "อย่างเป็นทางการ" กันก่อน นอกจากนี้ โปรแกรมตัวอย่างทั้งหมดในบทความนี้ทำงานบนฐานข้อมูล sqlserver สถานการณ์อื่นๆ จะคล้ายกันและจะไม่มีการอธิบายทีละรายการในอนาคต ตัวอย่างทั้งหมดในบทความนี้เป็นภาษา C#
ในการเข้าถึงฐานข้อมูลในแอปพลิเคชัน ขั้นตอนทั่วไปคือ: ขั้นแรกให้ประกาศการเชื่อมต่อฐานข้อมูล sqlconnection จากนั้นจึงประกาศคำสั่งฐานข้อมูล sqlcommand เพื่อรันคำสั่ง sql และกระบวนงานที่เก็บไว้ ด้วยออบเจ็กต์ทั้งสองนี้ คุณสามารถใช้วิธีการดำเนินการที่แตกต่างกันเพื่อให้บรรลุเป้าหมายได้ตามความต้องการของคุณเอง สิ่งที่ต้องเพิ่มคืออย่าลืมเพิ่มข้อความอ้างอิงต่อไปนี้ลงในเพจ: การใช้ system.data.sqlclient
ในส่วนของการดำเนินการขั้นตอนการจัดเก็บนั้น หากดำเนินการขั้นตอนการจัดเก็บประเภทแรก ต้องใช้อะแดปเตอร์ข้อมูลเพื่อกรอกผลลัพธ์ลงในชุดข้อมูล จากนั้นจึงสามารถใช้การควบคุมตารางข้อมูลเพื่อนำเสนอผลลัพธ์บนเพจได้ หากดำเนินการแล้ว หากเป็นขั้นตอนที่เก็บไว้ที่สองและสาม ขั้นตอนนี้ไม่จำเป็น คุณจะต้องตรวจสอบว่าการดำเนินการเสร็จสมบูรณ์ตามการส่งคืนที่ระบุหรือไม่
(1) รหัสเพื่อดำเนินการขั้นตอนการจัดเก็บโดยไม่มีพารามิเตอร์มีดังนี้:
sqlconnection conn=การเชื่อมต่อ sql ใหม่ ("สตริงการเชื่อมต่อ");
sqldataadapter da = sqldataadapter ใหม่ ();
da.selectcommand = คำสั่ง sql ใหม่();
da.selectcommand.connection = เชื่อมต่อ;
da.selectcommand.commandtext = "nameofprocedure";
da.selectcommand.commandtype = commandtype.storedprocedure;
จากนั้นเลือกวิธีที่เหมาะสมในการดำเนินการตามกระบวนการที่นี่เพื่อวัตถุประสงค์ที่แตกต่างกัน
(2) รหัสเพื่อดำเนินการขั้นตอนการจัดเก็บด้วยพารามิเตอร์มีดังนี้ (เราสามารถประกาศฟังก์ชันที่เรียกขั้นตอนการจัดเก็บเป็น exeprocedure (วันที่ป้อนข้อมูลสตริง)):
sqlconnection conn=การเชื่อมต่อ sql ใหม่ ("สตริงการเชื่อมต่อ");
sqldataadapter da = sqldataadapter ใหม่ ();
da.selectcommand = คำสั่ง sql ใหม่();
da.selectcommand.connection = เชื่อมต่อ;
da.selectcommand.commandtext = "nameofprocedure";
da.selectcommand.commandtype = commandtype.storedprocedure;
(โค้ดด้านบนเหมือนกัน ต่อไปนี้คือโค้ดที่จะเพิ่ม)
param = new sqlparameter("@parametername", sqldbtype.datetime);
param.direction = พารามิเตอร์ทิศทางอินพุต;
param.value = Convert.todatetime (วันที่ป้อนข้อมูล);
da.selectcommand.parameters.add(พารามิเตอร์);
นี่เป็นการเพิ่มพารามิเตอร์อินพุต หากคุณต้องการเพิ่มพารามิเตอร์เอาต์พุต:
param = new sqlparameter("@parametername", sqldbtype.datetime);
param.direction = พารามิเตอร์ทิศทางเอาท์พุท;
param.value = Convert.todatetime (วันที่ป้อนข้อมูล);
da.selectcommand.parameters.add(พารามิเตอร์);
หากต้องการรับค่าส่งคืนของขั้นตอนการจัดเก็บพารามิเตอร์:
param = new sqlparameter("@parametername", sqldbtype.datetime);
param.direction = parameterdirection.returnvalue;
param.value = Convert.todatetime (วันที่ป้อนข้อมูล);
da.selectcommand.parameters.add(พารามิเตอร์);
จากโค้ดข้างต้น เราจะเห็นว่าเมื่อมี Stored Procedure จำนวนมากหรือมีพารามิเตอร์มากมายใน Stored Procedure วิธีการนี้จะส่งผลอย่างมากต่อความเร็วของการพัฒนา ในทางกลับกัน หาก Project มีขนาดค่อนข้างใหญ่ ฟังก์ชั่นเหล่านี้ก็มีไว้สำหรับ ตรรกะฐานข้อมูลก็จะเป็นภาระใหญ่ในการบำรุงรักษาในอนาคต มีวิธีปรับปรุงในการแก้ปัญหานี้หรือไม่? ฉันคิดว่าเมื่อดำเนินการขั้นตอนการจัดเก็บโดยไม่มีพารามิเตอร์ เราเพียงต้องส่งชื่อของขั้นตอนการจัดเก็บเพื่อเรียกขั้นตอนการจัดเก็บที่เกี่ยวข้อง และในฐานข้อมูล sqlserver เราสามารถพิมพ์ "ชื่อขั้นตอนการจัดเก็บ (รายการพารามิเตอร์) ได้โดยตรง " ในตัววิเคราะห์แบบสอบถาม Stored Procedure สามารถดำเนินการได้ด้วยสตริงดังกล่าว ดังนั้น แนวคิดนี้สามารถนำไปใช้กับแอปพลิเคชันได้หรือไม่
ดังนั้นให้พิมพ์รหัสที่เกี่ยวข้องลงในคอมไพเลอร์ รหัสเหล่านี้ได้รับการแก้ไขตามรหัสที่เรียกขั้นตอนการจัดเก็บโดยไม่มีพารามิเตอร์ รหัสเฉพาะมีดังนี้:
sqlconnection conn=การเชื่อมต่อ sql ใหม่ ("สตริงการเชื่อมต่อ");
sqldataadapter da = sqldataadapter ใหม่ ();
da.selectcommand = คำสั่ง sql ใหม่();
da.selectcommand.connection = เชื่อมต่อ;
da.selectcommand.commandtext = "nameofprocedure('para1','para2',para3)";
da.selectcommand.commandtype = commandtype.storedprocedure;
เพื่อให้โค้ดเป็นตัวแทนมากขึ้น พารามิเตอร์ตัวแรกและตัวที่สองของโพรซีเดอร์ที่เก็บไว้ที่จะเรียกใช้จะเป็นประเภทสตริง และพารามิเตอร์ตัวที่สามเป็นประเภทจำนวนเต็ม หลังจากการประหารชีวิต ฉันพบว่าสามารถบรรลุผลที่คาดหวังได้!
การเปรียบเทียบวิธีการเรียกทั้งสองวิธี โดยการเปรียบเทียบเราจะเห็นว่าวิธีที่ 2 มีข้อได้เปรียบที่ชัดเจน นั่นคือ สามารถเพิ่มความเร็วในการพัฒนา ประหยัดเวลาในการพัฒนา และโค้ดนั้นง่ายต่อการบำรุงรักษา และยังช่วยลดขนาดระบบอีกด้วย ในระดับหนึ่ง อย่างไรก็ตาม เนื่องจากการประมวลผลพารามิเตอร์ของ Stored Procedure นั้นค่อนข้างทั่วไป หากคุณต้องการรับพารามิเตอร์เอาต์พุตหรือรับค่าที่ส่งคืนของ Stored Procedure วิธีนี้ไม่สามารถตอบสนองความต้องการได้ อย่างไรก็ตาม วิธีการนี้สามารถช่วยให้นักพัฒนาสามารถบันทึกโค้ดส่วนใหญ่ได้ หากคุณไม่ต้องการรับพารามิเตอร์เอาต์พุตและคืนค่า คุณสามารถทำได้ "เพียงครั้งเดียว" ดังนั้นในการพัฒนาโปรแกรมจริง วิธีการนี้ยังคงมีคุณค่าในทางปฏิบัติอยู่บ้าง