대비. Net PetShop 과 Duwamish 를 통 해 Ado. Net 의 데이터베이스 프로 그래 밍 모델 을 연구 합 니 다.

저자: 노 언
. NET PetShop 과 Duwamish 에 대한 간단 한 소개
유명한 '애 완 동물 가게 대전' 을 들 어 보 셨 을 거 라 고 믿 습 니 다. 맞습니다. 본 고의 주인공 중 하 나 는 바로 승리 자. NET PetShop 입 니 다. 마이크로소프트 는 27 배의 속도 와 1 / 4 의 코드 량 으로 J2EE 기반 의 PetStore 애 완 동물 상점 보다 훨씬 앞 섰 습 니 다.썬 도 이에 대해 불만 을 제기 한 적 이 있다. 이 '대전' 에 수분 이 있다 고 지적 한 적 이 있다. 그러나 어쨌든. NET PetShop 은 전형 적 인. NET 인 스 턴 스 튜 토리 얼 이다. 적어도 J2EE 를 따라 잡 는 '지름길' 을 제공 해 주 었 다.) 다운로드 주 소 는 다음 과 같다.
http://www.gotdotnet.com/team/compare
. NET PetShop 애완동물 온라인 쇼핑 몰 홈 페이지
한편, Duwamish 는 겉 으로 는 간단 하지만 내 부 는 매우 복잡 한 인터넷 서점 의. NET 완전 응용 사례 로 마이크로소프트 공식 Sample 로 서 C \ # 와 VB. NET 두 가지 언어 버 전 을 제공 하고 상세 한 중국어 자 료 를 대량으로 첨부 했다. 만약 에 인쇄 하면 가정 여행 이 고 화장실 에 들 어 갈 때 필요 한 물건 이다.뭐?못 들 어 보 셨 어 요?하하, Visual Studio. NET 을 설치 하면 하 드 디스크 에 가만히 누 워 있 습 니 다. 하지만 아직 설치 되 지 않 았 습 니 다. VS. NET 의 Enterprise Samples 디 렉 터 리 에서 찾 아 설치 할 수 있 습 니 다. 예 를 들 어 C: \ Program Files \ Microsoft Visual Studio. NET \ Enterprise Samples \ \ Duwamish 7.0 CS.
Duwamish 인터넷 전자 서점 홈 페이지
구조 약술
두 상점 모두 n 층 응용 구 조 를 사 용 했 습 니 다. (n 층 구조의 응용 구 조 는 귀하 가. NET 응용 을 개발 하 는 가장 좋 은 선택 이 어야 합 니 다. 웹 카운터 만 하고 싶 더 라 도) 다른 것 은 PetShop 은 가장 흔히 볼 수 있 는 3 층 응용 구 조 를 사 용 했 습 니 다. 각각 표 시 층, 중간 층 과 데이터 층 입 니 다.한편, Duwamish 는 4 층 응용 구 조 를 사용 하고 서로 다른 프로젝트 를 사용 하여 구분 하 는데 각각 표현 층, 업무 외관 층, 업무 규칙 층 과 데이터 층 이다.이 두 가지 구조 가 각각 어떤 장점 과 단점 이 있 는 지, 그리고 왜 이렇게 층 을 나 누 어야 하 는 지 에 대해 우 리 는 상세 하 게 토론 하지 않 는 다. 왜냐하면 본 고의 중점 은 여기에 있 지 않 기 때문이다.우리 가 주로 분석 하 는 것 은 그들의 데이터베이스 프로 그래 밍 모델 이다.
Duwamish 데이터 액세스 분석
먼저, Duwamish 서점 을 살 펴 보 겠 습 니 다. DataAdapter 와 DataSet 이 결 합 된 데이터 저장 모델 을 사용 합 니 다. 다른 것 은 DataSet 에 대해 서브 클래스 화 확장 을 데이터 캐리어 로 하 는 것 입 니 다. 즉, 맞 춤 형 DataSet 으로 층 간 의 데이터 전송 을 하 는 것 입 니 다. 다음은 맞 춤 형 DataSet 예제 입 니 다.
public class BookData : DataSet
{
  public BookData()
  {
        //
        // Create the tables in the dataset
        //
        BuildDataTables();
  }
  private void BuildDataTables()
  {
        //
        // Create the Books table
        //
        DataTable table   = new DataTable(BOOKS_TABLE);
        DataColumnCollection columns = table.Columns;
        
        columns.Add(PKID_FIELD, typeof(System.Int32));
        columns.Add(TYPE_ID_FIELD, typeof(System.Int32));
        columns.Add(PUBLISHER_ID_FIELD, typeof(System.Int32));
        columns.Add(PUBLICATION_YEAR_FIELD, typeof(System.Int16));
        columns.Add(ISBN_FIELD, typeof(System.String));
        columns.Add(IMAGE_FILE_SPEC_FIELD, typeof(System.String));
        columns.Add(TITLE_FIELD, typeof(System.String));
        columns.Add(DESCRIPTION_FIELD, typeof(System.String));
        columns.Add(UNIT_PRICE_FIELD, typeof(System.Decimal));
        columns.Add(UNIT_COST_FIELD, typeof(System.Decimal));
        columns.Add(ITEM_TYPE_FIELD, typeof(System.String));
        columns.Add(PUBLISHER_NAME_FIELD, typeof(System.String));

        this.Tables.Add(table);
  }
 ………
}


