2016-10-09 3 views
0

В настоящее время я использую Fluent NHibernate ORM и пытаюсь вызвать функцию oracle fu_GetUserGrant. Я попытался код ниже:Fluent NHibernate Oracle function

 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, она отлично работает (конечно, я использую другой SQL-запрос из-за MSSQL.)

ответ

0

В первом примере вы используете SQL-запрос и во втором запросе HQL. Конечно, в запросе HQL нет двойного. Итак, что вам нужно сделать в SQL, используя «:» вместо «@»

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

Ели из всех, спасибо за помощь. Я попробовал заменить '@' на «:» и получил такое же исключение - «Oracle.ManagedDataAccess.Client.OracleException: ORA-00936: missing expression». Затем я попробовал только значение hardcode в commandText - 'dbCommand.CommandText =" выбрать fu_GetUserGrant ('*') из двойного; ", но такое же исключение появилось. – Tadziokaz

+0

Извините, что это был только первый снимок, я не использую такие вызовы в моем сопоставлении NHibernate, вместо этого я регистрирую свои функции в пользовательском 'Dialect' через' RegisterFunction', чтобы избежать прямого использования Oracle и абстрактных вызовов функций 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 ...

Смежные вопросы