คำตอบคือ แทนที่เราจะเขียนโค๊ด sql ซ้ำๆคำสั่งเดิมๆที่หน้า form ของเรา น่าจะมีวิธีที่สามารถเรียกใช้งาน query ทันทีได้เลยโดยไม่ต้องมาเริ่มต้นเขียนคิวรี่ "SELECT * FROM..." ใหม่ทุกครั้งไป นั้นแหละครับเรียกว่า store procedure ซึ่งคำสั้งเหล่านี้เราจะเขียนเตรียมไว้ก่อนที่ดาต้าเบสของเรา แล้วตั้งชื่อมันไว้ พอจะใช้งานแต่ละทีก็เลือกตามชื่อแล้วส่งตัวแปรที่จำเป็นไปให้ จากนั้นนั่งรอเอ็กซิคิวผลลัพธ์ได้เลยครับ
วิธีการสร้าง store procedure บน SQL Server 2008 R2
เข้าไปที่เบสปัจจุบัน แล้วเลือกโฟลเดอร์ Programability > Store procedures จากนั้นคลิกขวาเลือเมนู New Store Procedure.. เพื่อเพิ่มสโตร์โพซิเยอร์ตัวใหม่เข้าไป แล้วเซ็ตค่าตามรูปเลยครับ (อย่าลืมเปลี่ยนค่าที่อยู่ในกรอบสีแดงให้ตรงกับที่อยู่ในเบสของคุณด้วย)
เตรียมสิ่งต่อไปนี้ก่อน
สร้าง Databaseไว้ ชื่อว่า Sample โดยกำหนดให้มีตาราง User แล้ว add ข้อมูลไว้สัก 2-3 บรรทัดนะครับ
สร้าง Windows Form Application ขึ้นมา ตั้งชื่อว่า SearchApplication แล้วจัดหน้าจอให้ได้แบบด้านล่างนี้เลยครับ โดยเราจะรับข้อมูลชื่อ User จาก textEdit ด้านบนสุดแล้วเมื่อกดปุ่ม search โปรแกรมจะวิ่งไปค้นหาข้อมูลผ่าน store procedure ที่เราสร้างเอาไว้ แล้วแสดงค่าผลลัพธืตรงกรอบ result ที่เป็น label edit
สร้าง store procedures ขึ้นมาใหม่
ในโค๊ด อธิบายนิดหน่อย
การเพิ่ม parameter นั้นมีวธีการคือ cmd.Parameters.Add(new SqlParameter("@strName", text));
โดย @strName เป็นชื่อ store ที่อยู่ในดาต้าเบส ซึ่งเราต้องส่งไปให้ถูกตัวด้วย
text เป็นค่าของตัวแปรที่เราจะส่งไป >> อย่าลืมว่าใน c# และ SQL Server ก็มี FileType เช่นกัน ถ้า Map ไม่ตรงก็จะ error เช่น map stringในc# to intในSQLServer แบบนี้ไม่ได้นะครับ เพราะจะไม่ขึ้น error ตอน complie แต่พังแน่ๆตอน run
จากนั้นเพิ่ม Command Type ให้ SQL รู้จักด้วยว่า "Connection ต่อไปนี้คือ store" ด้วยการเซ็ต cmd.CommandType = CommandType.StoredProcedure; เพิ่มเข้าไป >> นอกจากนี้ก็เหมือนกัน SQLConnection โค๊ดเดิมทุกประการ
โค๊ดสมบูรณ์ด้านล่างนี้ครับ
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace ConsoleSqlConnect { public partial class Search : Form { public Search() { InitializeComponent(); labelControl1.Text = ""; } string text = string.Empty; SqlConnection sqlConn = null; private void Search_Load(object sender, EventArgs e) { string ConnectionString = GetConnectionString(); sqlConn = new SqlConnection(ConnectionString); } private void simpleButton1_Click(object sender, EventArgs e) { labelControl1.Text = ""; text = textEdit1.EditValue.ToString(); try { sqlConn.Open(); using (SqlCommand cmd = new SqlCommand("SearchUserName", sqlConn)) { #region sql cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@strName", text)); SqlDataReader result = cmd.ExecuteReader(); if(result != null) { while (result.Read()) { labelControl1.Text = " Item Found >> " + System.Environment.NewLine + "\tUserName : " + result[1] + System.Environment.NewLine + "\tPassword : " + result[2]; } } else{ } #endregion } sqlConn.Close(); } catch (SqlException ex) { MessageBox.Show("Error : " + ex); } } private static string GetConnectionString() { string strConnect = ""; string localhost = "(local)"; string userName = "sa"; string Password = "12345"; string Catalog = "Sample"; strConnect = "Data Source=" + localhost + ";Initial Catalog=" + Catalog + ";User ID=" + userName + ";Password=" + Password + ""; return strConnect; } } }อยากเปลี่ยน query เป็นแบบอื่นก็แก้ไขในฟิลล์ BEGIN ได้เลยครับ หรืออยากเพิ่มคำสั่งอื่นๆก็สร้างสโตรมาใหม่ แล้วเพิ่มตัวแปรเข้าไปก็ได้ จัดเป็นหมวดหมู่คำสั่ง select alter delete ให้เป็นระเบียบ
2 ความคิดเห็น:
บทความดีครับ แต่เห็นในบทความหลายครั้งใช้คำว่า คัวแปล ที่ถูกต้องเป็น ตัวแปร ครับ ถ้าแก้ไขได้จะดีมากคนรุ่นหลังๆ หรือเด็กๆ ที่สนใจเข้ามาอ่านจะได้ใช้คำที่ถูกต้องตามไปด้วย ขอบคุณครับ
แก้ไขแล้ว ขอบคุณมากครับ
แสดงความคิดเห็น