| 
  ตอนที่ 20 : Visual C# (C# .Net) เรียกใช้ EXEC/CALL - SQL Server Stored Procedure ในหัวข้อนี้เราจะมาเรียนรู้วิธีการใช้ Visual C# (C# .Net) บน  .NET Application เรียกใช้งาน Stored Procedure ของ SQL Server Database ซึ่งในการเรียกใช้งาน Stored Procedure สามารถใช้ได้กับในหลาย ๆ  Connector เช่น System.Data.SqlClient ส่วนคำสั่งในการการเรียกนั้น เราสามารถใช้คำสั่ง EXEC procedure_name() ได้ทันที ถ้าหากมีค่า Parameters ก็จะต้องทำการ Pass ค่าไปกับ Query ด้วย  หรือจะใช้แบบ Parameter Query แบบ CommandType.StoredProcedure ก็ได้ โดยทั้ง 2 วิธีสามารถใช้ได้เหมือนกัน และหลังจากที่ EXEC แล้วก็สามารถที่จะอ่าน Result ที่ Stored Procedure นั้นได้ส่งกลับมาให้ 
    |  
        ตอนที่ 20 : Visual C# (C# .Net) เรียกใช้ EXEC/CALL - SQL Server Stored Procedure       |  
 Call SQL Server Stored Procedure
 
 
EXEC procedure_name agr1,agr2,...
 โครงสร้างของตาราง CUSTOMER
 
 Table : CUSTOMER
 
 
  
 
 Example 1 : การใช้ .NET เรียก Stored Procedure แบบ Query ข้อมูลออกมา
 
 Stored Procedure Name : getCustomer()
 
 
CREATE PROCEDURE [dbo].[getCustomer]
	@pCountryCode	VARCHAR(2)
AS
BEGIN
	-- set customer
	SELECT * FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode
