asp.net2.0의 ObjectDataSource를 사용하면 GridView와 같은 데이터 표시 컨트롤을 표시 및 편집을 위해 바인딩할 수 있습니다. 또한 내장된 페이징, 정렬 등도 지원합니다. ORM을 사용한 후에 ObjectDataSource를 사용할 수도 있습니다.
여기서 페이징은 더 이상 데이터베이스에서 모든 페이지를 꺼내어 선택적으로 바인딩하는 것이 아니라, 데이터베이스에서 직접 페이지를 꺼내어 바인딩하는 것입니다. 그 차이는 여전히 크며 효율성도 크게 향상되었습니다.
편집, 생성 및 정렬은 모두 ObjectDataSource에서 직접 제공되므로 GridView에서 코드를 작성할 필요가 없습니다.
이런 식으로 객체 디자인에는 적어도 데이터베이스 작업에 대한 많은 논리가 포함될 수 있으며 UI는 비교적 단순해 보일 것입니다. 떼어내고 조금 열어보면 이식하는 것이 승리하는 데 더 유리할 것입니다. 미래에 또는 SmartClient로 만들 수 있습니다.
여기에 더 나은 내용을 설명하는 블로그가 있습니다 (http://www.evosoftworks.com/Articles/wormods.aspx) .
저는 우연히 WilsonORM을 사용하고 있었기 때문에 그에 맞게 하나 만들었습니다.
기본 구조는 다음과 같습니다.
UI(GridView 및 기타 컨트롤--ObjectDataSource 컨트롤)---->ObjectDataSource 클래스(객체, CRUD 페이징 및 기타 로직 작성)--->(ORM은 CRUD를 구현함)--->DB에는
몇 가지 주요 단계가 있습니다.
1: CRUD, 페이징 및 기타 논리를 완성하기 위해 개체에 속성과 메서드를 추가합니다.
2: ObjectDataSource 컨트롤에 연결하도록 GridView와 같은 UI 컨트롤을 구성합니다.
먼저 첫 번째부터 살펴보겠습니다.
1: CRUD, 페이징 및 기타 논리를 완료하려면 개체에 속성과 메서드를 추가합니다. Object 클래스는 DB 구조를 기반으로 Tool에 의해 생성되며, Mapping 파일도 생성됩니다.
먼저 System.ComponentModel 네임스페이스 [DataObject()]의 개체에 식별 속성 DataObject()를 추가합니다.
공개 클래스 제품 설명
{둘째, 이 개체 클래스에 CRUD 메서드를 추가합니다.
먼저 Insert 메서드를 살펴보겠습니다.
[DataObjectMethod(DataObjectMethodType.Insert)]
공개 정적 무효 삽입(제품 설명 제품 설명)
{
노력하다
{
Manager.DataManager.StartTracking(productDescription, InitialState.Inserted);
Manager.DataManager.PersistChanges(productDescription);
}
잡기 (예외예외)
{
log.Error(ex);
}
} 이 메서드 앞에는 이것이 Insert 메서드임을 나타내는 [DataObjectMethod(DataObjectMethodType.Insert)] 특성이 와야 합니다.
이 메서드는 정적 공용 메서드입니다.
매개변수는 객체 자체의 인스턴스입니다. 논리가 이해하기 쉽고 모두 Object에서 작동하기 때문에 이것이 더 좋습니다.
나머지 삭제 및 업데이트 메서드도 이러한 방식으로 작성됩니다.
그런 다음 매우 특별한 Select 메서드를 살펴보세요.
방법 선택
1 [DataObjectMethod(DataObjectMethodType.Select)]
2 public Collection<ProductDescription> Retrieve(문자열 쿼리, int maxRows, int startRowIndex, 문자열 sortClause)
3 {
4번 시도
5 {
6 int numPages = 0;
7 if (sortClause == null || sortClause == "")
8 sortClause = "수정된 날짜 설명";
9 컬렉션<제품 설명> cs;
10 cs = RetrievePage(query, sortClause, maxRows, (int)Math.Ceiling((double)startRowIndex / maxRows) + 1, out numPages);
11 _numRecs = ((IObjectPage)cs).TotalCount;
12개의 반환 CS;
13}
14 캐치 (예외예외)
15 {
16 로그.Error(ex);
17 null을 반환합니다.
18}
19}
20 [DataObjectMethod(DataObjectMethodType.Select)]
21 정적 공개 ObjectSet 검색(문자열 키, 문자열 값)
스물 둘 {
23 if (값 == null || 값 == "")
24 null을 반환합니다.
25번 시도
26 {
27 QueryHelper 도우미 = Manager.DataManager.QueryHelper;
28 키 = helper.GetFieldName(typeof(ProductDescription).ToString() + "." + Key);
29 ObjectQuery 쿼리 = new ObjectQuery(typeof(ProductDescription), String.Format("{0}='{1}'", Key, Value), "");
30 ObjectSet obj = Manager.DataManager.GetObjectSet(query);
31 반환 개체;
32}
33 캐치 (예외예외)
34 {
35 로그.오류(예);
36 null을 반환합니다.
37 }
38 }
39
40 공개 int RecCount(문자열 쿼리, int maxRows, int startRowIndex, 문자열 sortClause)
41 {
42 _numRecs를 반환합니다.
43}
44
45 public static Collection<ProductDescription> RetrievePage(string whereClause, string sortClause, int pageSize, int pageIndex, out int pageCount)
46 {
47 ObjectQuery<ProductDescription> 쿼리 = new ObjectQuery<ProductDescription>(whereClause, sortClause, pageSize, pageIndex);
48 ObjectSet<제품 설명> pageSet = Manager.DataManager.GetObjectSet<제품 설명>(쿼리);
49 페이지카운트 = 페이지세트.페이지카운트;
50 반환 페이지 집합;
51 } 첫 번째 메소드는 내장된 페이징 및 정렬을 구현할 수 있는 메소드인 public Collection<ProductDescription> Retrieve(string query, int maxRows, int startRowIndex, string sortClause)입니다. 이 코드는 _numRecs = ((IObjectPage)cs).TotalCount; 여기서 페이징 후 총 페이지 수를 즉시 가져옵니다. 이는 해당 페이지 번호를 표시하는 데 사용됩니다. public int RecCount( 문자열 쿼리, int maxRows, int startRowIndex, string sortClause)는 레코드 수를 검색하는 데 사용됩니다. 이 두 메소드는 일치해야 하며 매개변수는 동일합니다.
두 번째 방법인 static public ObjectSet Retrieve(string Key, string Value)는 단순히 레코드를 검색합니다. DetailView/FormView 표시에 사용할 수 있습니다.
코드가 많아 보이지만 실제로는 매우 패턴화되어 있으므로 수동으로 코드를 작성하지 않고도 CodeSmith를 사용하거나 ORMHelper 도구를 직접 수정하여 동적으로 생성할 수 있습니다.
이 네 가지 방법으로 CRUD, 페이징, 정렬이 완료됩니다. 이러한 개체는 UI와 관련이 없고 데이터 논리에만 관련이 있습니다.
2: UI 구성. UI 구성은 GridView 및 기타 디스플레이 컨트롤의 두 가지 레이어로 나뉩니다.
이제 GridView와 같은 컨트롤에 대한 개체 데이터 소스를 구성하고 개체에 직접 연결하여 표시, 편집 등의 기능을 구현합니다. 실제로는 ObjectDataSource에 연결된 속성을 설정하는 것입니다.
<asp:GridView ID="gv_data" runat="서버" AllowPaging="True" AllowSorting="True" DataSourceID="ods_list"
이는 ObjectDataSource 컨트롤의 구성입니다.
객체데이터소스
1<asp:ObjectDataSource ID="ods_list" runat="server" DataObjectTypeName="BusinessModel.ProductDescription"
2 DeleteMethod="삭제" OldValuesParameterFormatString="original_{0}" SelectMethod="검색"
3 TypeName="BusinessModel.ProductDescription" UpdateMethod="업데이트" SortParameterName="sortClause"
4 MaximumRowsParameterName="maxRows" SelectCountMethod="RecCount" EnablePaging="true"
5 충돌 감지="변경 사항 덮어쓰기" ConvertNullToDBNull="false">
6 <매개변수 선택>
7 <asp:Parameter Name="query" Type="String" />
8 <asp:Parameter Name="maxRows" Type="Int32" />
9 <asp:Parameter Name="startRowIndex" Type="Int32" />
10 <asp:Parameter Name="sortClause" Type="String" />
11 </SelectParameters>
12</asp:ObjectDataSource>
CRUD 메소드를 구성하기 위한 매개변수인 속성과 해당 메소드 이름을 살펴보세요. 이것이 바로 우리가 클래스에서 구현하는 것입니다. 예를 들어, 삭제 메소드는 여기에서 구성됩니다: DeleteMethod="Delete"; 방금 언급한 레코드 수의 속성은 다음과 같습니다: SelectCountMethod="RecCount";
여기에 매개변수를 전달하는 방법은 무엇입니까? 시스템 관련 속성(예: maxRows, startRowIndex 등)은 코드로 전달될 수도 있습니다. this.ods_list.SelectParameters["query"].DefaultValue = query