LINQ to SQL 문의 저장 프로세스

17872 단어 LinQ
소스 주소 연결: LINQ to SQL 문의 저장 프로세스
Google 컴파일러에서는 저장 프로세스가 필요할 때가 많습니다. LINQ to SQL에서는 어떻게 사용합니까?원래보다 더 간단할지도 몰라요.다음은 NORTHWND로 하겠습니다.MDF 데이터베이스에 포함된 몇 가지 저장 프로세스를 이해합니다.
1. 스칼라 반환
데이터베이스에는 Customers Count By Region이라는 저장 프로세스가 있습니다.이 저장 프로세스는 고객이 있는'WA'구역의 수량을 되돌려줍니다.
ALTER PROCEDURE [dbo].[NonRowset]
    (@param1 NVARCHAR(15))
AS
BEGIN
    SET NOCOUNT ON;
     DECLARE @count int
     SELECT @count = COUNT(*)FROM Customers 
     WHERECustomers.Region = @Param1
     RETURN @count
END

이 스토리지 프로세스를 O/R 디자이너로 드래그하면 다음 코드 세그먼트가 자동으로 생성됩니다.
[Function(Name = "dbo.[Customers Count By Region]")]
public int Customers_Count_By_Region([Parameter
(DbType = "NVarChar(15)")] string param1)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
    return ((int)(result.ReturnValue));
}

필요한 경우
int count = db.CustomersCountByRegion("WA");
Console.WriteLine(count);

문장 설명: 이 실례는 저장 프로세스를 사용하여'WA'지역의 고객 수를 되돌려줍니다.
2. 단일 결과 집합
데이터베이스에서 줄 집합을 되돌려주고 선별 결과에 사용할 입력 파라미터를 포함합니다.우리가 줄 집합의 저장 프로세스를 실행할 때 결과 클래스를 사용합니다. 이것은 저장 과정에서 되돌아오는 결과를 저장합니다.
다음 예는 고객 행으로 돌아가고 입력 매개 변수를 사용하여 "London"을 고객 도시로 나열한 행의 고정된 몇 열만 반환하는 스토리지 프로세스를 나타냅니다. 
ALTER PROCEDURE [dbo].[Customers By City]
     -- Add the parameters for the stored procedure here
     (@param1 NVARCHAR(20))
AS
BEGIN
     -- SET NOCOUNT ON added to prevent extra result sets from
     -- interfering with SELECT statements.
     SET NOCOUNT ON;
     SELECT CustomerID, ContactName, CompanyName, City from 
     Customers as c where c.City=@param1
END

