2011-01-25 2 views
2
cn = new SqlConnection(
     ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()); 
cn.Open(); 

이 코드는 콘텐츠 페이지와 마스터 페이지가 있다고 가정해야합니다.ASP.net 모범 사례 - 어디에서 데이터베이스에 연결합니까?

마스터 페이지 Page_Init에 넣어야합니까? 그런 다음 내 콘텐츠 페이지의 모든 실행 단계에서 완벽하게 액세스 할 수 있습니까?

나는 고전적인 ASP 사용 해요, 그래서 보통 할 것 :

Declare variables 

Open connection 

process code 

Close connection 

Render HTML 

을하지만 .NET의 페이지 수명주기의 단계가 많이있다 그래서이를 배치하는 것이 가장 좋습니다 어디 궁금 암호?

그리고이 연결을 닫아야합니까, 아니면 쓰레기 처리가 저를 돌볼 것입니까?

답변

6

id는 DataBrowind 파일에서 데이터베이스 연결을 제거 할 수 있도록 DataAccess Layer를 만듭니다. 내 웹 응용 프로그램은 Dal을 참조하고 Dal 연결을 프론트 엔드에서 허용하는 public 메서드를 노출합니다.

Dal 연결을 열고 닫는 측면에서 - using 문으로 묶음 - 연결 열기 및 닫기를 처리합니다. 필요한 경우. 이에

자세한 내용은 여기에서 찾을 수 있습니다 - 당신은 당신의 데이터베이스에서 데이터를 필요로 할 때 당신은 그것을 사용한다 http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

위의 답변과 그 URL은 매우 유용합니다. 나는 그것을 사용하기에 좋은 이유를 "사용"할 것입니다! – webdad3

1

.

DAL 레이어를 만들지 않은 경우 page_load 또는 onClick 이벤트와 같은 이벤트를 넣으십시오. 페이지에서 연결을 열기 위해 연결을 열지 않아야합니다. 닷넷에서 연결

SqlConnection conn = null 
try 
{ 
    conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString); 
    conn.Open() 

    // do something with the connection 
} 
catch(Exception ex) 
{ 
    //log error 
} 
finally 
{ 
    // clean up connection 
    if(conn!=null) 
    { 
     //check if connetion is open, if it is close it/dispose   
    } 

} 
2

을 여는 코드의

조각은 당신이 사용하는 구조에 따라 달라집니다. SqlConnection 개체를 사용하여 명시 적으로 연결하는 경우 연결을 직접 관리해야합니다. 데이터 세트 tableadapter 객체 또는 DataContext 객체를 LINQ (내 개인적인 추천)와 함께 사용하는 경우 일반적으로 연결이 관리되지만 객체를 올바르게 사용하기 위해 using 블록 내에 객체를 묶어야합니다.

우리 팀은 데이터를 검색하기 위해 모든 연결 기반 개체의 지연로드를 처리하는 공통 데이터 클래스에 IDisposable을 구현하는 범용 데이터 관리자를 구축하는 것이 가장 좋습니다. 이렇게하면 데이터 관리자의 dispose 이벤트 내에서 모든 연결을 닫아서 깨끗하게 유지할 수 있습니다.

편집 : 난 항상 오클라호마 시작

. 다음은

http://krisvandermotten.wordpress.com/2006/11/30/creating-a-data-access-layer-with-linq-to-sql-part-2/

101 LINQ Samples

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx


내 표준 BaseDataManager의 조각의 코드 샘플입니다. 나는 오래 전에 인터페이스를 만들었어야했는데, 추상적 인 비트는 다른 팀 멤버들에게 상당히 잘 채택 될 것으로 보인다.나는이 코드를 무보증으로 게시하지만, 그것은 나를 위해 일하고 내 연결 풀을 훌륭하고 깨끗하게 유지한다. 그리고 우리는 데이터베이스에 저장된 문서 정보에 대해 많은 데이터를 가져온다. 나는 간단하게 유지하기 위해 다른 기본 방법의 무리를 잘라, 어떤 아래 것은 직접 질문에 대한 대답 부분이다

[Serializable()] 
public abstract class BaseDataManager : IDisposable 
{ 

    private bool _disposedValue = false; 
    private SqlConnection _connectionObject = null; 

    public BaseDataManager() 
    { 

    } 

    public BaseDataManager(string connectionString) 
    { 
     this.SqlConnectionString = connectionString; 
    } 

    public BaseDataManager(string connectionString, string username, string password) 
    { 
     if (!connectionString.EndsWith(";")) connectionString += ";"; 
     this.SqlConnectionString += "User ID=" + username + ";password=" + password; 
    } 

    public string SqlConnectionString 
    { 
     get; 
     set; 
    } 

    public virtual SqlConnection Connection 
    { 
     get 
     { 
      if (_connectionObject == null && !String.IsNullOrEmpty(this.SqlConnectionString)) 
       _connectionObject = new SqlConnection(this.SqlConnectionString); 
      return _connectionObject; 
     } 
     set 
     { 
      _connectionObject = value; 
     } 
    } 

