2009-05-30 3 views
2

1.Database 플랫폼 : SQLSERVERSQL Server 저장 프로 시저에서 반환 값을 nHibernate로 가져 오는 방법은 무엇입니까?

2.Data 액세스 : nHibernate 수 1.2

이제 우리는 다음과 같이 nHibernate 수하여 저장 프로 시저에 액세스해야합니다

ALTER PROCEDURE TestProc() 
AS 
    BEGIN 
    Select * From User 
    Return 1234 
    END 

내가 사용자를 얻을 수있어 IQuery, 에 의해 목록 및 너무 "1234"기본 반환 값을 얻고 싶습니다.

질문 :

  1. 방법이 기본 반환 값을 얻는 방법?
  2. 직접 가져올 수없는 경우 출력 매개 변수를 통해 값을 가져올 수 있습니까?
+0

왜 '변경 PROC'를 호출하려고합니까? 실제 proc를 호출하려고합니까? –

+2

아니요, 그것은 proc 정의입니다. 요점은 그가 원하는 것을 우리에게 보여주고 싶다는 것입니다. –

답변

2

내가 그것을 어떻게이되어 내 .hbm.xml에

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DocumentManagement.Data" namespace="DocumentManagement.Data.Repositories" > 

<sql-query name="GetDocument">  
<return class="DocumentManagement.Core.Models.PhysicalDocument, DocumentManagement.Core">  
    <return-property column="DocId" name="Id" />  
    <return-property column="Filepath" name="Filepath" /> 
    <return-property column="Filename" name="Filename" /> 
</return> 
exec Investor_GetDocumentById :userId, :docId 
</sql-query> 

</hibernate-mapping> 

내 저장소 .cs

public PhysicalDocument GetDocumentPath(int userId, int docId) 
    { 
     var query = Session.GetNamedQuery("GetDocument") 
      .SetInt32("userId", userId) 
      .SetInt32("docId", docId).List<PhysicalDocument>(); 

     return query[0]; 
    } 
+0

'PhysicalDocument' 엔티티 매핑 방법을 포함하도록 답을 수정하거나 (덧글을 추가하십시오) 주시겠습니까? 나는 특히'Id' 칼럼에 관심이있다. 감사. –

+0

Id 열의 매핑은 hbm에 있습니다. 이게 도움이 되길 바란다. CurlyFro

+2

전혀 질문에 대답하지 않는 것 같습니까? OP는 명명 된 쿼리를 매핑하는 방법이 아닌 저장 프로 시저에서 반환 값을 얻는 방법을 묻는 중 .. – MattDavey

1

우선, 내가 본 모든 곳에서 "기본 반환 값"으로 불리지는 않습니다. 그것은 단지 반환 값입니다. 일반적으로 성공/오류 상태를 반환하는 데 사용됩니다.

nHibernate가 어떻게 작동하는지 모르지만 ADO.NET에서는 Direction 속성이 "Return"으로 설정된 매개 변수를 사용합니다. 어쩌면 nHibernate에 상응하는 것이있을 수 있습니다.

OTOH의 경우 OUTPUT 매개 변수를 사용하여 실제 유용한 값을 반환하고 오류 코드에 대해 RETURN 값을 유지하거나 무시할 수 있습니다.

8

NHibernate에 당신이이 방법으로 저장 프로 시저를 사용하지 않습니다. 그러나 평범한 구식 ADO.NET API를 사용하여 호출하는 방법을 허용합니다. NHibernate Documentation은이 프로 시저를 사용하려면 session.Connection을 통해 실행해야한다고 말합니다.

ISession session = sessionFactory.GetSession(); 

using(ITransaction transaction = session.BeginTransaction()) 
{ 
    IDbCommand command = new SqlCommand(); 
    command.Connection = session.Connection; 

    // Enlist IDbCommand into the NHibernate transaction 
    transaction.Enlist(command); 

    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "dbo.SetUserInfo"; 

    // Set input parameters 
    var parm = new SqlParameter("@UserID", SqlDbType.Int); 
    parm.Value = 12345; 
    command.Parameters.Add(parm); 

    // Set output parameter 
    var outputParameter = new SqlParameter("@Quantity", SqlDbType.Int); 
    outputParameter.Direction = ParameterDirection.Output; 
    command.Parameters.Add(outputParameter); 

    // Set a return value 
    var returnParameter = new SqlParameter("@RETURN_VALUE", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 
    command.Parameters.Add(returnParameter); 

    // Execute the stored procedure 
    command.ExecuteNonQuery(); 
} 

당신은 여기에서 자세한 내용을 찾을 수 있습니다 - - 다음은 예입니다

http://refactoringaspnet.blogspot.com/2009/06/how-to-use-legacy-stored-procedures-in.html

+1

나는 당신의 노골적인 코딩 스타일을 좋아합니다. 매우 읽기 쉬운 :-) –

관련 문제