Как получить возвращаемое значение из хранимой процедуры SQL Server в nHibernate? - PullRequest
2 голосов
/ 30 мая 2009

1. Платформа базы данных: SqlServer

2. Доступ к данным: nHibernate 1.2

Теперь нам нужен доступ к процедуре хранения по nHibernate, например:

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

Я знаю, что могу получить список пользователей по IQuery, И я хочу получить возвращаемое значение по умолчанию "1234" тоже.

Вопрос:

  1. Как получить это возвращаемое значение по умолчанию?
  2. Если не получается получить напрямую, можем ли мы получить значение по выходному параметру?

Ответы [ 4 ]

9 голосов
/ 18 июня 2009

NHibernate не позволяет вам использовать хранимые процедуры таким образом. Но он позволяет делать звонки с использованием старого API ADO.NET. Документация NHibernate говорит, что если вы хотите использовать эти процедуры, вы должны выполнить их через 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

3 голосов
/ 18 сентября 2009

вот как я это делаю:

в моем .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];
    }
1 голос
/ 30 мая 2009

Прежде всего, это не называется «возвращаемым значением по умолчанию», где я когда-либо видел. Это просто возвращаемое значение. Обычно используется для возврата статуса успеха / ошибки.

Я не знаю, как работает nHibernate, но в ADO.NET вы бы использовали параметр со свойством Direction, установленным на «Return». Может быть, в nHibernate есть эквивалент.

OTOH, было бы более обычным использовать параметр OUTPUT, чтобы возвращать фактическое полезное значение, и сохранять значение RETURN для кодов ошибок или для игнорирования.

0 голосов
/ 30 мая 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...