우 리 는 그것 이 BuildDataTables 방법 이 있 고 구조 함수 에서 호출 되 는 것 을 볼 수 있 습 니 다. 그러면 맞 춤 형 Books 표 는 이 DataSet 과 한데 묶 여 있 습 니 다. 나중에 Column Mapping 을 하지 않도록 하 는 것 이 좋 은 생각 입 니 다. 저 는 왜 생각 하지 못 했 습 니까?:)
데이터 구 조 를 해결 한 다음 에 데이터 층 의 코드 실현 을 살 펴 보 겠 습 니 다. Duwamish 에서 데이터 층 에는 5 가지 유형 이 있 는데 그것 이 바로 Books, Categories, Customers 와 Orders 입 니 다. 각 유형 은 데이터 에 대한 액세스 만 담당 합 니 다.다음은 그 중의 한 가지 예시 코드 입 니 다.
private SqlDataAdapter dsCommand;
public BookData GetBookById(int bookId)
{
    return FillBookData("GetBookById", "@BookId", bookId.ToString());
}
private BookData FillBookData(String commandText, String paramName, String paramValue)
{
    if (dsCommand == null )
    {
        throw new System.ObjectDisposedException( GetType().FullName );
    }            
    BookData   data    = new BookData();
    SqlCommand command = dsCommand.SelectCommand;

    command.CommandText = commandText;
    command.CommandType = CommandType.StoredProcedure; // use stored proc for perf
    SqlParameter param = new SqlParameter(paramName, SqlDbType.NVarChar, 255);
    param.Value = paramValue;
    command.Parameters.Add(param);            

    dsCommand.Fill(data);
    return data;
}


여기 가 바로 데이터 계층 의 코드 입 니 다. Duwamish 는 DataAdapter 를 사용 하여 맞 춤 형 DataSet 에 데 이 터 를 채 우 고 이 DataSet 로 돌아 가 는 것 을 볼 수 있 습 니 다.저 는 이상 하 게 도 데이터 액세스 층 에서 GetBookById 와 같은 구체 적 인 데이터 액세스 방법 을 볼 수 있 습 니 다. 마지막 으로 추상 적 인 FillBookData 방법 이 있 지만 위 에 3 층 이 있 습 니 다. 밑 에 이렇게 까지 했 습 니 다. 그러면 윗 층 은 무엇 을 합 니까?답 은 데이터 검사 입 니 다. 상부 에서 대체적으로 엄밀 한 데이터 합 법성 검 사 를 하고 있 습 니 다. (물론 복잡 한 사무 논리 도 포함 되 지만 많 지 않 습 니 다) 예시 코드 는 다음 과 같 습 니 다.
public CustomerData GetCustomerByEmail(String emailAddress, String password)
{
    //
    // Check preconditions
    //
    ApplicationAssert.CheckCondition(emailAddress != String.Empty, "Email address is required",
   ApplicationAssert.LineNumber);
    ApplicationAssert.CheckCondition(password != String.Empty, "Password is required", 
   ApplicationAssert.LineNumber);
    //
    // Get the customer dataSet
    //
    CustomerData dataSet;
    using (DataAccess.Customers customersDataAccess = new DataAccess.Customers())
    {
 dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);
    }
    //    
    // Verify the customer's password
    //
    DataRowCollection rows = dataSet.Tables[CustomerData.CUSTOMERS_TABLE].Rows;
 
    if ( ( rows.Count == 1 ) && rows[0][CustomerData.PASSWORD_FIELD].Equals(password) )
    {
        return dataSet;
    }
    else
    {        
 return null;
    }
} 


이 방법 에서 진정 으로 데이터 접근 을 하 는 것 은 사실상
dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);

