2009-05-30 136 views
2

1.Database平台:SqlServer的如何从SQL Server存储过程返回值到nHibernate中?

2.Data访问:NHibernate的1.2

现在,我们需要通过NHibernate的访问存储过程,就像这样:

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

我知道我能得到用户List by IQuery, 我也想获得默认返回值“1234”。

问:

  1. 如何得到默认的返回值?
  2. 如果不能直接得到它,我们可以通过输出参数获取值吗?
+0

你为什么试图调用'ALTER PROC'?你是否试图调用实际的过程? – 2009-05-30 02:48:36

+2

不,这是proc的定义。关键是他想告诉我们他想要什么回报。 – 2011-01-21 10:53:13

回答

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> 

在我的repository.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

首先,在我见过的任何地方都没有称之为“默认返回值”。这只是返回值。它通常用于返回成功/错误状态。

我不知道nHibernate是如何做的,但在ADO.NET中,您将使用一个参数,其方向属性设置为“返回”。也许在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

我喜欢你的显式编码风格。非常容易阅读:-) – 2010-07-23 05:11:45

相关问题