2016-10-09 5 views
0

나는 현재 유창함 NHibernate에 ORM을 사용하여 오라클 기능 fu_GetUserGrant를 호출하는 것을 시도하고있다. 나는 코드 아래 시도 : -유창함 NHibernate에 오라클 기능

 var dbCommand = session.Connection.CreateCommand(); 

     dbCommand.CommandText = "select fu_GetUserGrant(@grantId) from dual;"; 
     dbCommand.CommandType = CommandType.Text; 

     var param = dbCommand.CreateParameter(); 
     { 
      param.Value = grantId; 
      param.DbType = DbType.StringFixedLength; 
      param.Size = 200; 
      param.ParameterName = "@grantId"; 
     } 

     dbCommand.Parameters.Add(param); 

     var result = dbCommand.ExecuteNonQuery(); 

     return long.Parse(result.ToString()); 

그리고 점점 예외 실패의 몇 시간 후 Oracle.ManagedDataAccess.Client.OracleException : ORA-00936: missing expression

내가 다른 접근 방식을 시도 :

var c = session. 
     CreateQuery("select fu_GetUserGrant(:grantId) from dual;") 
     .SetParameter("grantId", grantId).UniqueResult<int>(); 

과 점점 예외 - NHibernate.Hql.Ast.ANTLR.QuerySyntaxException : dual is not mapped [select fu_GetUserGrant(:grantId) from dual;]

어떤 아이디어 얘들 아? 내가 MSSQL에서 동일한 기능을 검색 할 때 그것은 (물론 나는 때문에 MSSQL의 다른 SQL 쿼리를 사용합니다.)

답변

0

첫 번째 샘플에서 당신은 SQL 쿼리를 사용하고 두 번째 HQL 질의에 잘 작동합니다. HQL 질의에는 이중성이 없습니다. 그래서 당신이해야 할 일은 SQL에서 "@"대신 ":"을 사용하는 것입니다.

dbCommand.CommandText = "select fu_GetUserGrant(:grantId) from dual;" 
+0

전나무, 도와 주셔서 감사합니다. 나는 '@'를 ':'로 바꾸고 'Oracle.ManagedDataAccess.Client.OracleException : ORA-00936 : missing expression' 같은 예외를 받았다. 그러나 '같은 예외가 등장 "이중에서 fu_GetUserGrant ('* ')를 선택"은 dbCommand.CommandText ='- 그때는 CommandText에 가치를 하드 시도. – Tadziokaz

+0

죄송합니다 내가 직접 오라클의 사용을 피하기 위해 대신 내가'RegisterFunction'를 통해 Dialect''정의에 내 기능을 등록하고, 내 NHibernate에 매핑 이러한 호출을 사용하여 추상적 SQL 함수 호출에 있지 않다, 단지 첫 번째 촬영했다. – tykovec

0

그래서 제 문제에 대한 답을 찾을 수있었습니다.

는 오라클 함수를 호출하기 위해 내가 울부 짖는 코드를 사용 :

 var dbCommand = session.Connection.CreateCommand(); 

     dbCommand.CommandType = CommandType.StoredProcedure; 

     dbCommand.CommandText = "fu_GetUserGrant"; 

     var returnValue = dbCommand.CreateParameter(); 
     { 
      returnValue.ParameterName = "Return_Value"; 
      returnValue.DbType = DbType.Decimal; 
      returnValue.Direction = ParameterDirection.ReturnValue; 
     } 

     var grantIdParam = dbCommand.CreateParameter(); 
     { 
      grantIdParam.Value = grantId; 
      grantIdParam.DbType = DbType.StringFixedLength; 
      grantIdParam.Size = 200; 
      grantIdParam.ParameterName = "m_In_GrantId"; 
      grantIdParam.Direction = ParameterDirection.Input; 
     } 

     dbCommand.Parameters.Add(returnValue); 
     dbCommand.Parameters.Add(grantIdParam); 

     dbCommand.ExecuteReader(); 

     return long.Parse(returnValue.Value.ToString()); 

난 당신이 함수에서 넣어지게된다 반환 값을 지정하는 경우이 경우, CommandType.StoredProcedure;을 통해 오라클 함수를 호출 할 수 있다는 것입니다 배운 내용이었다 - 모든 var returnValue ...