END
 Code (C#)
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace MyApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection objConn = new SqlConnection();
            SqlCommand objCmd = new SqlCommand();
            SqlDataAdapter dtAdapter = new SqlDataAdapter();
            DataSet ds = new DataSet();
            DataTable dt;
            String strConnString, strSQL;
            strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase; " +
            " Max Pool Size=400;Connect Timeout=600;";
            strSQL = "EXEC getCustomer 'US'";
            objConn.ConnectionString = strConnString;
            objConn.Open();
            objCmd.Connection = objConn;
            objCmd.CommandText = strSQL;
            objCmd.CommandType = CommandType.Text;
            dtAdapter.SelectCommand = objCmd;
            dtAdapter.Fill(ds);
            dt = ds.Tables[0];
            for (int i = 0; i <= dt.Rows.Count - 1; i++)
            {
                Console.Write(dt.Rows[i]["CUSTOMER_ID"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["NAME"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["EMAIL"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["COUNTRY_CODE"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["BUDGET"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["USED"]);
                Console.Write("");
            }
            dtAdapter = null;
            objConn.Close();
            objConn = null;
        }
    }
}
Result
 
 
 
 
 
 หรือจะใช้แบบ Parameter Query หรือ CommandType.StoredProcedure ก็ได้เช่นเดียวกัน
 
 Code (C#)
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace MyApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection objConn = new SqlConnection();
            SqlCommand objCmd = new SqlCommand();
            SqlDataAdapter dtAdapter = new SqlDataAdapter();
            DataSet ds = new DataSet();
            DataTable dt;
            String strConnString, strStored;
            strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase; " +
            " Max Pool Size=400;Connect Timeout=600;";
            strStored = "getCustomer";
            objCmd.Parameters.Add(new SqlParameter("@pCountryCode", "US"));
            objConn.ConnectionString = strConnString;
            objConn.Open();
            objCmd.Connection = objConn;
            objCmd.CommandText = strStored;
            objCmd.CommandType = CommandType.StoredProcedure;
            dtAdapter.SelectCommand = objCmd;
            dtAdapter.Fill(ds);
            dt = ds.Tables[0];
            for (int i = 0; i <= dt.Rows.Count - 1; i++)
            {
                Console.Write(dt.Rows[i]["CUSTOMER_ID"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["NAME"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["EMAIL"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["COUNTRY_CODE"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["BUDGET"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["USED"]);
                Console.Write("");
            }
            dtAdapter = null;
            objConn.Close();
            objConn = null;
        }
    }
}
 
 
 Example 2 : การใช้ .NET เรียก Stored Procedure แบบ Query  เพื่อ Insert ข้อมูล
 
 Stored Procedure Name : insertCustomer()
 
 
CREATE PROCEDURE [dbo].[insertCustomer]
	@pCustomerID	VARCHAR(4),
	@pName			VARCHAR(50),
	@pEmail			VARCHAR(50),
	@pCountryCode	VARCHAR(2),
	@pBudget		DECIMAL(18,2),
	@pUsed			DECIMAL(18,2)
AS
BEGIN
	-- insert customer
	INSERT INTO CUSTOMER VALUES (@pCustomerID,@pName,@pEmail,@pCountryCode,@pBudget,@pUsed);
END
 Code (C#)
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection objConn = new SqlConnection();
            SqlCommand objCmd = new SqlCommand();
            string strConnString = string.Empty;
            string strSQL = string.Empty;
            strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase; " +
            " Max Pool Size=400;Connect Timeout=600;";
            string sCustomerID = "C005";
            string sName = "Fun Wipa";
            string sEmail = "[email protected]";
            string sCountryCode = "TH";
            decimal dBudget = 1000000;
            decimal dUsed = 0;
            strSQL = "EXEC insertCustomer '" + sCustomerID + "','" + sName + "' " 
                + ",'" + sEmail + "','" + sCountryCode + "','" + dBudget + "','" + dUsed + "' ";
            objConn.ConnectionString = strConnString;
            objConn.Open();
            objCmd.Connection = objConn;
            objCmd.CommandText = strSQL;
            objCmd.CommandType = CommandType.Text;
            objCmd.ExecuteNonQuery();
            objConn.Close();
            objConn = null;
        }
    }
}
หรือจะใช้แบบ Parameter Query หรือ CommandType.StoredProcedure ก็ได้เช่นเดียวกัน
 
 Code (C#)
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace MyApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection objConn = new SqlConnection();
            SqlCommand objCmd = new SqlCommand();
            string strConnString = string.Empty;
            string strStored = string.Empty;
            strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase; " +
            " Max Pool Size=400;Connect Timeout=600;";
            string sCustomerID = "C005";
            string sName = "Fun Wipa";
            string sEmail = "[email protected]";
            string sCountryCode = "TH";
            decimal dBudget = 1000000;
            decimal dUsed = 0;
            strStored = "insertCustomer";
            objCmd.Parameters.Add(new SqlParameter("@pCustomerID", sCustomerID));
            objCmd.Parameters.Add(new SqlParameter("@pName", sName));
            objCmd.Parameters.Add(new SqlParameter("@pEmail", sEmail));
            objCmd.Parameters.Add(new SqlParameter("@pCountryCode", sCountryCode));
            objCmd.Parameters.Add(new SqlParameter("@pBudget", dBudget));
            objCmd.Parameters.Add(new SqlParameter("@pUsed", dUsed));
            objConn.ConnectionString = strConnString;
            objConn.Open();
            objCmd.Connection = objConn;
            objCmd.CommandText = strStored;
            objCmd.CommandType = CommandType.StoredProcedure;
            objCmd.ExecuteNonQuery();
            objConn.Close();
            objConn = null;
        }
    }
}
ส่วนวิธีการ UPDATE และ DELETE ก็ใช้หลักการเดียวกับการ INSERT ข้อมูล
 
 เพิ่มเติม : ในกรณีที่ต้องการกำหนดชนิด DataType ของ Parameters
 
             objCmd.Parameters.Add("@pCustomerID", SqlDbType.VarChar).Value = sCustomerID;
            objCmd.Parameters.Add("@pName", SqlDbType.VarChar).Value = sName;
            objCmd.Parameters.Add("@pEmail", SqlDbType.VarChar).Value = sEmail;
            objCmd.Parameters.Add("@pCountryCode", SqlDbType.VarChar).Value = sCountryCode;
            objCmd.Parameters.Add("@pBudget", SqlDbType.Decimal).Value = dBudget;
            objCmd.Parameters.Add("@pUsed", SqlDbType.Decimal).Value = dUsed;
 สำหรับตัวอย่างที่ 3 และ 4 จะเป็นการอ่านจาก OUTPUT หรือ OUT
 
 ตอนที่ 10 : การใช้ OUTPUT และ OUT เพื่อส่งค่ากลับ (SQL Server : Stored Procedure)
 
 
 Example 3 : การใช้ .NET เรียก Stored Procedure  และอ่านค่า OUTPUT พร้อมกับ SELECT ข้อมูล
 
 Stored Procedure Name : getCustomer()
 
 
CREATE PROCEDURE [dbo].[getCustomer]
	@pCountryCode	VARCHAR(2),
	@pRowFound	INT OUTPUT
AS
BEGIN
	-- set rowcount
	SELECT @pRowFound = COUNT(*) FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode
	-- set customer
	SELECT * FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode
END
 Code (C#)
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace MyApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection objConn = new SqlConnection();
            SqlCommand objCmd = new SqlCommand();
            SqlDataAdapter dtAdapter = new SqlDataAdapter();
            DataSet ds = new DataSet();
            DataTable dt;
            String strConnString, strStored;
            strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase; " +
            " Max Pool Size=400;Connect Timeout=600;";
            strStored = "getCustomer";
            objCmd.Parameters.Add(new SqlParameter("@pCountryCode", SqlDbType.VarChar)).Value = "US"; // IN
            objCmd.Parameters.Add(new SqlParameter("pRowFound", SqlDbType.Int)).Direction = ParameterDirection.Output; // OUT
            objConn.ConnectionString = strConnString;
            objConn.Open();
            objCmd.Connection = objConn;
            objCmd.CommandText = strStored;
            objCmd.CommandType = CommandType.StoredProcedure;
            // Get Select
            dtAdapter.SelectCommand = objCmd;
            dtAdapter.Fill(ds);
            // Get Result 
            // objCmd.Parameters["pRowFound"].Value
            Console.WriteLine(string.Format("pRowFound = {0}", objCmd.Parameters["pRowFound"].Value));
            Console.WriteLine("");
            // Loop Data Table
            dt = ds.Tables[0]; // *** Cursor at 0 , 1 , 2, ...
            for (int i = 0; i <= dt.Rows.Count - 1; i++)
            {
                Console.Write(dt.Rows[i]["CUSTOMER_ID"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["NAME"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["EMAIL"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["COUNTRY_CODE"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["BUDGET"]);
                Console.Write(" - ");
                Console.Write(dt.Rows[i]["USED"]);
                Console.WriteLine("");
            }
            objConn.Close();
            objConn = null;
        }
    }
}
  
 ค่าที่ถูกส่งมาทั้ง SELECT และ Parameters ที่เป็นแบบ OUT
 
 
 
 Example 4 : การใช้ .NET เรียก Stored Procedure  และอ่านค่า OUTPUT ที่มีตั้งแต่ 2 ค่าขึ้นไป
 
 Stored Procedure Name : insertCustomer()
 
 
CREATE PROCEDURE [dbo].[insertCustomer]
	@pCustomerID	VARCHAR(4),
	@pName			VARCHAR(50),
	@pEmail			VARCHAR(50),
	@pCountryCode	VARCHAR(2),
	@pBudget		DECIMAL(18,2),
	@pUsed			DECIMAL(18,2),
	@pResult		INT OUTPUT,
	@pMessage		VARCHAR(500) OUTPUT
AS
BEGIN
	BEGIN TRY
		-- insert customer
		INSERT INTO CUSTOMER VALUES (@pCustomerID,@pName,@pEmail,@pCountryCode,@pBudget,@pUsed);
		SET @pResult = @@ROWCOUNT;
		SET @pMessage = 'Insert Data Successfully';
	END TRY
	BEGIN CATCH
		SET @pResult = 0;
		SELECT @pMessage = ERROR_MESSAGE();
	END CATCH
END
 Code (C#)
 
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace MyApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection objConn = new SqlConnection();
            SqlCommand objCmd = new SqlCommand();
            String strConnString, strStored;
            strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase; " +
            " Max Pool Size=400;Connect Timeout=600;";
            objConn.ConnectionString = strConnString;
            objConn.Open();
            string strCustomerID = "C005";
            string strName = "Fun Wipa";
            string strEmail = "[email protected]";
            string strCountryCode = "TH";
            decimal dBudget = 100000;
            decimal dUsed = 0;
            strStored = "insertCustomer";
            objCmd.Parameters.Add(new SqlParameter("pCustomerID", SqlDbType.VarChar, 4)).Value = strCustomerID; // IN
            objCmd.Parameters.Add(new SqlParameter("pName", SqlDbType.VarChar, 150)).Value = strName; // IN
            objCmd.Parameters.Add(new SqlParameter("pEmail", SqlDbType.VarChar, 150)).Value = strEmail; // IN
            objCmd.Parameters.Add(new SqlParameter("pCountryCode", SqlDbType.VarChar, 2)).Value = strCountryCode; // IN
            objCmd.Parameters.Add(new SqlParameter("pBudget", SqlDbType.VarChar)).Value = dBudget; // IN
            objCmd.Parameters.Add(new SqlParameter("pUsed", SqlDbType.VarChar)).Value = dUsed; // IN
            objCmd.Parameters.Add(new SqlParameter("pResult", SqlDbType.Int)).Direction = ParameterDirection.Output; // OUT
            objCmd.Parameters.Add(new SqlParameter("pMessage", SqlDbType.VarChar, 500)).Direction = ParameterDirection.Output; // OUT
            objCmd.Connection = objConn;
            objCmd.CommandText = strStored;
            objCmd.CommandType = CommandType.StoredProcedure;
            objCmd.ExecuteNonQuery();
            // Get Result 
            // objCmd.Parameters["pResult"].Value
            Console.WriteLine(string.Format("pResult = {0}", objCmd.Parameters["pResult"].Value));
            // objCmd.Parameters["pMessage"].Value
            Console.WriteLine(string.Format("pMessage = {0}", objCmd.Parameters["pMessage"].Value));
            objConn.Close();
            objConn = null;
        }
    }
}
  
 กรณีที่ Insert ข้อมูลสำเร็จ
 
 
  
 กรณีที่ Insert ข้อมูลไม่สำเร็จ
 
 ตอนที่ 18 : Visual Basic (VB.Net) เรียกใช้ EXEC SQL Server Stored Procedure
 
 
 
 
 
 |