이 한 마디 는 직접 호출 된 데이터 층 이다.다른 것 은 모두 합 법성 검 사 를 하고 있 기 때문에 우 리 는 진정한 기업 급 개발 을 위해 고려 해 야 할 시스템 의 건장 성 이 얼마나 중요 한 지 깨 달 을 수 있다.
. NET PetShop 데이터 액세스 분석
OK, Duwamish 가 다 봤 습 니 다. 다음은 PetShop 의 데이터 접근 체 제 를 살 펴 보 겠 습 니 다.
PetShop 은 하나의 항목 만 있 습 니 다. 중간 층 과 데이터 층 을 모두 cs 파일 로 작성 하여 Components 디 렉 터 리 에 두 는 것 입 니 다. 그 중에서 데이터 층 은 Database 라 는 클래스 로 데이터 베 이 스 를 위 한 모든 바 텀 작업 을 밀봉 합 니 다.다음은 예제 코드 세그먼트 입 니 다.
public void RunProc(string procName, out SqlDataReader dataReader) 
{
 SqlCommand cmd = CreateCommand(procName, null);
 dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}


우 리 는 Duwamish 와 전혀 다른 데이터 접근 방식 을 보 았 습 니 다. 모든 데이터 접근 방법 을 추상 화하 여 RunProc 방법 으로 만 들 었 습 니 다. 데 이 터 를 되 돌려 주 는 것 은 어 떻 습 니까? 하하, 게 으 름 을 피 우 고 DataReader 로 돌아 가 직접 읽 어 보 세 요.Duwamish 가 사용 하 는 층 간 데이터 전송 캐리어 가 무엇 인지 기억 하 십 니까?참, DataSet 입 니 다. 데이터 층 에 채 워 져 중간 층 으로 되 돌 아 왔 습 니 다.그러나 여기 서 데이터 층 과 전송 층 의 데이터 전송 캐리어 는 DataReader 로 바 뀌 었 습 니 다. 실제로 데이터 캐리어 라 고 할 수 없습니다. 데이터 가 아직 읽 기 시작 하지 않 았 기 때 문 입 니 다. 여기 서 DataReader 의 역할 과 지침 이 약간 유사 합 니 다. 아마도 우 리 는 이 를 '데이터 참조' 라 고 불 러 야 할 것 입 니 다.)
이어서 아래 를 보면 DataReader 가 어떻게 '처리' 되 었 는 지 알 수 있 습 니 다.
public ProductResults[] GetList(string catid, int currentPage, int pageSize, ref int numResults) 
{
 numResults = 0;
 int index=0;
 SqlDataReader reader = GetList(catid);
 ProductResults[] results = new ProductResults[pageSize];
 
 // now loop through the list and pull out items of the specified page
 int start = (int)((currentPage - 1) * pageSize);
 if (start <= 0) start = 1;

 // skip 
 for (int i = 0; i < start - 1; i++) {
  if (reader.Read()) numResults++;
 }
 if (start > 1) reader.Read();

 // read the data we are interested in
 while (reader.Read()) {
  if (index < pageSize) {
   results[index] = new ProductResults();
   results[index].productid = reader.GetString(0);
   results[index].name =  reader.GetString(1);
   index++;
  }
  numResults++;   
 }

 reader.Close();

 // see if need to redim array
 if (index == pageSize)
  return results;
 else {
  // not a full page, redim array
  ProductResults[] results2 = new ProductResults[index];
  Array.Copy(results, results2, index);
  return results2;
 }    
}

currentPage 와 page Size 를 알 아 보 셨 나 요?원래 여기 서 데이터 페이지 를 나 누 었 습 니 다. 수 요 를 만족 시 키 는 최소한 의 데이터 양 만 되 돌려 주 었 습 니 다. 게 으 름 피 우 는 것 을 좋아 하 는 많은 사람들 처럼 DataTable 전 체 를 DataGrid 에 간단하게 연결 하여 대량의 데 이 터 를 번 거 롭 게 만 들 었 습 니 다.
여기 서 데 이 터 는 진정 으로 읽 히 고 사용자 정의 대상 배열 에 수 동 으로 채 워 집 니 다. 이 배열 의 정 의 를 살 펴 보 겠 습 니 다.
public class ProductResults 
{
 private string m_productid;
 private string m_name;

 // product props
 public string productid {
  get { return m_productid; }
  set { m_productid = value; }  
 }

 public string name {
  get { return m_name; }
  set { m_name = value; }  
 }
}

