\

Facebook


วันพุธที่ 11 กันยายน พ.ศ. 2556

อยากให้ชีวิตง่ายขึ้นต้องใช้ Store Procedure [WinForm c# + SQL Server]

คราวที่แล้วผม Blog เกี่ยวกับการติดต่อฐานข้อมูลด้วย SQLConnection ไปแล้ว คราวนี้เพิ่มความเก๋ไปอีกนิดหน่อยด้วยการเรียกใช้คำสั่ง SQL ด้วย Store Procedure ที่สร้างไปในดาต้าเบส โดยตัวอย่างนี้จะสร้างโปรแกรมค้นหาข้อมูลผู้ใช้งาน(ยูสเซอร์)อย่างง่ายๆ >> คำถามคือใช้แล้วชีวิตดียังไง?


คำตอบคือ แทนที่เราจะเขียนโค๊ด 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 โค๊ดเดิมทุกประการ







โค๊ดสมบูรณ์ด้านล่างนี้ครับ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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;
        }
    }
}<div class="preloader"><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
1
<div class="preloader"><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
อยากเปลี่ยน query เป็นแบบอื่นก็แก้ไขในฟิลล์ BEGIN ได้เลยครับ หรืออยากเพิ่มคำสั่งอื่นๆก็สร้างสโตรมาใหม่ แล้วเพิ่มตัวแปรเข้าไปก็ได้ จัดเป็นหมวดหมู่คำสั่ง select alter delete ให้เป็นระเบียบ

2 ความคิดเห็น:

ไม่ระบุชื่อ กล่าวว่า...

บทความดีครับ แต่เห็นในบทความหลายครั้งใช้คำว่า คัวแปล ที่ถูกต้องเป็น ตัวแปร ครับ ถ้าแก้ไขได้จะดีมากคนรุ่นหลังๆ หรือเด็กๆ ที่สนใจเข้ามาอ่านจะได้ใช้คำที่ถูกต้องตามไปด้วย ขอบคุณครับ

Chin Chayut กล่าวว่า...

แก้ไขแล้ว ขอบคุณมากครับ

May be like this posts

  • 4 วิธี รับค่าจาก Form ใน ASP.NET MVC แบบมือโปร
    02/08/2017 - 0 Comments
    Form Post คือ โครตพื้นฐานการส่งข้อมูลบนเว็บไซด์แล้ว โดยฟอร์มจะทำหน้าที่สร้าง FormData ขึ้นมาเพื่อ POST…
  • ประสบการณ์การใช้ Window 8 Blue Preview ฟรีจาก Microsoft Official
    30/03/2014 - 0 Comments
    เนื่องจาก Hard Disk ที่มาพร้อมกับโน๊ตบุ๊คตั้งแต่แรกซื้อ ถึงขีดจำกัดของมันแล้ว จู่ๆก็เล่นอ่านไฟล์ล้มเหลว…
  • [Xdebug] PHP Debug on Eclipse เซ็ตตัวดีบักเกอร์
    03/04/2014 - 0 Comments
    พูดถึงวิธีดีบักไฟล์ PHP ถ้าเป็นครั้งแรกที่เริ่มจับใหม่ๆมั่นใจเลยว่าหลายๆคนต้องเคย echo ค่าออกมาทีละบบรทัด…
  • เล่น Pokemon Go บนคอม วิ่งในเกมส์ 10 km แบบไม่ต้องลุกจากที่นั่ง !!
    10/08/2016 - 0 Comments
    ***เพิ่มเติม : ปัจจุบันผมเลิกเล่นผ่าน emulator เเล้วนะครับ บทความนี้กลายเป็นอดีตไปละ…
  • XAMPP Start Apache ไม่ได้เพราะ PID 4 ไม่ว่าง แก้ยังไงมาดู
    30/04/2014 - 0 Comments
    ปัญหาเยอะจริงเวลาลงโปรแกรมใหม่ๆเข้ามา XAMPP เป็นอันต้อง port 80 ไม่ว่างบ้างกับสไกด์นี้แหละตัวดีเลย หรือ PID…
  • เทคนิคง่ายๆในการแสดงข้อมูลประเภทการเงิน การบัญชี ใน SQL SERVER
    01/10/2015 - 0 Comments
    ในเรื่องเงินๆทองๆ หน่วยที่น้อยที่สุดคือ 1 สตางค์ (ทศนิยมสองตำแหน่งจะได้ 0.01) และ SQL SERVER…
  • สร้าง WebApp ด้วย VueJS บน Digital Ocean ตอนที่ 3 : ติดตั้ง MongoDB บน Debian 8
    19/05/2018 - 0 Comments
    อย่างที่เกริ่นไปก่อนว่าผมใช้ database เป็น NoSQL ซึ่งผมใช้ MondgoDB มาเป็นตัวจัดการฐานข้อมูล…