O/R 디자이너로 드래그하면 다음 코드 세그먼트가 자동으로 생성됩니다.
[Function(Name="dbo.[Customers By City]")]
public ISingleResult<Customers_By_CityResult> Customers_By_City(
[Parameter(DbType="NVarChar(20)")] string param1)
{
    IExecuteResult result = this.ExecuteMethodCall(this, (
    (MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
    return ((ISingleResult<Customers_By_CityResult>)
    (result.ReturnValue));
}

다음 코드로 호출합니다.
ISingleResult<Customers_By_CityResult> result =
 db.Customers_By_City("London");
foreach (Customers_By_CityResult cust in result)
{
    Console.WriteLine("CustID={0}; City={1}", cust.CustomerID,
        cust.City);
}

문장 설명: 이 실례는 저장 프로세스를 사용하여 런던에 있는 고객의CustomerID와City를 되돌려줍니다.
3. 여러 가지 형태의 단일 결과 집합
저장 프로세스가 여러 개의 결과 모양을 되돌릴 수 있을 때, 되돌림 형식은 하나의 투영 모양으로 강형화할 수 없습니다.LINQ to SQL은 가능한 모든 투영 유형을 생성할 수 있지만 어떤 순서로 되돌려줄지 알 수 없습니다.ResultTypeAttribute 속성은 여러 결과 유형을 반환하는 저장 프로세스에 적용되며 이 프로세스가 반환할 수 있는 유형의 집합을 지정합니다.
다음 SQL 코드 예에서 결과 형태는 입력(param1 = 1 또는 param1 = 2)에 따라 달라집니다.우리는 어느 투영으로 먼저 돌아갈지 모른다.
ALTER PROCEDURE [dbo].[SingleRowset_MultiShape]
     -- Add the parameters for the stored procedure here
     (@param1 int )
AS
BEGIN
     -- SET NOCOUNT ON added to prevent extra result sets from
     -- interfering with SELECT statements.
     SET NOCOUNT ON;
     if(@param1 = 1)
     SELECT * from Customers as c where c.Region = 'WA'
     else if (@param1 = 2)
     SELECT CustomerID, ContactName, CompanyName from 
     Customers as c where c.Region = 'WA'
END

O/R 디자이너로 드래그하면 다음 코드 세그먼트가 자동으로 생성됩니다.
[Function(Name="dbo.[Whole Or Partial Customers Set]")]
public ISingleResult<Whole_Or_Partial_Customers_SetResult> 
Whole_Or_Partial_Customers_Set([Parameter(DbType="Int")] 
System.Nullable<int> param1)
{
    IExecuteResult result = this.ExecuteMethodCall(this, 
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
    return ((ISingleResult<Whole_Or_Partial_Customers_SetResult>)
    (result.ReturnValue));
}

그러나 VS2008은 다중 결과 집합 저장 프로세스를 단일 결과 집합의 저장 프로세스로 식별할 것이다. 기본적으로 생성된 코드는 수동으로 수정하고 여러 결과 집합을 되돌려 달라고 요구한다. 이렇게 한다.
[Function(Name="dbo.[Whole Or Partial Customers Set]")]
[ResultType(typeof(WholeCustomersSetResult))]
[ResultType(typeof(PartialCustomersSetResult))]
public IMultipleResults Whole_Or_Partial_Customers_Set([Parameter
(DbType="Int")] System.Nullable<int> param1)
{
    IExecuteResult result = this.ExecuteMethodCall(this, 
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
    return ((IMultipleResults)(result.ReturnValue));
}

우리는 되돌아오는 유형을 지정하기 위해 두 개의 분류를 정의했다.WholeCustomersSetResult 클래스는 다음과 같습니다. (확장하려면 클릭)
코드가 여기 펼쳐져 있어요.
PartialCustomersSetResult 클래스는 다음과 같습니다. (확장하려면 클릭)
코드가 여기 펼쳐져 있어요.
이렇게 하면 사용할 수 있다. 다음 코드는 직접 호출하여 각각 각자의 결과 집합을 되돌려준다.
//    Customer   
IMultipleResults result = db.Whole_Or_Partial_Customers_Set(1);
IEnumerable<WholeCustomersSetResult> shape1 =
 result.GetResult<WholeCustomersSetResult>();
foreach (WholeCustomersSetResult compName in shape1)
{
    Console.WriteLine(compName.CompanyName);
}
//    Customer   
result = db.Whole_Or_Partial_Customers_Set(2);
IEnumerable<PartialCustomersSetResult> shape2 =
 result.GetResult<PartialCustomersSetResult>();
foreach (PartialCustomersSetResult con in shape2)
{
    Console.WriteLine(con.ContactName);
}

문장 설명: 이 실례는 저장 프로세스를 사용하여 "WA"지역의 한 그룹의 고객을 되돌려줍니다.되돌아오는 결과 집합의 형상은 들어오는 매개 변수에 달려 있습니다.매개 변수가 1과 같으면 모든 고객 속성을 되돌려줍니다.매개변수가 2와 같으면 ContactName 속성이 반환됩니다.
4. 여러 결과 세트
이런 저장 과정은 여러 개의 결과 모양을 생성할 수 있지만, 우리는 이미 결과의 반환 순서를 알고 있다.
다음은 여러 결과 세트를 순서대로 반환하는 저장 프로세스 Get Customer And Orders입니다.고객 ID가'SEVES'인 고객과 그들의 모든 주문서를 되돌려줍니다.
ALTER PROCEDURE [dbo].[Get Customer And Orders]
(@CustomerID nchar(5))
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT * FROM Customers AS c WHERE c.CustomerID = @CustomerID  
    SELECT * FROM Orders AS o WHERE o.CustomerID = @CustomerID
END

디자이너 코드로 드래그하려면 다음과 같이 하십시오.
[Function(Name="dbo.[Get Customer And Orders]")]
public ISingleResult<Get_Customer_And_OrdersResult>
Get_Customer_And_Orders([Parameter(Name="CustomerID",
DbType="NChar(5)")] string customerID)
{
     IExecuteResult result = this.ExecuteMethodCall(this,
     ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
     return ((ISingleResult<Get_Customer_And_OrdersResult>)
     (result.ReturnValue));
}

마찬가지로 우리는 자동으로 생성된 코드를 수정해야 한다.
[Function(Name="dbo.[Get Customer And Orders]")]
[ResultType(typeof(CustomerResultSet))]
[ResultType(typeof(OrdersResultSet))]
public IMultipleResults Get_Customer_And_Orders
([Parameter(Name="CustomerID",DbType="NChar(5)")]
string customerID)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
    ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
    return ((IMultipleResults)(result.ReturnValue));
}

마찬가지로 자신의 필기 클래스를 저장하는 과정이 각자의 결과집으로 되돌아오게 한다.
CustomerResultSet 클래스
코드가 여기 펼쳐져 있어요.
OrdersResultSet 클래스
코드가 여기 펼쳐져 있어요.
이때는 호출만 하면 된다.
IMultipleResults result = db.Get_Customer_And_Orders("SEVES");
//  Customer   
IEnumerable<CustomerResultSet> customer = 
result.GetResult<CustomerResultSet>();
//  Orders   
IEnumerable<OrdersResultSet> orders = 
 result.GetResult<OrdersResultSet>();
//   ,    CustomerResultSet    
foreach (CustomerResultSet cust in customer)
{
    Console.WriteLine(cust.CustomerID);
}

문장 설명: 이 실례는 저장 프로세스를 사용하여 고객의'SEVES'와 모든 주문서를 되돌려줍니다.
5. 출력 매개변수 포함
LINQ to SQL은 출력 매개변수를 참조 매개변수에 매핑하고 값 유형에 대해서는 매개변수를null로 선언합니다.
다음 예제에서는 단일 입력 매개변수(고객 ID)와 전체 매출액 중 하나의 출력 매개변수를 반환합니다.
ALTER PROCEDURE [dbo].[CustOrderTotal] 
@CustomerID nchar(5),
@TotalSales money OUTPUT
AS
SELECT @TotalSales = SUM(OD.UNITPRICE*(1-OD.DISCOUNT) * OD.QUANTITY)
FROM ORDERS O, "ORDER DETAILS" OD
where O.CUSTOMERID = @CustomerID AND O.ORDERID = OD.ORDERID

이 저장 프로세스를 디자이너에 끌어다 놓으면 그림은 다음과 같습니다.
생성 코드는 다음과 같습니다.
[Function(Name="dbo.CustOrderTotal")]
public int CustOrderTotal(
[Parameter(Name="CustomerID", DbType="NChar(5)")]string customerID,
[Parameter(Name="TotalSales", DbType="Money")]
  ref System.Nullable<decimal> totalSales)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
    ((MethodInfo)(MethodInfo.GetCurrentMethod())),
    customerID, totalSales);
    totalSales = ((System.Nullable<decimal>)
    (result.GetParameterValue(1)));
    return ((int)(result.ReturnValue));
}

우리는 다음 문장을 사용하여 이 저장 프로세스를 호출합니다. 주의: 출력 파라미터는 인용에 따라 전달되며, 지원하는 파라미터를 'in/out' 으로 하는 방안입니다.이 경우 매개변수는 "out"만 됩니다. 
decimal? totalSales = 0;
string customerID = "ALFKI";
db.CustOrderTotal(customerID, ref totalSales);
Console.WriteLine("Total Sales for Customer '{0}' = {1:C}", 
customerID, totalSales);

문 설명: 이 실례는 Out 매개 변수를 되돌려 주는 저장 프로세스를 사용합니다.
자, 여기까지 하겠습니다. 그 증삭제 조작은 이치에 맞습니다.여러분이 이 다섯 가지 실례를 통해 저장 과정을 이해하셨을 거라고 믿습니다.

좋은 웹페이지 즐겨찾기