본문 바로가기

프로그래밍/ASP.NET MVC

Entity Framework 에서 저장프로시저 리턴결과 받기

Entity Framework 에서 저장 프로시저 (Stored Procedure) 를 통해 결과를 리턴 받는 방법을 포스팅 합니다.

 

우선, ASP.NET MVC 환경에서 ADO.NET Entity Data Model 을 생성하여 테이블 및 저장프로시저를

 

서버로 부터 만들고, 스캐폴딩을 통하여 컨트롤러를 생성하였다고 가정하도록 하겠습니다.

 

 

 

 

Member 엔티티는 위와 같은 속성으로 구성되어 있고, 저장 프로시저의 내용은 아래와 같습니다.

 

CREATE PROCEDURE [dbo].[Register] @StringID varchar(255), @Password varchar(255), @NickName varchar(255), @Email varchar(255), @Phone varchar(255), @Address varchar(255), @RetVal int output AS BEGIN SET NOCOUNT ON; SET @RetVal = 0; IF @StringID IS NULL OR @StringID = '' OR @Password IS NULL OR @Password = '' OR @NickName IS NULL OR @NickName = '' OR @Email IS NULL OR @Email = '' OR @Phone IS NULL OR @Phone = '' OR @Address IS NULL OR @Address = '' BEGIN RETURN @RetVal END DECLARE @HashPassword varchar(32), @id int SET @HashPassword = CONVERT(NVARCHAR(32), HASHBYTES('MD5', @Password), 2) INSERT INTO dbo.Member VALUES(@StringID, @NickName, @Email, @HashPassword, @Phone, @Address) SET @RetVal = 1; RETURN @RetVal END

저장프로시저의 내용은 테이블에 데이터 삽입시 해당 속성의 값들이 NULL 이거나 없는 경우

 

정수 0 을 리턴 하여 실패를 알리고, 삽입까지 이상없이 마무리 된경우 1 을 리턴하여 성공을 알립니다.

 

이제 우리가 해볼것은, Entity Framework 에서 저장프로시저의 결과를 리턴 받는 방법 입니다.

 

edmx 를 통해 모델을 생성하고, 스캐폴딩을 통해 컨트롤러를 구성했다면 자동으로 필요한 소스코드는 생성되어질 것 입니다.

 

 

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Member member)
        {
            if (ModelState.IsValid)
            {
                db.Member.Add(member);
                db.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(member);
        }

 

 

컨트롤러의 소스코드중 Create 기본 메서드 소스코드를 기반으로 저장프로시저 Register 를 호출하고,

프로시저의 결과를 리턴받는 소스코드를 작성해 보겠습니다.

 

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Member member)
        {
            if (ModelState.IsValid)
            {
		//기존 코드
                //db.Member.Add(member);
                //db.SaveChanges();

		//반환 받을 OutputParameter 구성
                var outputParameter = new ObjectParameter("RetVal", typeof(int));
	
		//저장 프로시저 호출
                db.Register(member.MemberStringID, member.Password, member.NickName, member.Email, member.Phone, member.Address, outputParameter);
                System.Console.WriteLine(outputParameter.Value);

                return RedirectToAction("Index");
            }

            return View(member);
        }

 

edmx 를 통해 모델을 생성하고 테이블 및 프로시저를 불러온경우 자동으로 DbContext 클래스가 구성이 되는데,

 

이때 저장 프로시저의 소스코드 까지 자동으로 구성됩니다.

 

이때, 저장 프로시저내 output 으로 결과를 출력한다면

 

저장 프로시저를 호출하는 메서드는 ObjectParameter 를 받게 되고, 해당 결과를 ObjectParameter 의 Value 에 담기게 됩니다.

 

실제 내부적으로 ExecuteFunction 를 사용하는데 해당 메서드는 영향을 받는 행 수를 리턴하므로,

 

저장 프로시저에서 무엇을 리턴하든 영향받은 행 수 만 리턴 받게 되므로,

 

output 으로 통해 리턴값을 받아야 합니다.

 

[결과]

 

 

 

 

 

저장 프로시저를 호출하고, 정상적으로 데이터가 이루어진 경우 저장 프로시저내 결과 1 리턴한 결과를 받은 화면 (위)

 

 

 

 

 

 

 

데이터를 NULL 로 하여 저장 프로시저를 호출한 결과 저장 프로시저 내에서 실패한 결과 0 리턴을 받은 모습 (위)