annotate Tools/DocGen/Content/Doc/DataAccess/Introduction.htm @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 <% title # Introduction to abstract data accessors %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 <% order # 1 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 <h4>Introduction</h4>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 Before we start talking about the data accessors, let us create a few examples of
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 typical data accessor methods.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 The following table contains three stored procedures and
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 three data access methods implementing the stored procedure calls.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 <table width='100%'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 <tr><th>Stored procedure</th><th>Data access method</th></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 <tr><td colspan=2 style='padding-top:7px'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 The first stored procedure takes filter and page parameters and returns recordset from the Person table.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 </td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 <tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 <td width=50% height=100%><% sql #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 CREATE Procedure GetPersonListByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 @firstName varchar(50),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 @lastName varchar(50),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 @pageNumber int,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 @pageSize int)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 AS
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 -- stored procedure implementation
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 --
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 %></td>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 <td width=50%><% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 public List<Person> GetPersonListByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 string firstName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 string lastName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 int pageNumber,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 int pageSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 // method implementation.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 %></td>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 </tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 <tr><td colspan=2>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 Second example will return single <b>Person</b> record by <b>id</b>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 </td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 <tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 <td width=50% height=100%><% sql #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 CREATE Procedure GetPersonByID(@id int)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 AS
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 -- stored procedure implementation
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 --
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 </td>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 <td width=50%><% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 public Person GetPersonByID(int id)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 // method implementation.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 %></td>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 </tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 <tr><td colspan=2>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 The last example will delete a record from the database by <b>id</b>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 </td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 <tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 <td width=50% height=100%><% sql #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 CREATE Procedure DeletePersonByID(@id int)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 AS
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 -- stored procedure implementation
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 --
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 %></td>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 <td width=50%><% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 public void DeletePersonByID(int id)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 // method implementation.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 %></td>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 </tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 </table>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 <p class='j'>Now lets see what we can say if we compare the stored procedure and C# method signatures.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 <ol>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 <li>Stored procedure and method names match up.</li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 <li>Sequential order, method parameter types and names correspond to stored procedure parameters.</li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 <li>Methods' return values can give us an idea what <b>Execute</b> method we
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 should utilize and what object type has to be used to map data from recordset if needed.</li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 </ol>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 As demonstrated above method definition contains all the information we need
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 to implement the method body. Actually, by defining the method signatures, we
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 completed the most intelligent part of data accessor development. The rest of
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 work is definitely a monkey's job. Honestly, I got bored of being just a coding
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 machine writing the same data access code over and over again, especially
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 understanding that this process can be automated.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 This introduction shows how to avoid the implementation step of data access
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 development and how to reduce this routine process to the method declaration.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 <h4>Abstract classes</h4>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 Unfortunately, mainstream .NET languages still do not have a compile-time
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 transformation system like some functional or <a href="http://nemerle.org/Macros">hybrid</a> languages do.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 All we have today is pre-compile- and run-time code generation.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 This introduction concentrates on run-time code generation and its support by
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 <a href="http://www.bltoolkit.net/">Business Logic Toolkit for .NET</a>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 Let us step back and bring the methods from the previous examples together in one class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 Ideally, this data accessor class could look like the following:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 public class PersonAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 public List<Person> GetPersonListByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 string firstName, string lastName, int pageNumber, int pageSize);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 public Person GetPersonByID (int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 public void DeletePersonByID(int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 The bad news about this sample is that we cannot use such syntax as the
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 compiler expects the method's body implementation.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 The good news is we can use abstract classes and methods that give us quite
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 similar, compilable source code.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 public /*[a]*/abstract/*[/a]*/ class PersonAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 public /*[a]*/abstract/*[/a]*/ List<Person> GetPersonListByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 string firstName, string lastName, int pageNumber, int pageSize);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 public /*[a]*/abstract/*[/a]*/ Person GetPersonByID (int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 public /*[a]*/abstract/*[/a]*/ void DeletePersonByID(int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 <p class='j'>This code is 100% valid and our next step is to make it workable.</p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 <H4>Abstract DataAccessor</H4>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 Business Logic Toolkit provides the <b>DataAccessor</b> class, which is
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 used as a base class to develop data accessor classes. If we add
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 <b>DataAccessor</b> to our previous example, it will look like the following:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 public abstract class PersonAccessor : /*[a]*/DataAccessor/*[/a]*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 public abstract List<Person> GetPersonListByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 string firstName, string lastName, int pageNumber, int pageSize);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 public abstract Person GetPersonByID (int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 public abstract void DeletePersonByID(int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 <p class='j'>That's it! Now this class is complete and fully functional. The code below shows how to use it:</p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 namespace DataAccess
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 class Program
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 static void Main(string[] args)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 PersonAccessor pa = /*[a]*/TypeAccessor/*[/a]*/<PersonAccessor>./*[a]*/CreateInstance/*[/a]*/();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 List<Person> list = pa.GetPersonListByName("Crazy", "Frog", 0, 20);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 foreach (Person p in list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 Console.Write("{0} {1}", p.FirstName, p.LastName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 The only magic here is the <b>TypeAccessor.CreateInstance</b> method. First of all this
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 method creates a new class inherited from the <b>PersonAccessor</b> class and
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 then generates abstract method bodies depending on each method declaration.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 If we wrote those methods manually, we could get something like the following:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 namespace Example.BLToolkitExtension
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 public sealed class PersonAccessor : Example.PersonAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 public override List<Person> GetPersonListByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 string firstName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 string lastName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 int pageNumber,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 int pageSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 using (DbManager db = GetDbManager())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 return db
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 .SetSpCommand("GetPersonListByName",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 db.Parameter("@firstName", firstName),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 db.Parameter("@lastName", lastName),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 db.Parameter("@pageNumber", pageNumber),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 db.Parameter("@pageSize", pageSize))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 .ExecuteList<Person>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 public override Person GetPersonByID(int id)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 using (DbManager db = GetDbManager())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 return db
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 .SetSpCommand("GetPersonByID", db.Parameter("@id", id))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 .ExecuteObject<Person>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 public override void DeletePersonByID(int id)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 using (DbManager db = GetDbManager())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 db
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 .SetSpCommand("DeletePersonByID", db.Parameter("@id", id))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 .ExecuteNonQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 (The <a href='..\Data\index.htm'>DbManager</a> class is another BLToolkit class used for 'low-level' database access).
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 <p class="j">
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 Every part of the method declaration is important.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 Method's return value specifies one of the Execute methods in the following way:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 <table class='data'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 <tr><th>Return Type</th><th>Execute Method</th></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 <tr><td><i>IDataReader</i> interface</td><td>ExecuteReader</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 <tr><td>Subclass of <i>DataSet</i></td><td>ExecuteDataSet</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 <tr><td>Subclass of <i>DataTable</i></td><td>ExecuteDataTable</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 <tr><td>Class implementing the <i>IList</i> interface</td><td><a href="ExecuteList.htm">ExecuteList</a> or <a href="ExecuteList.htm">ExecuteScalarList</a></td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 <tr><td>Class implementing the <i>IDictionary</i> interface</td><td><a href="ExecuteDictionary.htm">ExecuteDictionary</a> or <a href="ExecuteDictionary.htm">ExecuteScalarDictionary</a></td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 <tr><td><i>void</i></td><td>ExecuteNonQuery</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 <tr><td><i>string</i>, <i>byte[]</i> or value type</td><td><a href="ExecuteScalar.htm">ExecuteScalar</a></td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 <tr><td>In any other case</td><td><a href="ExecuteObject.htm">ExecuteObject</a></td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 </table>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 The method name explicitly defines the action name, which is converted to the stored procedure name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 Type, sequential order, and name of the method parameters are mapped to the command parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 Exceptions from this rule are:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 <br>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 <div style='margin:-10px 0px -0px -10px'><ul compact="compact">
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 <li>a parameter of <a href="../Data/index.htm"><i>DbManager</i></a> type. In this case generator uses provided <a href="../Data/index.htm"><i>DbManager</i></a> to call the command.</li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 <li>parameters decorated with attribute <a href='#FormatAttribute'>FormatAttribute</a>, <a href='#DestinationAttribute'>DestinationAttribute</a>.</li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 </ul></div>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 <h4>Generating process control</h4>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 The <b>PersonAccessor</b> class above is a very simple example and, of
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 course, it seems too ideal to be real. In real life, we need more flexibility
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 and more control over the generated code. BLToolkit contains a bunch of
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 attributes to control DataAccessor generation in addition to <b>DataAccessor</b> virtual members.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 <h5>Method CreateDbManager</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 protected virtual DbManager CreateDbManager()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 return new DbManager();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 By default, this method creates a new instance of <b>DbManager</b> that uses default database configuration.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 You can change this behavior by overriding this method. For example:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 public abstract class OracleDataAccessor : DataAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 protected override DbManager CreateDbManager()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 return new DbManager("Oracle", "Production");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 This code will use the <i>Oracle</i> data provider and <i>Production</i> configuration.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 <a name='GetDefaultSpName'></a><h5>Method GetDefaultSpName</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 protected virtual string GetDefaultSpName(string typeName, string actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 return typeName == null?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 actionName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 string.Format("{0}_{1}", typeName, actionName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 As I mentioned, the method name explicitly defines the so-called action name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 The final stored procedure name is created by the <b>GetDefaultSpName</b>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 method. The default implementation uses the following naming convention:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 <ul>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 <li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 If type name is provided, the method constructs the stored proc name by
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 concatenating the type and action names. Thus, if the type name is "Person" and
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 the action name is "GetAll", the resulting sproc name will be "Person_GetAll".
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 </li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 <li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 If the type name is NOT provided, the stored procedure name will equal the
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 action name.</li>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 </ul>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 You can easily change this behavior. For example, for the naming convention "p_Person_GetAll",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 the method implementation can be the following:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 public abstract class MyBaseDataAccessor<T,A> : DataAccessor<T,A>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 where A : DataAccessor<T,A>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 protected override string GetDefaultSpName(string typeName, string actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 return string.Format("p_{0}_{1}", typeName, actionName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 <h5>Method GetTableName</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 protected virtual string GetTableName(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 // ...
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 return type.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 By default, the table name is the associated object type name (<i>Person</i> in our examples).
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 There are two ways to associate an object type with an accessor. By providing generic parameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 public abstract class PersonAccessor : DataAccessor<Person>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 And by the <b>ObjectType</b> attribute:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 [ObjectType(typeof(Person))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 public abstract class PersonAccessor : DataAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 If you want to have different table and type names in your application, you may override the <b>GetTableName</b> method:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 public abstract class OracleDataAccessor<T,A> : DataAccessor<T,A>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 where A : DataAccessor<T,A>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 protected override string GetTableName(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 return base.GetTableName(type).ToUpper();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 <h5>TableNameAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 Also, you can change the table name for a particular object type by decorating this object
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 with the <b>TableNameAttribute</b> attribute:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 [TableName("PERSON")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 public class Person
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 public int ID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 public string FirstName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 public string LastName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 <h5>ActionNameAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 This attribute allows changing the action name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 [ActionName("GetByID")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 protected abstract IDataReader GetByIDInternal(DbManager db, int id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 public Person GetByID(int id)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 using (DbManager db = GetDbManager())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 using (IDataReader rd = GetByIDInternal(db, id))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 Person p = new Person();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 // do something complicated.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 return p;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 <h5>ActionSprocNameAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 This attribute associates the action name with a stored procedure name:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 <% cs#
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 [ActionSprocName("Insert", sp_Person_Insert")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 public abstract void Insert(Person p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 This attribute can be useful when you need to reassign a stored procedure name for a method defined in your base class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 <h5>SprocNameAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 The regular way to assign deferent from default sproc name for a method is the <b>SprocName</b> attribute.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 [SprocName("sp_Person_Insert")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 public abstract void Insert(Person p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 <a name='DestinationAttribute'></a><h5>DestinationAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 By default, the DataAccessor generator uses method's return value to determine which <i>Execute</i> method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 should be used to perform the current operation.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 The <b>DestinationAttribute</b> indicates that target object is a parameter decorated with this attribute:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 public abstract void GetAll([Destination] List<Person> list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 <h5>DirectionAttributes</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 <i>DataAccessor</i> generator can map provided business object to stored
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 procedure parameters. <b>Direction</b> attributes allow controlling this process more precisely.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 public abstract void Insert(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 [Direction.Output("ID"), Direction.Ignore("LastName")] Person person);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 In addition, BLToolkit provides two more direction attributes:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 <b>Direction.InputOutputAttribute</b> and <b>Direction.ReturnValueAttribute</b>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 <h5>DiscoverParametersAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 By default, BLToolkit expects method parameter names to match stored procedure
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 parameter names. The sequential order of parameters is not important in this
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 case. This attribute enforces BLToolkit to retrieve parameter information from
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 the sproc and to assign method parameters in the order they go. Parameter names
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 are ignored.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 <a name='FormatAttribute'></a><h5>FormatAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 This attribute indicates that the specified parameter is used to construct the stored procedure name or SQL statement:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 [SqlQuery("SELECT {0} FROM {1} WHERE {2}")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 public abstract List<string> GetStrings(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 [Format(0)] string fieldName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 [Format(1)] string tableName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 [Format(2)] string whereClause);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 <h5>IndexAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 If you want your method to return a dictionary, you will have to specify fields to build the dictionary key.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 The Index attribute allows you to do that:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 [SqlQuery("SELECT * FROM Person")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 [Index("ID")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 public abstract Dictionary<int, Person> SelectAll1();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 [SqlQuery("SELECT * FROM Person")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 [Index("@PersonID", "LastName")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 public abstract Dictionary<CompoundValue, Person> SelectAll2();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 <p class='j'>Note: if your key has more than one field, the type of this key should be <b>CompoundValue</b>.</p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 <p class='j'>If the field name starts from '@' symbol, BLToolkit reads the field value from data source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 otherwise from an object property/field.</p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 <h5>ParamNameAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 By default, the method parameter name should match the stored procedure parameter name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 This attribute specifies the sproc parameter name explicitly.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 public abstract Person SelectByName(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 [ParamName("FirstName")] string name1,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 [ParamName("@LastName")] string name2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 <h5>ScalarFieldNameAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 If your method returns a dictionary of scalar values, you will have to specify the name or index of the field
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 used to populate the scalar list. The <b>ScalarFieldName</b> attribute allows you to do that:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 <% cs #
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 [SqlQuery("SELECT * FROM Person")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 [Index("@PersonID")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 [ScalarFieldName("FirstName")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 public abstract Dictionary<int, string> SelectAll1();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 [SqlQuery("SELECT * FROM Person")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 [Index("PersonID", "LastName")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 [ScalarFieldName("FirstName")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 public abstract Dictionary<CompoundValue, string> SelectAll2();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 <h5>ScalarSourceAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 If a method returns a scalar value, this attribute can be used to specify how database returns this value.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 The <b>ScalarSource</b> attribute take a parameter of the <b>ScalarSourceType</b> type:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 <table class='data'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 <tr><th>ScalarSourceType</th><th>Description</th></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 <tr><td>DataReader</td><td>Calls the <b>DbManager.ExecuteReader</b> method, and then calls <b>IDataReader.GetValue</b> method to read the value.</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 <tr><td>OutputParameter</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then reads value from the <b>IDbDataParameter.Value</b> property.</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 <tr><td>ReturnValue</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then reads return value from command parameter collection.</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 <tr><td>AffectedRows</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then returns its return value.</td></tr>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 </table>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 <h5>SqlQueryAttribute</h5>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 This attribute allows specifying SQL statement.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 </p>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 <% cs # public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 [SqlQuery("SELECT * FROM Person WHERE PersonID = @id")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 public abstract Person GetByID(int @id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620 %>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 <h4>Conclusion</h4>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 <p class='j'>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 I hope this brief tutorial demonstrates one of the simplest, quickest and
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 most low-maintenance ways to develop your data access layer. In addition, you
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 will get one more benefit, which is incredible object mapping performance. But
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 that is a topic we will discuss later.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 </p>