ExecuteNonQuery

ExecuteNonQuery라 하면 반환없는 실행문이라고 이해하시면 되겠습니다.
이 말이 더 어렵다고요?^^;
보통 SELECT 구문은 검색된 결과를 반환해주지요.
그러나, INSERT, UPDATE 및 DELETE 구문은 검색결과를 반환하는게 아니잖아요?
물론 SQL Server 등은 실행된 행의 갯수를 반환하기는 합니다만...쿨럭...
결론적으로 ExecuteNonQuery는 INSERT, UPDATE 및 DELETE 구문을 실행할 때 사용합니다.
우선 SQL Server 프로시저를 살펴 보겠습니다.
CREATE PROC WSP_CUSTOMERS_U1
(
	@CUSTOMERID		NCHAR(5)
	, @CONTACTNAME		NVARCHAR(30)
)
AS
BEGIN
	UPDATE	CUSTOMERS
	SET	CONTACTNAME		= @CONTACTNAME
	WHERE	CUSTOMERID		= @CUSTOMERID
	
END


자, 이제 C# 코드를 살펴 볼까요?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class sql_update : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					base.ExecuteNonQuery(
						"WSP_CUSTOMERS_U1"	// 첫 번째 전달변수는 프로시저명을 입력해 줍니다.
						, "BLAUS"		// 두번째부터는 프로시저의 변수들에 대한 값들을 순차적으로 입력하시면 됩니다.
						, "Hanna Moos - 2"
						);

					MessageBox.Show("UPDATE 문을 성공하였습니다.");
				}
				catch (Exception err)
				{
					// err.HelpLink에는 프로시저 실행구문이 있습니다.
					// SQL Profiler를 실행하지 않아도, 사용자가 실행한 프로시저 및 전달 변수들을 확인하실 수 있습니다.
					MessageBox.Show(err.HelpLink + "<br />" + err.Message
						, "Error"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}


이번에는 ad-hoc 쿼리를 이용해서 처리하는 방법을 알아 보겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class sql_update : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					base.ExecuteNonQuery(
						// 실행하실 UPDATE문을 하나의 string 형태로 전달하시면 됩니다.
						"UPDATE CUSTOMERS SET CONTACTNAME = 'Hanna Moos - 2' WHERE CUSTOMERID = 'BLAUS';"
						);

					MessageBox.Show("UPDATE 문을 성공하였습니다.");
				}
				catch (Exception err)
				{
					MessageBox.Show(err.Message
						, "Error"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}


자, 이번에는 오라클 패키지 및 프로시저용 함수를 살펴 보겠습니다.
먼저 오라클 패키지 및 프로시저를 보겠습니다.
-- Package Spec 정의
CREATE OR REPLACE PACKAGE PKG_EMPLOYEES AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE WSP_EMPLOYEES_R1
(
    I_LASTNAME      IN  VARCHAR2
    , I_EMPLOYEEID  IN  NUMBER
    , O_EMPLOYEES   OUT T_CURSOR
    , O_CUSTOMERS   OUT T_CURSOR
);

PROCEDURE WSP_EMPLOYEES_U1
(
    I_EMPLOYEEID    IN  NUMBER
    , I_FIRSTNAME   IN  VARCHAR2
);

END PKG_EMPLOYEES;
-- Package Body 정의
CREATE OR REPLACE PACKAGE BODY PKG_EMPLOYEES AS
PROCEDURE WSP_EMPLOYEES_R1
(
    I_LASTNAME      IN  VARCHAR2
    , I_EMPLOYEEID  IN  NUMBER
    , O_EMPLOYEES   OUT T_CURSOR
    , O_CUSTOMERS   OUT T_CURSOR
)
IS
BEGIN
    -- EMPLOYEES
    OPEN O_EMPLOYEES FOR
    SELECT  *
    FROM    EMPLOYEES
    WHERE   LASTNAME        LIKE '%'||I_LASTNAME||'%'
    AND     EMPLOYEEID      > I_EMPLOYEEID;
    
    -- CUSTOMERS
    OPEN O_CUSTOMERS FOR
    SELECT  *
    FROM    CUSTOMERS;
    
END WSP_EMPLOYEES_R1;




PROCEDURE WSP_EMPLOYEES_U1
(
    I_EMPLOYEEID    IN  NUMBER
    , I_FIRSTNAME   IN  VARCHAR2
)
IS
BEGIN

    UPDATE  EMPLOYEES
    SET     FIRSTNAME   = I_FIRSTNAME
    WHERE   EMPLOYEEID  = I_EMPLOYEEID;

END WSP_EMPLOYEES_U1;


END PKG_EMPLOYEES;


패키지가 준비되었다면, 업데이트 프로시저를 한 번 실행해 보도록 하겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Collections;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class ExecuteNonQuery2 : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					// Input 파라미터를 Dictionary 개체 형식으로 추가해 줍니다.
					Dictionary<object, object> _dic = new Dictionary<object, object>();
					_dic.Add("I_EMPLOYEEID", 3);
					_dic.Add("I_FIRSTNAME", "John");

					base.ExecuteNonQuery(
						"PKG_EMPLOYEES.WSP_EMPLOYEES_U1"
						, _dic
						);

					MessageBox.Show("Oracle 업데이트가 성공!");
				}
				catch (Exception err)
				{
					MessageBox.Show(err.Message
						, "Error"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}


마지막으로 Oracle에서 ad-hoc 쿼리를 이용해서 업데이트문을 실행하는 방법을 알아 보겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Collections;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class ExecuteNonQuery2 : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					base.ExecuteNonQuery(
						"UPDATE EMPLOYEES SET FIRSTNAME = 'John' WHERE EMPLOYEEID = 3;"
						);

					MessageBox.Show("Oracle 업데이트가 성공!");
				}
				catch (Exception err)
				{
					MessageBox.Show(err.HelpLink
						, "Error"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}


지금까지 ExecuteNonQuery 함수의 활용 방법에 대해서 알아 보았습니다.

TOP