При вызове хранимой процедуры SQL Server из NHibernate можно передать список или пользовательский тип данных в качестве параметра - PullRequest
3 голосов
/ 29 апреля 2011

Я проверял это с Oracle. Работает нормально. Потому что там у меня есть Пакет и определены тип Ассоциативного массива и Хранимая процедура в теле пакета.

Хотя в SQL Server нет концепции пакетов. Как заставить это работать в SQL Server?

Начало доменного объекта

[Serializable]
public class Employee
{
    public virtual int EmployeeId
    {
        get;
        set;
    }
    public virtual string EmployeePassword
    {
        get;
        set;
    }

    public virtual string EmployeeName
    {
        get;
        set;
    }

    public virtual int TeamAssociatedWith
    {
        get;
        set;
    }
    public virtual string IsCaptain
    {
        get;
        set;
    }
    public virtual int NumberOfMOM
    {
        get;
        set;
    }
    public virtual int Balance
    {
        get;
        set;
    }       
}

Mapping

<?xml version="1.0" encoding="utf-8" ?>  
 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">  
   <class name="DomainObject.Employee,DomainObject" table="Employee">  
   <id name="EmployeeId" column="EMP_ID" type="int" unsaved-value="0">  
     <generator class="native">         
     </generator>  
   </id>  
   <property name="EmployeePassword" column="EMP_PASSWORD" type="string"/>  
   <property name="EmployeeName" column="EMP_NAME" type="string"/>    
   <property name="TeamAssociatedWith" column="TEAM_ASSOCIATED_WITH" type="int"/>  
   <property name="IsCaptain" column="IS_CAPTAIN" type="string"/>  
   <property name="Balance" column="BALANCE" type="int"/>  
   <property name="NumberOfMOM" column="NO_OF_MOM" type="int"/>  
 </class>  
</hibernate-mapping>  

Хранимая процедура

CREATE PROCEDURE [dbo].[some_sp] @id IntTable READONLY   
AS  
SELECT EMP_ID,EMP_NAME,EMP_PASSWORD,
TEAM_ASSOCIATED_WITH,IS_CAPTAIN,NO_OF_MOM,BALANCE 
FROM employee; 
GO

<code>ISQLQuery final = eventhistorysession.CreateSQLQuery("EXEC TestCustom @location = :id");<br>
IQuery result = final.SetStructured("id", dt);<br>
IList finalResult = result.List();<br>

1 Ответ

4 голосов
/ 29 апреля 2011

В SQL Server хранимые процедуры могут иметь параметры таблицы типов, которые можно использовать для имитации функции Oracle Associative Array. В вашей ситуации вы бы отправляли «таблицу» с одной строкой и несколькими столбцами. Здесь хороший пример NHibernate здесь в принятом ответе.

...