2013년 8월 30일 금요일

저장프로시저와 함수 - LINQ

저장프로시저를 이용한 다중테이블 입력 방법
예 : Customers와 CustomersInfo 두 테이블 있고 회원가입시
       Customers에는 UserName, Password, Email을 입력하고
       CustomerInfo에는 FullName과 Customers에 Primary Key인 CustomerID를 입력한다면

DB에 Stored Procedure 생성

CREATE PROCEDURE [InsertCust]
@Username VARCHAR(10),
@Password CHAR(40),
@Email VARCHAR(100),
@Fullname NVARCHAR(10)
AS
DECLARE @CustomerID INT;
BEGIN TRY
    INSERT INTO [Customers] VALUES(@Username, @Password, @Email);
    SELECT @CustomerID = [CustomerID] FROM [Customers] WHERE [UserName] = @Username;
    INSERT INTO [CustomerInfo]([CustomerID], [FullName]) VALUES(@CustomerID, @Fullname);
END TRY

BEGIN CATCH
    RETURN ERROR_NUMBER()
END CATCH
GO

Entity설정

[Function(Name="dbo.InsertCust")]
public int InsertCust(
    [Parameter(Name="Username",DbType="VarChar(10)")] string username,
    [Parameter(Name="Password",DbType="Char(40)")]    string password,
    [Parameter(Name="Email",DbType="VarChar(100)")]   string email,
    [Parameter(Name="FullName",DbType="NVarChar(30)")]string fullname)
    {
        IExecuteResult result = this.ExecuteMethodCall(
        this,
        ((MethodInfo)(MethodInfo.GetCurrentMethod())),
        username, password, email, fullname);
    return ((int)(result.ReturnValue));
}

사용방법

CustomersEntity entity = new CustomersEntity(conn);
int insert = entity.InsertCust("tomebody", "han001122", "tome@naver.com", "Tome kim");
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

저장프로시저를 이용한 다중테이블 조회 방법
예 : CustomerInfo, Products, Orders 3개의 테이블이 있다고 가정
       CustomerInfo에서는 FullName,
       Products에서는 ProductName,
       Orders에서는 UnitPrice, Amount를 읽어온다.
       단 CustomerID, ProductID를 기준값으로

DB에 Stored Procedure 생성


CREATE PROCEDURE [SelectOrderInfo] @CustomerID INT, @ProductID INT
AS
    SELECT c.FullName, p.ProductName, o.Quantity, (o.Quantity * p.UnitPrice) AS [Amount]
    FROM [CustomerInfo] c
    JOIN [Orders] o
    On c.CustomerID = o.CustomerID
    JOIN [Products] p
    On o.ProductID = p.ProductID
    WHERE c.CustomerID = @CustomerID And o.ProductID = @ProductID
GO

Entity설정


[Function(Name="dbo.SelectOrderInfo")]
public ISingleResult<SelectOrderInfoResult> SelectOrderInfo(
    [Parameter(Name="CustomerID",DbType="Int")]int CustomerID,
    [Parameter(Name="ProductID",DbType="Int")]int ProductID)
{
    IExecuteResult result = this.ExecuteMethodCall(
        this,
        ((MethodInfo)(MethodInfo.GetCurrentMethod())),
        CustomerID, ProductID);
    return((ISingleResult<SelectOrderInfoResult>)(result.ReturnValue));
}

public partial class SelectOrderInfoResult
{
    [Column]public string FullName { get; set; }
    [Column]public string ProductName { get; set; }
    [Column]public int Quantity { get; set; }
    [Column]public int Amount { get; set; }
}
SelectProcedure entity = new SelectProcedure(conn);

Entity설정

ISingleResult<SelectOrderInfoResult> Result = entity.SelectOrderInfo(1, 1);
foreach (SelectOrderInfoResult item in Result)
{
    Console.WriteLine("{0}-{1}-{2}-{3}",
        rs.FullName,
        rs.ProductName,
        rs.Quantity,
        rs.Amount);
}

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
ISingleResult<TEntity> : 저장 프로시저의 실행 결과로 리턴되는 엔티티 클래스의 단일 결과집합을 가진다.

댓글 없음:

댓글 쓰기