    #region IDisposable Support 
    /// <summary> 
    /// (Protected) Method that performs actual cleanup on dispose. This interface 
    /// has been implemented to clean up data connections that are left stranded 
    /// when the class is disposed while the connection possibly remains open in 
    /// the connection pool. This opportunity is also used to free up the private 
    /// variables of the class. 
    /// </summary> 
    /// <param name="disposing">Used for explicitly calling Dispose</param> 
    protected virtual void Dispose(bool disposing) 
    { 
     if (!_disposedValue) 
     { 
      if (disposing) 
      { 
       //--------------------------------------------------------------------------------------------- 
       // Close the connection object prior to setting it to nothing 
       //--------------------------------------------------------------------------------------------- 
       if (_connectionObject != null) _connectionObject.Close(); 
       _connectionObject = null; 
      } 

      _disposedValue = true; 
     } 
    } 

    /// <summary> 
    /// (Public) Method that implements IDisposable. This code is autogenerated 
    /// the implementation interface in the VS IDE. Do not change this code. 
    /// </summary> 
    public void Dispose() 
    { 
     // Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
    #endregion 

} 
+0

이 답변을 주셔서 감사합니다. 간단한 예제가 있습니까? 나는 웹 사이트의 기초를 쓰고 있으며 가능한 한 정확하게 설계되도록하고 싶다. –

+0

@Tom Gullen - 어떤 데이터베이스 연결 방법을 사용하고 있습니까? 아니면 여전히 미정인가요? –

+0

내 앞에서 미정.net 프로젝트 내 질문에 표시된 것처럼 연결 init 페이지를 사용하는 것이지만이 DAL 레이어가 좋아 보이는 지금 읽고,이 옵션에 대한 것이 좋습니다 것이 좋습니다? –

2

나는 당신이 관련 클래스를 노출하는 별도의 클래스 라이브러리 프로젝트를 만드는 것이 좋습니다 귀하의 데이터베이스에 귀하의 테이블. 그런 다음 해당 프로젝트에 대한 참조를 넣고 떠나십시오. 연결 열기/닫기를 단순화하기 위해 클래스 작성 등 Subsonic을 살펴보고 모든 테이블을 매핑 한 다음 코드 숨김에서 이와 같은 작업을 수행 할 수 있습니다.

Product prod = Product.Find(3); 
prod.Name = "iPhone"; 
prod.Save(); 
1

규칙의 첫 번째 엄지 손가락은 ASP.NET 세부 정보 /보기에서 도메인 계층을 분리합니다.

많은 사람들이 페이지 계층/계층 구조 관련 코드가 블렌딩되지 않도록 도메인 계층에 대한 클래스 라이브러리를 만듭니다.

그래서 User, Comment 등과 같은 클래스가있는 도메인 계층을 가질 수 있습니다. 이러한 클래스는 데이터베이스와 통신합니다. 일반적으로 모든 데이터베이스 상호 작용이 발생하는 DbUser 클래스가 있고 DbUser는 DbQuery를 상속하여 연결을 만듭니다. 그런 식으로 데이터베이스 상호 작용 코드를 Db {ClassName} 클래스와 DbQuery에 완벽하게 유지할 수 있습니다. 코드를 실제로 정리하고 싶다면 정말 도움이됩니다.

간단한 시나리오 : 특정 사용자의 프로필을 보려면 페이지 요청을 받았을 때 간단히 User.GetUser(id);을 입력합니다. 여기서 id는 사용자의 사용자 ID입니다. User 클래스에는 정적 메서드 GetUser가 있습니다. GetUser는 DbUser의 새 인스턴스를 만들고 getUser 메서드를 호출합니다. DbUser 내의 getUser 메소드는 데이터베이스에 대한 연결 및 쿼리를 작성한 다음 User 및 Voila의 인스턴스를 리턴합니다.

내 대답이 올바른 방향으로 도움이되기를 바랍니다. 주제가 조금 다를 수 있습니다.

업데이트 : 도메인 계층을 웹 사이트에서 분리하면 같은 데이터베이스와 상호 작용하는 다른 프로젝트에 클래스 라이브러리를 다시 사용하는 등 더 많은 옵션이 제공됩니다.

3

데이터 액세스 레이어에도 사용할 것이지만보다 직접적으로 질문에 대답하기 위해 여기 ASP.NET에서 트랜잭션을 처리하는 방법을 설명합니다.

  1. 무시 OnPreInit : 연결을 초기화을 열고 시작 새로운 트랜잭션
  2. 무시도 OnUnload :/롤백 트랜잭션 밀접한 관계를 저지
  3. 재정의 폐기 : 모두 연결 및 트랜잭션

I 처분 또한 뭔가 잘못되었을 때 트랜잭션 롤백을 요청하는 데 사용되는 VoteRollback() 메서드를 추가합니다. 페이지 실행이 계속됩니다 (코드를 통해 문제를 처리해야 함)하지만 페이지가 언로드되면 트랜잭션이 롤백됩니다.