2013-02-27 2 views
3

NHibernate를 사용하여 저장 프로 시저를 호출하고 DTO를 채우는 방법을 이미 알고 있습니다 (대답 : here).NHibernate를 사용하여 저장 프로 시저를 호출하고 DataTable을 채울 수 있습니까?

하지만, 그 가능성이 어떻게 NHibernate에서 ResultTransformer의 동일한 개념을 사용하여 DataTable을 채우기 위해 궁금 해서요 아니면 거기에 다른 권장 된 접근법인가?

나는 NHibernate에서 ResultTransformer의 개념을 사용하는 것을 선호한다. 그러나, 나는 그것의 가능하고 어떻게 있는지 모른다. 다른 사람이 이것을 시도 했습니까? 난 그냥 정의의 ResultTransformer를 작성에서 사용했다

using (ISession session = sessionFactory.OpenSession()) 
    { 
     var sqlQuery = session.CreateSQLQuery("SELECT ID, NAME, ADDRESS FROM CUSTOMER"); 
     var transformedQuery = sqlQuery.SetResultTransformer(new DataTableResultTransformer()); 
     return transformedQuery.List().Single(); 
    } 

: 다음과 같은

public class DataTableResultTransformer : IResultTransformer 
    { 
    private DataTable dataTable; 

    public IList TransformList(IList collection) 
    { 
     var rows = collection.Cast<DataRow>().ToList(); 
     rows.ForEach(dataRow => dataTable.Rows.Add(dataRow)); 
     return new List<DataTable> { dataTable }; 
    } 

    public object TransformTuple(object[] tuple, string[] aliases) 
    { 
     //Create the table schema based on aliases if its not already done 
     CreateDataTable(aliases); 

     //Create and Fill DataRow 
     return FillDataRow(tuple, aliases); 
    } 

    private DataRow FillDataRow(object[] tuple, string[] aliases) 
    { 
     DataRow dataRow = dataTable.NewRow(); 
     aliases.ToList().ForEach(alias => 
           { 
            dataRow[alias] = tuple[Array.FindIndex(aliases, colName => colName == alias)]; 
           }); 
     return dataRow; 
    } 

    private void CreateDataTable(IEnumerable<string> aliases) 
    { 
     if (dataTable == null) 
     { 
     dataTable = new DataTable(); 
     aliases.ToList().ForEach(alias => dataTable.Columns.Add(alias)); 
     } 
    } 
    } 

그리고 그것을 사용 :

+1

누군가 성공한 것으로 보인다 :-) http://www.codewrecks.com/blog/index.php/2010/10/07/load-a-strongly-typed-dataset-from-a- 저장된 - with-nhibernate/ – jbl

+0

@jbl, 참조 용 +1, 나는 개념을 사용하고 해답 :-)로 넣어. 좀 봐주세요. – Baig

+0

NHibernate는이 시나리오에서는 잡음에 지나지 않는다. 그냥 (원하는 경우) 그것에서 연결을 가져오고 DataAdapter를 사용하십시오. –

답변

5

내가의 ResultTransformer의 개념을 사용하여 다음과 같은 솔루션을 내놓았다는 here 설명 내 SQL 쿼리를 내 논리를 기반으로 쿼리의 결과를 변환하려면 DataTableResultTransformer.

결과 집합의 각 항목에 대해 TransformTupple 메서드가 호출됩니다. 튜플에는 별명에 데이터 이름이 들어있는 데이터가 들어 있습니다. 따라서 우리는 DataTable을 작성하고 채우기위한 거의 모든 것을 갖추고 있습니다. 결과 집합의 모든 항목이 TransformTupple 메서드에 의해 변형되면 TransformList 메서드가 끝에 호출됩니다. collection 매개 변수에는 TransformTupple 메서드에서 DataRow로 변환 한 모든 항목이 들어 있습니다. 여기 DataTable에 DataRow를 쉽게 채울 수 있습니다.

같은 종류의 시나리오를 다루는 사람들에게 도움이되기를 바랍니다.

+0

주의 사항 : 테이블이 비어있는 경우에는 작동하지 않습니다. –

관련 문제