2009-06-10 3 views
0

저는 클라이언트가 특정 데이터 소스에서 데이터를 가져 오는 데 사용할 수있는 클래스를 생성해야합니다. 예를 들어, 메인 루틴 내가 데이터 액세스 응용 프로그램 블록이 작업을 수행 알고열려있는 DataReaders를 어떻게 추적해야합니까?

IDataReader GetDataReader(DbCommand command); 
DataSet GetDataSet(DbCommand command); 

될 것입니다하지만 난 내가 설명하지 않습니다 이유로 응용 프로그램 블록을 사용할 수 없습니다. 어쨌든, 나는 약간의 논리를 빌릴 계획이다.

그러나 내 작업의 또 다른 부분은 개방형 DataReaders를 추적하는 것입니다. 이는 모든 사람이 독자를 제대로 닫고 있는지 확인하기 위해서입니다. 내 계획은 GetDataReader 루틴이 호출 될 때마다 추가되는 DataReaders 컬렉션을이 새 클래스 안에 포함하는 것입니다. 앱 실행이 끝나면 코드는이 컬렉션을 거치며 경고가 아직 열려있는 각 리더의 파일에 기록됩니다.

그래서, 나는이 개 질문이 :

  1. 이 디자인 본질적 문제가 있나요?
  2. 어쨌든 DataReader에서 SQL 명령을 실행할 수 있습니까? 이렇게하면 닫히지 않은 독자 검색을 크게 단순화 할 수 있습니다. 또는이 정보를 얻기 위해 리더/명령 쌍을 저장해야합니까?
+0

중복 : http://stackoverflow.com/questions/941126/how-to-manage-sqldatareaders-in-a-data-access-layer – scottm

답변

2

데이터 액세스 구성 요소를 규칙을 적용하기 위해 조금 더 고차원으로 만들었습니까? 예를 들어, get-in-get-your-data-and-get-out-and-close 정책을 시행하기 위해 데이터 액세스 구성 요소의 데이터 세트와 스케일러 만 반환합니다 (저장 프로 시저 만 사용하는 등의 다른 규칙도 적용합니다). 데이터베이스와 상호 작용). 발신자가 실제로 데이터 만 필요로하고 데이터 판독기가 필요한 경우가 아니라면 리더에서 데이터를 읽은 다음 닫아서 리더 상태를 추적 할 필요가 없습니다.

원시 판독기를 반환하지 않고 DataReader를 반환하기위한 기술 요구 사항이있는 경우 (아마도 많은 경우) 아마도 래퍼 클래스 또는 판독기의 하위 클래스를 만들고 대신 반환 할 수 있습니다. 예 TrackedDataReader. 그런 다음 책에서 클래스 자체를 유지하면서 만들 수 있습니다. 그냥 생각.

+0

우리는 DataReader와 DataSets를 모두 가져올 수있는 유연성이 필요합니다. TrackedDataReader가 의미하는 바를 잘 모르겠다. 주어진 독자들의 모임은 책을 지키는 것입니다. 나는 우리가 똑같은 말을하고 있다고 생각한다. – bsh152s

관련 문제