아주 간단 합 니 다. 그런데 저 는 좀 이상 합 니 다. 왜 struct 를 사용 하지 않 습 니까?. NET 에서 struct 와 class 의 성능 차 이 는 무시 할 수 있 습 니까?
분석 총화
이 두 상점 의 구체 적 인 실현 을 관찰 한 결과 우 리 는 두 개의 서로 다른 데이터 액세스 모델 을 얻 었 다. Duwamish 는 DataSet 을 핵심 으로 한다. DataSet 은 이 방면 의 대량의 관련 방법 을 제 공 했 기 때문에 전체 응용 데이터 전송, 데이터 형식 정의, 수량 검증 은 모두 DataSet 을 중심 으로 진행 되 고 전체 구조 정의 가 매우 뚜렷 하고 엄밀 하 다.하지만 좀 커 보인다.PetShop 은 전체 프로그램 에서 DataSet 을 사용 하지 않 았 습 니 다. 프로그램 이 매우 간결 하고 가 볍 지만 Duwamish 만큼 건장 하지 않 습 니 다.이 두 프로그램 은 마이크로소프트 의 서로 다른 그룹 이 쓴 코드 이기 때문에 서로 다른 스타일 을 가지 고 있다.하지만. NET 의 표준 모델 을 대표 할 수 있어 야 합 니 다.이 를 보면 글 의 첫머리 에 제 기 된 의문 들 에 대해 비교적 이미지 있 는 인식 을 가 져 야 한다.
또한 PetShop 은 데이터 연결 을 연 후 바로 데 이 터 를 읽 지 않 고 데이터 리 더 를 다른 대상 에 게 전달 해 데이터 읽 기 동작 을 수행 한 다음 연결 을 닫 는 것 을 다시 한번 주의 하 십시오.이렇게 하면 데이터 연결 시간 이 길 어 지고 데이터 베 이 스 를 연결 하 는 것 은 매우 귀중 한 서버 자원 이다. 이에 비해 Dawamish 는 데이터 베 이 스 를 연결 한 후에 바로 채 운 다음 에 데이터 베 이 스 를 신속하게 방출 하 는 방식 은 대량의 사용자 들 의 동시 방문 에 더욱 유리 하 다.
또한, 위의 프로그램 에서 업데이트 작업 이 언급 되 지 않 았 습 니 다. PetShop 은 Command 대상 이 하나의 저장 과정 을 수행 하 는 방식 으로 업데이트 작업 을 하 는 것 으로 온라인 실시 간 데이터 업데이트 모드 에 속 합 니 다.한편, Dawamish 는 DataAdapter 의 업데이트 방법 을 사용 하여 DataSet 의 변 화 를 데이터베이스 에 한꺼번에 제출 하 는 오프라인 데이터 업데이트 모드 에 속 합 니 다.이런 모델 의 장점 은 대량의 데 이 터 를 한꺼번에 업데이트 하여 데이터 뱅 크 의 연결 횟수 를 줄 일 수 있다 는 것 이다.단점 은 데이터 베 이 스 를 매우 자주 바 꾸 는 상황 에서 실시 간 으로 데이터 변 화 를 추적 해 야 한다 면 적절 하지 않다 는 것 이다.구체 적 인 상황 에 따라 구체 적 인 데이터 업데이트 방법 을 채택 해 야 한다.
전체적으로 데 이 터 를 빠르게 읽 고 표시 하기 만 한다 면 DataReader 를 사용 하 는 것 을 추천 합 니 다. 데 이 터 를 대량으로 수정 해 야 하고 동시 방문 할 가능성 이 있 으 며 실시 간 으로 데이터 베 이 스 를 추적 하지 않 아 도 됩 니 다. DataSet 을 사용 하 는 것 을 추천 합 니 다.물론 이 두 가지 상황 은 극단 적 입 니 다. 실제 응용 환경 은 복잡 한 조건 이 있 을 수 있 습 니 다. 구체 적 으로 는 당신 이 시 세 를 잘 살 피고 종합 적 으로 사용 해 야 합 니 다. 하지만 저 는 개인 적 으로 PetShop 의 가 벼 운 스타일 을 좋아 합 니 다.)
본 고 는 상기 두 가지 전형 적 인. NET 응용 루틴 의 데이터 방문 체제 에 대해 간단 한 추적 분석 을 시도 하고 자 합 니 다. 만약 에 이 사례 에 대해 다른 연 구 를 하거나 본 화제 에 대해 더욱 깊이 연구 할 수 있 는 친구 가 있 으 면 제 이메일 로 보 내 주세요.
감사합니다.

좋은 웹페이지 즐겨찾기