2010-11-26 10 views
2

C#으로 응용 프로그램을 구축하고 DAL (SQL Server) 용 엔터프라이즈 라이브러리를 사용하기로 결정했습니다.엔터프라이즈 라이브러리 관리 연결

어디서 기억이 안나지만, EntLib에 대한 기사를 읽었는데,이 엔트Lib은 연결이 자동으로 닫혔다 고 말했습니다.

사실입니까?

그렇지 않은 경우 중간 계층에서 연결을 관리하는 가장 좋은 방법은 무엇입니까? 각 방법으로 열고 닫으시겠습니까?

위의 내가 EntLib

public DataSet ReturnSomething 
{ 
    var sqlStr = "select something"; 
    DbCommand cmd = db.GetSqlStringCommand(sqlStr); 
    db.AddInParameter(cmd, "@param1", SqlDbType.BigInt, hotelID); 
    db.AddInParameter(cmd, "@param2", SqlDbType.NVarChar, date); 
    return db.ExecuteDataSet(cmd); 

} 사전에

감사를 사용하고 방법의 샘플 방법이다.

답변

2

ExecuteDataSet 메서드는 모든 데이터가 들어있는 DataSet 개체를 반환합니다. 이렇게하면 자신 만의 로컬 복사본을 얻을 수 있습니다. ExecuteDataset을 호출이 연결을 열어 데이터 집합을 채 웁니다, 그리고 더 많은 정보를 원하시면 결과

을 반환하기 전에 연결을 닫습니다 : 나는 당신이 사용 정적 클래스와 같은 뭔가를해야한다고 생각

http://msdn.microsoft.com/en-us/library/ff648933.aspx

+0

DataReader를 가져 오거나 삽입, 삭제, 업데이트하려면 어떻게해야합니까? 연결이 어떻게 처리 될까요? – StrouMfios

0

라이브러리 서브 시스템에 대한 올바른 연결을 제공하는 외관.

public static class SystemFacade { 
    // Used as a subsystem to which the connections are provided. 
    private static readonly SystemFactory _systemFactory = new SystemFactory(); 

    public static IList<Customer> GetCustomers() { 
     using (var connection = OpenConnection(nameOfEntLibNamedConnection)) 
      return _systemFactory.GetCustomers(connection); 
    } 

    public static DbConnection OpenConnection(string connectionName) { 
     var connection = 
      // Read EntLib config and create a new connection here, and assure 
      // it is opened before you return it. 

     if (connection.State == ConnectionState.Closed) 
      connection.Open(); 

     return connection;    
    } 
} 

internal class SystemFactory { 
    internal IList<Customer> GetCustomers(DbConnection connection) { 
     // Place code to get customers here. 
    } 
} 

그리고이 코드를 사용 :이 코드 샘플에서

public class MyPageClass { 
    private void DisplayCustomers() { 
     GridView.DataSource = SystemFacade.GetCustomers(); 
    } 
} 

, 당신은 클래스 라이브러리의 기능과 기능을 제공하는 정적 클래스가 있습니다. Façade 클래스는 사용자에게 가능한 모든 작업을 제공하는 데 사용되지만 연결을 사용하여 두통을 피우고 싶지는 않습니다. 기본 데이터 저장소 밖에있는 고객 목록 만 있으면됩니다. 그런 다음 GetCustomers으로 전화하면됩니다.

Façade는 정보를 가져올 위치를 알고 있으므로 적절하게 연결을 만들고 서브 시스템 공장에서 고객을 주문하는 "인텔리전트"클래스입니다. 공장은 요구되는 것을 수행하고, 더 이상 질문하지 않고 이용 가능한 연결을 취해 고객을 검색합니다.

이 정보가 도움이됩니까?

+0

그래서 내가 읽은 문서가 잘못되어 각 사용을 위해 연결을 닫고 열어야합니다! 도움을 주셔서 감사합니다. Will Marcouiller – StrouMfios

+0

아니요, 수동으로 연결을 관리 할 필요가 없습니다. 블록이 자동으로 연결을 열고 닫을 것입니다. 이 솔루션은 특히 데이터 세트를 사용하는 경우 과도합니다. –

0

예, EntLib은 연결을 닫습니다 (실제로 연결 풀로 다시 연결 해제합니다). 이것이 우리가 원래 EntLib을 사용하기 시작한 주된 이유입니다.

그러나 모든 새로운 개발을 위해 이제 Entity Framework를 사용하여 훨씬 더 생산적입니다.

+0

이 모든 투명성 때문에 걱정이됩니다. 그래서 연결을 열지 않아도됩니다.새로운 "작업"을 수행하면 풀링 (사용 가능한 경우)에서 사용 가능한 연결을 얻거나 새 연결을 엽니 다. 나는 DB에서 sp_who2를 실행하고 수면 상태와 15 개 이상의 연결이 있습니다. 나는이 데이터베이스를 사용하는 유일한 사용자이므로 사용 가능한 연결 수가 너무 많다고 생각합니다. – StrouMfios

+0

예 모두 자동입니다. 코드를 루프에 넣고 1000 번 실행하십시오. 연결의 수가 올라가지 않아야합니다. –

+0

이상한 일이지만 15 개 이상의 연결이 있기 전에 내가 말했던 것처럼 잘못된 것이 있습니다. 그것은 연결을 닫지 않는 것으로 보이며 모든 요구에 따라 새로운 연결을 만듭니다. – StrouMfios

관련 문제