About DAAB Operation No.2
MAAB2
上回说了SQLHelper,这次给大家献上OracleHelper!别的话我就不多说了。 :)
1
//===============================================================================
2
// OracleHelper based on Microsoft Data Access Application Block (DAAB) for .NET
3
// http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp
4
//
5
// OracleHelper.cs
6
//
7
// This file contains the implementations of the OracleHelper and OracleHelperParameterCache
8
// classes.
9
//
10
// The DAAB for MS .NET Provider for Oracle has been tested in the context of this Nile implementation,
11
// but has not undergone the generic functional testing that the SQL version has gone through.
12
// You can use it in other .NET applications using Oracle databases. For complete docs explaining how to use
13
// and how it's built go to the originl appblock link.
14
// For this sample, the code resides in the Nile namespaces not the Microsoft.ApplicationBlocks namespace
15
//==============================================================================
16![](/Images/OutliningIndicators/None.gif)
17
using System;
18
using System.Data;
19
using System.Xml;
20
using System.Data.OracleClient;
21
using System.Collections;
22![](/Images/OutliningIndicators/None.gif)
23![](/Images/OutliningIndicators/None.gif)
24
namespace Microsoft.ApplicationBlocks.Data
25![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
26![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
27
/// The OracleHelper class is intended to encapsulate high performance, scalable best practices for
28
/// common uses of OracleClient.
29
/// </summary>
30
public sealed class OracleHelper
31![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
32![](/Images/OutliningIndicators/ContractedSubBlock.gif)
private utility methods & constructors#region private utility methods & constructors
33![](/Images/OutliningIndicators/InBlock.gif)
34
//Since this class provides only static methods, make the default constructor private to prevent
35
//instances from being created with "new OracleHelper()".
36![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private OracleHelper()
{}
37![](/Images/OutliningIndicators/InBlock.gif)
38![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
39
/// This method is used to attach array's of OracleParameters to an OracleCommand.
40
///
41
/// This method will assign a value of DbNull to any parameter with a direction of
42
/// InputOutput and a value of null.
43
///
44
/// This behavior will prevent default values from being used, but
45
/// this will be the less common case than an intended pure output parameter (derived as InputOutput)
46
/// where the user provided no input value.
47
/// </summary>
48
/// <param name="command">The command to which the parameters will be added</param>
49
/// <param name="commandParameters">an array of OracleParameters tho be added to command</param>
50
private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters)
51![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
52
foreach (OracleParameter p in commandParameters)
53![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
54
//check for derived output value with no value assigned
55
if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
56![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
57
p.Value = DBNull.Value;
58
}
59
60
command.Parameters.Add(p);
61
}
62
}
63![](/Images/OutliningIndicators/InBlock.gif)
64![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
65
/// This method assigns an array of values to an array of OracleParameters.
66
/// </summary>
67
/// <param name="commandParameters">array of OracleParameters to be assigned values</param>
68
/// <param name="parameterValues">array of objects holding the values to be assigned</param>
69
private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues)
70![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
71
if ((commandParameters == null) || (parameterValues == null))
72![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
73
//do nothing if we get no data
74
return;
75
}
76![](/Images/OutliningIndicators/InBlock.gif)
77
// we must have the same number of values as we pave parameters to put them in
78
if (commandParameters.Length != parameterValues.Length)
79![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
80
throw new ArgumentException("Parameter count does not match Parameter Value count.");
81
}
82![](/Images/OutliningIndicators/InBlock.gif)
83
//iterate through the OracleParameters, assigning the values from the corresponding position in the
84
//value array
85
for (int i = 0, j = commandParameters.Length; i < j; i++)
86![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
87
commandParameters[i].Value = parameterValues[i];
88
}
89
}
90![](/Images/OutliningIndicators/InBlock.gif)
91![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
92
/// This method opens (if necessary) and assigns a connection, transaction, command type and parameters
93
/// to the provided command.
94
/// </summary>
95
/// <param name="command">the OracleCommand to be prepared</param>
96
/// <param name="connection">a valid OracleConnection, on which to execute this command</param>
97
/// <param name="transaction">a valid OracleTransaction, or 'null'</param>
98
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
99
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
100
/// <param name="commandParameters">an array of OracleParameters to be associated with the command or 'null' if no parameters are required</param>
101
private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters)
102![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
103
//if the provided connection is not open, we will open it
104
if (connection.State != ConnectionState.Open)
105![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
106
connection.Open();
107
}
108![](/Images/OutliningIndicators/InBlock.gif)
109
//associate the connection with the command
110
command.Connection = connection;
111![](/Images/OutliningIndicators/InBlock.gif)
112
//set the command text (stored procedure name or Oracle statement)
113
command.CommandText = commandText;
114![](/Images/OutliningIndicators/InBlock.gif)
115
//if we were provided a transaction, assign it.
116
if (transaction != null)
117![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
118
command.Transaction = transaction;
119
}
120![](/Images/OutliningIndicators/InBlock.gif)
121
//set the command type
122
command.CommandType = commandType;
123![](/Images/OutliningIndicators/InBlock.gif)
124
//attach the command parameters if they are provided
125
if (commandParameters != null)
126![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
127
AttachParameters(command, commandParameters);
128
}
129![](/Images/OutliningIndicators/InBlock.gif)
130
return;
131
}
132![](/Images/OutliningIndicators/InBlock.gif)
133![](/Images/OutliningIndicators/InBlock.gif)
134
#endregion private utility methods & constructors
135![](/Images/OutliningIndicators/InBlock.gif)
136![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteNonQuery#region ExecuteNonQuery
137![](/Images/OutliningIndicators/InBlock.gif)
138![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
139
/// Execute an OracleCommand (that returns no resultset and takes no parameters) against the database specified in
140
/// the connection string.
141
/// </summary>
142
/// <remarks>
143
/// e.g.:
144
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
145
/// </remarks>
146
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
147
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
148
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
149
/// <returns>an int representing the number of rows affected by the command</returns>
150
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText)
151![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
152
//pass through the call providing null for the set of OracleParameters
153
return ExecuteNonQuery(connectionString, commandType, commandText, (OracleParameter[])null);
154
}
155![](/Images/OutliningIndicators/InBlock.gif)
156![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
157
/// Execute an OracleCommand (that returns no resultset) against the database specified in the connection string
158
/// using the provided parameters.
159
/// </summary>
160
/// <remarks>
161
/// e.g.:
162
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24));
163
/// </remarks>
164
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
165
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
166
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
167
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
168
/// <returns>an int representing the number of rows affected by the command</returns>
169
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
170![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
171
//create & open an OracleConnection, and dispose of it after we are done.
172
using (OracleConnection cn = new OracleConnection(connectionString))
173![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
174
cn.Open();
175![](/Images/OutliningIndicators/InBlock.gif)
176
//call the overload that takes a connection in place of the connection string
177
return ExecuteNonQuery(cn, commandType, commandText, commandParameters);
178
}
179
}
180![](/Images/OutliningIndicators/InBlock.gif)
181![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
182
/// Execute a stored procedure via an OracleCommand (that returns no resultset) against the database specified in
183
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the
184
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
185
/// </summary>
186
/// <remarks>
187
/// This method provides no access to output parameters or the stored procedure's return value parameter.
188
///
189
/// e.g.:
190
/// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
191
/// </remarks>
192
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
193
/// <param name="spName">the name of the stored procedure</param>
194
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
195
/// <returns>an int representing the number of rows affected by the command</returns>
196
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
197![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
198
//if we got parameter values, we need to figure out where they go
199
if ((parameterValues != null) && (parameterValues.Length > 0))
200![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
201
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
202
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName);
203![](/Images/OutliningIndicators/InBlock.gif)
204
//assign the provided values to these parameters based on parameter order
205
AssignParameterValues(commandParameters, parameterValues);
206![](/Images/OutliningIndicators/InBlock.gif)
207
//call the overload that takes an array of OracleParameters
208
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
209
}
210
//otherwise we can just call the SP without params
211
else
212![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
213
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
214
}
215
}
216![](/Images/OutliningIndicators/InBlock.gif)
217![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
218
/// Execute an OracleCommand (that returns no resultset and takes no parameters) against the provided OracleConnection.
219
/// </summary>
220
/// <remarks>
221
/// e.g.:
222
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
223
/// </remarks>
224
/// <param name="connection">a valid OracleConnection</param>
225
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
226
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
227
/// <returns>an int representing the number of rows affected by the command</returns>
228
public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText)
229![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
230
//pass through the call providing null for the set of OracleParameters
231
return ExecuteNonQuery(connection, commandType, commandText, (OracleParameter[])null);
232
}
233![](/Images/OutliningIndicators/InBlock.gif)
234![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
235
/// Execute an OracleCommand (that returns no resultset) against the specified OracleConnection
236
/// using the provided parameters.
237
/// </summary>
238
/// <remarks>
239
/// e.g.:
240
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24));
241
/// </remarks>
242
/// <param name="connection">a valid OracleConnection</param>
243
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
244
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
245
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
246
/// <returns>an int representing the number of rows affected by the command</returns>
247
public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
248![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
249
//create a command and prepare it for execution
250
OracleCommand cmd = new OracleCommand();
251
PrepareCommand(cmd, connection, (OracleTransaction)null, commandType, commandText, commandParameters);
252
253
//finally, execute the command.
254
return cmd.ExecuteNonQuery();
255
}
256![](/Images/OutliningIndicators/InBlock.gif)
257![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
258
/// Execute a stored procedure via an OracleCommand (that returns no resultset) against the specified OracleConnection
259
/// using the provided parameter values. This method will query the database to discover the parameters for the
260
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
261
/// </summary>
262
/// <remarks>
263
/// This method provides no access to output parameters or the stored procedure's return value parameter.
264
///
265
/// e.g.:
266
/// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);
267
/// </remarks>
268
/// <param name="connection">a valid OracleConnection</param>
269
/// <param name="spName">the name of the stored procedure</param>
270
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
271
/// <returns>an int representing the number of rows affected by the command</returns>
272
public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues)
273![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
274
//if we got parameter values, we need to figure out where they go
275
if ((parameterValues != null) && (parameterValues.Length > 0))
276![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
277
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
278
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
279![](/Images/OutliningIndicators/InBlock.gif)
280
//assign the provided values to these parameters based on parameter order
281
AssignParameterValues(commandParameters, parameterValues);
282![](/Images/OutliningIndicators/InBlock.gif)
283
//call the overload that takes an array of OracleParameters
284
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
285
}
286
//otherwise we can just call the SP without params
287
else
288![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
289
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
290
}
291
}
292![](/Images/OutliningIndicators/InBlock.gif)
293![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
294
/// Execute an OracleCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction.
295
/// </summary>
296
/// <remarks>
297
/// e.g.:
298
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");
299
/// </remarks>
300
/// <param name="transaction">a valid OracleTransaction</param>
301
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
302
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
303
/// <returns>an int representing the number of rows affected by the command</returns>
304
public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText)
305![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
306
//pass through the call providing null for the set of OracleParameters
307
return ExecuteNonQuery(transaction, commandType, commandText, (OracleParameter[])null);
308
}
309![](/Images/OutliningIndicators/InBlock.gif)
310![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
311
/// Execute an OracleCommand (that returns no resultset) against the specified OracleTransaction
312
/// using the provided parameters.
313
/// </summary>
314
/// <remarks>
315
/// e.g.:
316
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
317
/// </remarks>
318
/// <param name="transaction">a valid OracleTransaction</param>
319
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
320
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
321
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
322
/// <returns>an int representing the number of rows affected by the command</returns>
323
public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
324![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
325
//create a command and prepare it for execution
326
OracleCommand cmd = new OracleCommand();
327
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
328
329
//finally, execute the command.
330
return cmd.ExecuteNonQuery();
331
}
332![](/Images/OutliningIndicators/InBlock.gif)
333![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
334
/// Execute a stored procedure via an OracleCommand (that returns no resultset) against the specified
335
/// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the
336
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
337
/// </summary>
338
/// <remarks>
339
/// This method provides no access to output parameters or the stored procedure's return value parameter.
340
///
341
/// e.g.:
342
/// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);
343
/// </remarks>
344
/// <param name="transaction">a valid OracleTransaction</param>
345
/// <param name="spName">the name of the stored procedure</param>
346
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
347
/// <returns>an int representing the number of rows affected by the command</returns>
348
public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues)
349![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
350
//if we got parameter values, we need to figure out where they go
351
if ((parameterValues != null) && (parameterValues.Length > 0))
352![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
353
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
354
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName);
355![](/Images/OutliningIndicators/InBlock.gif)
356
//assign the provided values to these parameters based on parameter order
357
AssignParameterValues(commandParameters, parameterValues);
358![](/Images/OutliningIndicators/InBlock.gif)
359
//call the overload that takes an array of OracleParameters
360
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
361
}
362
//otherwise we can just call the SP without params
363
else
364![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
365
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
366
}
367
}
368![](/Images/OutliningIndicators/InBlock.gif)
369
#endregion ExecuteNonQuery
370![](/Images/OutliningIndicators/InBlock.gif)
371![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteDataSet#region ExecuteDataSet
372![](/Images/OutliningIndicators/InBlock.gif)
373![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
374
/// Execute an OracleCommand (that returns a resultset and takes no parameters) against the database specified in
375
/// the connection string.
376
/// </summary>
377
/// <remarks>
378
/// e.g.:
379
/// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders");
380
/// </remarks>
381
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
382
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
383
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
384
/// <returns>a dataset containing the resultset generated by the command</returns>
385
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText)
386![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
387
//pass through the call providing null for the set of OracleParameters
388
return ExecuteDataset(connectionString, commandType, commandText, (OracleParameter[])null);
389
}
390![](/Images/OutliningIndicators/InBlock.gif)
391![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
392
/// Execute an OracleCommand (that returns a resultset) against the database specified in the connection string
393
/// using the provided parameters.
394
/// </summary>
395
/// <remarks>
396
/// e.g.:
397
/// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
398
/// </remarks>
399
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
400
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
401
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
402
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
403
/// <returns>a dataset containing the resultset generated by the command</returns>
404
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
405![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
406
//create & open an OracleConnection, and dispose of it after we are done.
407
using (OracleConnection cn = new OracleConnection(connectionString))
408![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
409
cn.Open();
410![](/Images/OutliningIndicators/InBlock.gif)
411
//call the overload that takes a connection in place of the connection string
412
return ExecuteDataset(cn, commandType, commandText, commandParameters);
413
}
414
}
415![](/Images/OutliningIndicators/InBlock.gif)
416![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
417
/// Execute a stored procedure via an OracleCommand (that returns a resultset) against the database specified in
418
/// the conneciton string using the provided parameter values. This method will query the database to discover the parameters for the
419
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
420
/// </summary>
421
/// <remarks>
422
/// This method provides no access to output parameters or the stored procedure's return value parameter.
423
///
424
/// e.g.:
425
/// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36);
426
/// </remarks>
427
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
428
/// <param name="spName">the name of the stored procedure</param>
429
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
430
/// <returns>a dataset containing the resultset generated by the command</returns>
431
public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues)
432![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
433
//if we got parameter values, we need to figure out where they go
434
if ((parameterValues != null) && (parameterValues.Length > 0))
435![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
436
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
437
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName);
438![](/Images/OutliningIndicators/InBlock.gif)
439
//assign the provided values to these parameters based on parameter order
440
AssignParameterValues(commandParameters, parameterValues);
441![](/Images/OutliningIndicators/InBlock.gif)
442
//call the overload that takes an array of OracleParameters
443
return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);
444
}
445
//otherwise we can just call the SP without params
446
else
447![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
448
return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);
449
}
450
}
451![](/Images/OutliningIndicators/InBlock.gif)
452![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
453
/// Execute an OracleCommand (that returns a resultset and takes no parameters) against the provided OracleConnection.
454
/// </summary>
455
/// <remarks>
456
/// e.g.:
457
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders");
458
/// </remarks>
459
/// <param name="connection">a valid OracleConnection</param>
460
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
461
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
462
/// <returns>a dataset containing the resultset generated by the command</returns>
463
public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText)
464![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
465
//pass through the call providing null for the set of OracleParameters
466
return ExecuteDataset(connection, commandType, commandText, (OracleParameter[])null);
467
}
468
469![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
470
/// Execute an OracleCommand (that returns a resultset) against the specified OracleConnection
471
/// using the provided parameters.
472
/// </summary>
473
/// <remarks>
474
/// e.g.:
475
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
476
/// </remarks>
477
/// <param name="connection">a valid OracleConnection</param>
478
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
479
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
480
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
481
/// <returns>a dataset containing the resultset generated by the command</returns>
482
public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
483![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
484
//create a command and prepare it for execution
485
OracleCommand cmd = new OracleCommand();
486
PrepareCommand(cmd, connection, (OracleTransaction)null, commandType, commandText, commandParameters);
487
488
//create the DataAdapter & DataSet
489
OracleDataAdapter da = new OracleDataAdapter(cmd);
490
DataSet ds = new DataSet();
491![](/Images/OutliningIndicators/InBlock.gif)
492
//fill the DataSet using default values for DataTable names, etc.
493
da.Fill(ds);
494
495
//return the dataset
496
return ds;
497
}
498
499![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
500
/// Execute a stored procedure via an OracleCommand (that returns a resultset) against the specified OracleConnection
501
/// using the provided parameter values. This method will query the database to discover the parameters for the
502
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
503
/// </summary>
504
/// <remarks>
505
/// This method provides no access to output parameters or the stored procedure's return value parameter.
506
///
507
/// e.g.:
508
/// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);
509
/// </remarks>
510
/// <param name="connection">a valid OracleConnection</param>
511
/// <param name="spName">the name of the stored procedure</param>
512
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
513
/// <returns>a dataset containing the resultset generated by the command</returns>
514
public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues)
515![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
516
//if we got parameter values, we need to figure out where they go
517
if ((parameterValues != null) && (parameterValues.Length > 0))
518![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
519
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
520
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
521![](/Images/OutliningIndicators/InBlock.gif)
522
//assign the provided values to these parameters based on parameter order
523
AssignParameterValues(commandParameters, parameterValues);
524![](/Images/OutliningIndicators/InBlock.gif)
525
//call the overload that takes an array of OracleParameters
526
return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);
527
}
528
//otherwise we can just call the SP without params
529
else
530![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
531
return ExecuteDataset(connection, CommandType.StoredProcedure, spName);
532
}
533
}
534![](/Images/OutliningIndicators/InBlock.gif)
535![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
536
/// Execute an OracleCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction.
537
/// </summary>
538
/// <remarks>
539
/// e.g.:
540
/// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders");
541
/// </remarks>
542
/// <param name="transaction">a valid OracleTransaction</param>
543
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
544
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
545
/// <returns>a dataset containing the resultset generated by the command</returns>
546
public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText)
547![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
548
//pass through the call providing null for the set of OracleParameters
549
return ExecuteDataset(transaction, commandType, commandText, (OracleParameter[])null);
550
}
551
552![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
553
/// Execute an OracleCommand (that returns a resultset) against the specified OracleTransaction
554
/// using the provided parameters.
555
/// </summary>
556
/// <remarks>
557
/// e.g.:
558
/// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
559
/// </remarks>
560
/// <param name="transaction">a valid OracleTransaction</param>
561
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
562
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
563
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
564
/// <returns>a dataset containing the resultset generated by the command</returns>
565
public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
566![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
567
//create a command and prepare it for execution
568
OracleCommand cmd = new OracleCommand();
569
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
570
571
//create the DataAdapter & DataSet
572
OracleDataAdapter da = new OracleDataAdapter(cmd);
573
DataSet ds = new DataSet();
574![](/Images/OutliningIndicators/InBlock.gif)
575
//fill the DataSet using default values for DataTable names, etc.
576
da.Fill(ds);
577
578
//return the dataset
579
return ds;
580
}
581
582![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
583
/// Execute a stored procedure via an OracleCommand (that returns a resultset) against the specified
584
/// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the
585
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
586
/// </summary>
587
/// <remarks>
588
/// This method provides no access to output parameters or the stored procedure's return value parameter.
589
///
590
/// e.g.:
591
/// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36);
592
/// </remarks>
593
/// <param name="transaction">a valid OracleTransaction</param>
594
/// <param name="spName">the name of the stored procedure</param>
595
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
596
/// <returns>a dataset containing the resultset generated by the command</returns>
597
public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues)
598![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
599
//if we got parameter values, we need to figure out where they go
600
if ((parameterValues != null) && (parameterValues.Length > 0))
601![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
602
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
603
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName);
604![](/Images/OutliningIndicators/InBlock.gif)
605
//assign the provided values to these parameters based on parameter order
606
AssignParameterValues(commandParameters, parameterValues);
607![](/Images/OutliningIndicators/InBlock.gif)
608
//call the overload that takes an array of OracleParameters
609
return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);
610
}
611
//otherwise we can just call the SP without params
612
else
613![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
614
return ExecuteDataset(transaction, CommandType.StoredProcedure, spName);
615
}
616
}
617![](/Images/OutliningIndicators/InBlock.gif)
618
#endregion ExecuteDataSet
619
620![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteReader#region ExecuteReader
621![](/Images/OutliningIndicators/InBlock.gif)
622![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
623
/// this enum is used to indicate weather the connection was provided by the caller, or created by OracleHelper, so that
624
/// we can set the appropriate CommandBehavior when calling ExecuteReader()
625
/// </summary>
626
private enum OracleConnectionOwnership
627![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
628![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>Connection is owned and managed by OracleHelper</summary>
629
Internal,
630![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>Connection is owned and managed by the caller</summary>
631
External
632
}
633![](/Images/OutliningIndicators/InBlock.gif)
634![](/Images/OutliningIndicators/InBlock.gif)
635![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
636
/// Create and prepare an OracleCommand, and call ExecuteReader with the appropriate CommandBehavior.
637
/// </summary>
638
/// <remarks>
639
/// If we created and opened the connection, we want the connection to be closed when the DataReader is closed.
640
///
641
/// If the caller provided the connection, we want to leave it to them to manage.
642
/// </remarks>
643
/// <param name="connection">a valid OracleConnection, on which to execute this command</param>
644
/// <param name="transaction">a valid OracleTransaction, or 'null'</param>
645
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
646
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
647
/// <param name="commandParameters">an array of OracleParameters to be associated with the command or 'null' if no parameters are required</param>
648
/// <param name="connectionOwnership">indicates whether the connection parameter was provided by the caller, or created by OracleHelper</param>
649
/// <returns>OracleDataReader containing the results of the command</returns>
650
private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership)
651![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
652
//create a command and prepare it for execution
653
OracleCommand cmd = new OracleCommand();
654
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);
655
656
//create a reader
657
OracleDataReader dr;
658![](/Images/OutliningIndicators/InBlock.gif)
659
// call ExecuteReader with the appropriate CommandBehavior
660
if (connectionOwnership == OracleConnectionOwnership.External)
661![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
662
dr = cmd.ExecuteReader();
663
}
664
else
665![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
666
dr = cmd.ExecuteReader((CommandBehavior)((int)CommandBehavior.CloseConnection));
667
}
668![](/Images/OutliningIndicators/InBlock.gif)
669
return (OracleDataReader) dr;
670
}
671![](/Images/OutliningIndicators/InBlock.gif)
672![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
673
/// Execute an OracleCommand (that returns a resultset and takes no parameters) against the database specified in
674
/// the connection string.
675
/// </summary>
676
/// <remarks>
677
/// e.g.:
678
/// OracleDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders");
679
/// </remarks>
680
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
681
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
682
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
683
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
684
public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText)
685![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
686
//pass through the call providing null for the set of OracleParameters
687
return ExecuteReader(connectionString, commandType, commandText, (OracleParameter[])null);
688
}
689![](/Images/OutliningIndicators/InBlock.gif)
690![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
691
/// Execute an OracleCommand (that returns a resultset) against the database specified in the connection string
692
/// using the provided parameters.
693
/// </summary>
694
/// <remarks>
695
/// e.g.:
696
/// OracleDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
697
/// </remarks>
698
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
699
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
700
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
701
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
702
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
703
public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
704![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
705
//create & open an OraclebConnection
706
OracleConnection cn = new OracleConnection(connectionString);
707
cn.Open();
708![](/Images/OutliningIndicators/InBlock.gif)
709
try
710![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
711
//call the private overload that takes an internally owned connection in place of the connection string
712
return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal);
713
}
714
catch
715![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
716
//if we fail to return the OracleDataReader, we need to close the connection ourselves
717
cn.Close();
718
throw;
719
}
720
}
721![](/Images/OutliningIndicators/InBlock.gif)
722![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
723
/// Execute a stored procedure via an OracleCommand (that returns a resultset) against the database specified in
724
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the
725
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
726
/// </summary>
727
/// <remarks>
728
/// This method provides no access to output parameters or the stored procedure's return value parameter.
729
///
730
/// e.g.:
731
/// OracleDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36);
732
/// </remarks>
733
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
734
/// <param name="spName">the name of the stored procedure</param>
735
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
736
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
737
public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues)
738![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
739
//if we got parameter values, we need to figure out where they go
740
if ((parameterValues != null) && (parameterValues.Length > 0))
741![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
742
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
743
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName);
744![](/Images/OutliningIndicators/InBlock.gif)
745
//assign the provided values to these parameters based on parameter order
746
AssignParameterValues(commandParameters, parameterValues);
747![](/Images/OutliningIndicators/InBlock.gif)
748
//call the overload that takes an array of OracleParameters
749
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);
750
}
751
//otherwise we can just call the SP without params
752
else
753![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
754
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName);
755
}
756
}
757![](/Images/OutliningIndicators/InBlock.gif)
758![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
759
/// Execute an OracleCommand (that returns a resultset and takes no parameters) against the provided OracleConnection.
760
/// </summary>
761
/// <remarks>
762
/// e.g.:
763
/// OracleDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders");
764
/// </remarks>
765
/// <param name="connection">a valid OracleConnection</param>
766
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
767
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
768
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
769
public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText)
770![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
771
//pass through the call providing null for the set of OracleParameters
772
return ExecuteReader(connection, commandType, commandText, (OracleParameter[])null);
773
}
774![](/Images/OutliningIndicators/InBlock.gif)
775![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
776
/// Execute an OracleCommand (that returns a resultset) against the specified OracleConnection
777
/// using the provided parameters.
778
/// </summary>
779
/// <remarks>
780
/// e.g.:
781
/// OracleDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
782
/// </remarks>
783
/// <param name="connection">a valid OracleConnection</param>
784
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
785
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
786
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
787
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
788
public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
789![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
790
//pass through the call to the private overload using a null transaction value and an externally owned connection
791
return ExecuteReader(connection, (OracleTransaction)null, commandType, commandText, commandParameters, OracleConnectionOwnership.External);
792
}
793![](/Images/OutliningIndicators/InBlock.gif)
794![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
795
/// Execute a stored procedure via an OracleCommand (that returns a resultset) against the specified OracleConnection
796
/// using the provided parameter values. This method will query the database to discover the parameters for the
797
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
798
/// </summary>
799
/// <remarks>
800
/// This method provides no access to output parameters or the stored procedure's return value parameter.
801
///
802
/// e.g.:
803
/// OracleDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36);
804
/// </remarks>
805
/// <param name="connection">a valid OracleConnection</param>
806
/// <param name="spName">the name of the stored procedure</param>
807
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
808
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
809
public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues)
810![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
811
//if we got parameter values, we need to figure out where they go
812
if ((parameterValues != null) && (parameterValues.Length > 0))
813![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
814
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
815![](/Images/OutliningIndicators/InBlock.gif)
816
AssignParameterValues(commandParameters, parameterValues);
817![](/Images/OutliningIndicators/InBlock.gif)
818
return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);
819
}
820
//otherwise we can just call the SP without params
821
else
822![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
823
return ExecuteReader(connection, CommandType.StoredProcedure, spName);
824
}
825
}
826![](/Images/OutliningIndicators/InBlock.gif)
827![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
828
/// Execute an OracleCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction.
829
/// </summary>
830
/// <remarks>
831
/// e.g.:
832
/// OracleDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders");
833
/// </remarks>
834
/// <param name="transaction">a valid OracleTransaction</param>
835
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
836
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
837
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
838
public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText)
839![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
840
//pass through the call providing null for the set of OracleParameters
841
return ExecuteReader(transaction, commandType, commandText, (OracleParameter[])null);
842
}
843![](/Images/OutliningIndicators/InBlock.gif)
844![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
845
/// Execute an OracleCommand (that returns a resultset) against the specified OracleTransaction
846
/// using the provided parameters.
847
/// </summary>
848
/// <remarks>
849
/// e.g.:
850
/// OracleDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
851
/// </remarks>
852
/// <param name="transaction">a valid OracleTransaction</param>
853
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
854
/// <param name="commandText">the stored procedure name or PL/SQL command</param>
855
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
856
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
857
public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
858![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
859
//pass through to private overload, indicating that the connection is owned by the caller
860
return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External);
861
}
862![](/Images/OutliningIndicators/InBlock.gif)
863![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
864
/// Execute a stored procedure via an OracleCommand (that returns a resultset) against the specified
865
/// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the
866
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
867
/// </summary>
868
/// <remarks>
869
/// This method provides no access to output parameters or the stored procedure's return value parameter.
870
///
871
/// e.g.:
872
/// OracleDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36);
873
/// </remarks>
874
/// <param name="transaction">a valid OracleTransaction</param>
875
/// <param name="spName">the name of the stored procedure</param>
876
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
877
/// <returns>an OracleDataReader containing the resultset generated by the command</returns>
878
public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues)
879![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
880
//if we got parameter values, we need to figure out where they go
881
if ((parameterValues != null) && (parameterValues.Length > 0))
882![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
883
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName);
884![](/Images/OutliningIndicators/InBlock.gif)
885
AssignParameterValues(commandParameters, parameterValues);
886![](/Images/OutliningIndicators/InBlock.gif)
887
return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
888
}
889
//otherwise we can just call the SP without params
890
else
891![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
892
return ExecuteReader(transaction, CommandType.StoredProcedure, spName);
893
}
894
}
895![](/Images/OutliningIndicators/InBlock.gif)
896
#endregion ExecuteReader
897![](/Images/OutliningIndicators/InBlock.gif)
898![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteScalar#region ExecuteScalar
899
900![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
901
/// Execute an OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in
902
/// the connection string.
903
/// </summary>
904
/// <remarks>
905
/// e.g.:
906
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount");
907
/// </remarks>
908
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
909
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
910
/// <param name="commandText">the stored procedure name or T-Oracle command</param>
911
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
912
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText)
913![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
914
//pass through the call providing null for the set of OracleParameters
915
return ExecuteScalar(connectionString, commandType, commandText, (OracleParameter[])null);
916
}
917![](/Images/OutliningIndicators/InBlock.gif)
918![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
919
/// Execute an OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string
920
/// using the provided parameters.
921
/// </summary>
922
/// <remarks>
923
/// e.g.:
924
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24));
925
/// </remarks>
926
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
927
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
928
/// <param name="commandText">the stored procedure name or T-Oracle command</param>
929
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
930
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
931
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
932![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
933
//create & open an OracleConnection, and dispose of it after we are done.
934
using (OracleConnection cn = new OracleConnection(connectionString))
935![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
936
cn.Open();
937![](/Images/OutliningIndicators/InBlock.gif)
938
//call the overload that takes a connection in place of the connection string
939
return ExecuteScalar(cn, commandType, commandText, commandParameters);
940
}
941
}
942![](/Images/OutliningIndicators/InBlock.gif)
943![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
944
/// Execute a stored procedure via an OracleCommand (that returns a 1x1 resultset) against the database specified in
945
/// the conneciton string using the provided parameter values. This method will query the database to discover the parameters for the
946
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
947
/// </summary>
948
/// <remarks>
949
/// This method provides no access to output parameters or the stored procedure's return value parameter.
950
///
951
/// e.g.:
952
/// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36);
953
/// </remarks>
954
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
955
/// <param name="spName">the name of the stored procedure</param>
956
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
957
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
958
public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues)
959![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
960
//if we got parameter values, we need to figure out where they go
961
if ((parameterValues != null) && (parameterValues.Length > 0))
962![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
963
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
964
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName);
965![](/Images/OutliningIndicators/InBlock.gif)
966
//assign the provided values to these parameters based on parameter order
967
AssignParameterValues(commandParameters, parameterValues);
968![](/Images/OutliningIndicators/InBlock.gif)
969
//call the overload that takes an array of OracleParameters
970
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);
971
}
972
//otherwise we can just call the SP without params
973
else
974![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
975
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);
976
}
977
}
978![](/Images/OutliningIndicators/InBlock.gif)
979![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
980
/// Execute an OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection.
981
/// </summary>
982
/// <remarks>
983
/// e.g.:
984
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount");
985
/// </remarks>
986
/// <param name="connection">a valid OracleConnection</param>
987
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
988
/// <param name="commandText">the stored procedure name or T-Oracle command</param>
989
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
990
public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText)
991![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
992
//pass through the call providing null for the set of OracleParameters
993
return ExecuteScalar(connection, commandType, commandText, (OracleParameter[])null);
994
}
995![](/Images/OutliningIndicators/InBlock.gif)
996![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
997
/// Execute an OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection
998
/// using the provided parameters.
999
/// </summary>
1000
/// <remarks>
1001
/// e.g.:
1002
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24));
1003
/// </remarks>
1004
/// <param name="connection">a valid OracleConnection</param>
1005
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1006
/// <param name="commandText">the stored procedure name or T-OleDb command</param>
1007
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
1008
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1009
public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
1010![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1011
//create a command and prepare it for execution
1012
OracleCommand cmd = new OracleCommand();
1013
PrepareCommand(cmd, connection, (OracleTransaction)null, commandType, commandText, commandParameters);
1014
1015
//execute the command & return the results
1016
return cmd.ExecuteScalar();
1017
}
1018![](/Images/OutliningIndicators/InBlock.gif)
1019![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1020
/// Execute a stored procedure via an OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection
1021
/// using the provided parameter values. This method will query the database to discover the parameters for the
1022
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1023
/// </summary>
1024
/// <remarks>
1025
/// This method provides no access to output parameters or the stored procedure's return value parameter.
1026
///
1027
/// e.g.:
1028
/// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36);
1029
/// </remarks>
1030
/// <param name="connection">a valid OracleConnection</param>
1031
/// <param name="spName">the name of the stored procedure</param>
1032
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
1033
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1034
public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues)
1035![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1036
//if we got parameter values, we need to figure out where they go
1037
if ((parameterValues != null) && (parameterValues.Length > 0))
1038![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1039
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
1040
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
1041![](/Images/OutliningIndicators/InBlock.gif)
1042
//assign the provided values to these parameters based on parameter order
1043
AssignParameterValues(commandParameters, parameterValues);
1044![](/Images/OutliningIndicators/InBlock.gif)
1045
//call the overload that takes an array of OracleParameters
1046
return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);
1047
}
1048
//otherwise we can just call the SP without params
1049
else
1050![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1051
return ExecuteScalar(connection, CommandType.StoredProcedure, spName);
1052
}
1053
}
1054![](/Images/OutliningIndicators/InBlock.gif)
1055![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1056
/// Execute an OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction.
1057
/// </summary>
1058
/// <remarks>
1059
/// e.g.:
1060
/// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount");
1061
/// </remarks>
1062
/// <param name="transaction">a valid OracleTransaction</param>
1063
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1064
/// <param name="commandText">the stored procedure name or T-OleDb command</param>
1065
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1066
public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText)
1067![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1068
//pass through the call providing null for the set of OracleParameters
1069
return ExecuteScalar(transaction, commandType, commandText, (OracleParameter[])null);
1070
}
1071![](/Images/OutliningIndicators/InBlock.gif)
1072![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1073
/// Execute an OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction
1074
/// using the provided parameters.
1075
/// </summary>
1076
/// <remarks>
1077
/// e.g.:
1078
/// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24));
1079
/// </remarks>
1080
/// <param name="transaction">a valid OracleTransaction</param>
1081
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1082
/// <param name="commandText">the stored procedure name or T-OleDb command</param>
1083
/// <param name="commandParameters">an array of OracleParameters used to execute the command</param>
1084
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1085
public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
1086![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1087
//create a command and prepare it for execution
1088
OracleCommand cmd = new OracleCommand();
1089
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
1090
1091
//execute the command & return the results
1092
return cmd.ExecuteScalar();
1093![](/Images/OutliningIndicators/InBlock.gif)
1094
}
1095![](/Images/OutliningIndicators/InBlock.gif)
1096![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1097
/// Execute a stored procedure via an OracleCommand (that returns a 1x1 resultset) against the specified
1098
/// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the
1099
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1100
/// </summary>
1101
/// <remarks>
1102
/// This method provides no access to output parameters or the stored procedure's return value parameter.
1103
///
1104
/// e.g.:
1105
/// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36);
1106
/// </remarks>
1107
/// <param name="transaction">a valid OracleTransaction</param>
1108
/// <param name="spName">the name of the stored procedure</param>
1109
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
1110
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1111
public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues)
1112![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1113
//if we got parameter values, we need to figure out where they go
1114
if ((parameterValues != null) && (parameterValues.Length > 0))
1115![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1116
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
1117
OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName);
1118![](/Images/OutliningIndicators/InBlock.gif)
1119
//assign the provided values to these parameters based on parameter order
1120
AssignParameterValues(commandParameters, parameterValues);
1121![](/Images/OutliningIndicators/InBlock.gif)
1122
//call the overload that takes an array of OracleParameters
1123
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);
1124
}
1125
//otherwise we can just call the SP without params
1126
else
1127![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1128
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName);
1129
}
1130
}
1131![](/Images/OutliningIndicators/InBlock.gif)
1132
#endregion ExecuteScalar
1133
}
1134![](/Images/OutliningIndicators/InBlock.gif)
1135![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1136
/// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the
1137
/// ability to discover parameters for stored procedures at run-time.
1138
/// </summary>
1139
public sealed class OracleHelperParameterCache
1140![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1141![](/Images/OutliningIndicators/ContractedSubBlock.gif)
private methods, variables, and constructors#region private methods, variables, and constructors
1142![](/Images/OutliningIndicators/InBlock.gif)
1143
//Since this class provides only static methods, make the default constructor private to prevent
1144
//instances from being created with "new OracleHelperParameterCache()".
1145![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private OracleHelperParameterCache()
{}
1146![](/Images/OutliningIndicators/InBlock.gif)
1147
private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
1148![](/Images/OutliningIndicators/InBlock.gif)
1149![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1150
/// resolve at run-time the appropriate set of OracleParameters for a stored procedure
1151
/// </summary>
1152
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
1153
/// <param name="spName">the name of the stored procedure</param>
1154
/// <param name="includeReturnValueParameter">whether or not to include ther return value parameter</param>
1155
/// <returns></returns>
1156
private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
1157![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1158
using (OracleConnection cn = new OracleConnection(connectionString))
1159
using (OracleCommand cmd = new OracleCommand(spName,cn))
1160![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1161
cn.Open();
1162
cmd.CommandType = CommandType.StoredProcedure;
1163![](/Images/OutliningIndicators/InBlock.gif)
1164
OracleCommandBuilder.DeriveParameters(cmd);
1165![](/Images/OutliningIndicators/InBlock.gif)
1166
if (!includeReturnValueParameter)
1167![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1168
if (ParameterDirection.ReturnValue == cmd.Parameters[0].Direction)
1169
cmd.Parameters.RemoveAt(0);
1170
}
1171
1172
OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count];
1173![](/Images/OutliningIndicators/InBlock.gif)
1174
cmd.Parameters.CopyTo(discoveredParameters, 0);
1175![](/Images/OutliningIndicators/InBlock.gif)
1176
return discoveredParameters;
1177
}
1178
}
1179![](/Images/OutliningIndicators/InBlock.gif)
1180
//deep copy of cached OracleParameter array
1181
private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters)
1182![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1183
OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length];
1184![](/Images/OutliningIndicators/InBlock.gif)
1185
for (int i = 0, j = originalParameters.Length; i < j; i++)
1186![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1187
clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone();
1188
}
1189![](/Images/OutliningIndicators/InBlock.gif)
1190
return clonedParameters;
1191
}
1192![](/Images/OutliningIndicators/InBlock.gif)
1193
#endregion private methods, variables, and constructors
1194![](/Images/OutliningIndicators/InBlock.gif)
1195![](/Images/OutliningIndicators/ContractedSubBlock.gif)
caching functions#region caching functions
1196![](/Images/OutliningIndicators/InBlock.gif)
1197![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1198
/// add parameter array to the cache
1199
/// </summary>
1200
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
1201
/// <param name="commandText">the stored procedure name or T-OleDb command</param>
1202
/// <param name="commandParameters">an array of OracleParameters to be cached</param>
1203
public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters)
1204![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1205
string hashKey = connectionString + ":" + commandText;
1206![](/Images/OutliningIndicators/InBlock.gif)
1207
paramCache[hashKey] = commandParameters;
1208
}
1209![](/Images/OutliningIndicators/InBlock.gif)
1210![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1211
/// retrieve a parameter array from the cache
1212
/// </summary>
1213
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
1214
/// <param name="commandText">the stored procedure name or T-OleDb command</param>
1215
/// <returns>an array of OracleParameters</returns>
1216
public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText)
1217![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1218
string hashKey = connectionString + ":" + commandText;
1219![](/Images/OutliningIndicators/InBlock.gif)
1220
OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey];
1221
1222
if (cachedParameters == null)
1223![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1224
return null;
1225
}
1226
else
1227![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1228
return CloneParameters(cachedParameters);
1229
}
1230
}
1231![](/Images/OutliningIndicators/InBlock.gif)
1232
#endregion caching functions
1233![](/Images/OutliningIndicators/InBlock.gif)
1234![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Parameter Discovery Functions#region Parameter Discovery Functions
1235![](/Images/OutliningIndicators/InBlock.gif)
1236![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1237
/// Retrieves the set of OracleParameters appropriate for the stored procedure
1238
/// </summary>
1239
/// <remarks>
1240
/// This method will query the database for this information, and then store it in a cache for future requests.
1241
/// </remarks>
1242
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
1243
/// <param name="spName">the name of the stored procedure</param>
1244
/// <returns>an array of OracleParameters</returns>
1245
public static OracleParameter[] GetSpParameterSet(string connectionString, string spName)
1246![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1247
return GetSpParameterSet(connectionString, spName, false);
1248
}
1249![](/Images/OutliningIndicators/InBlock.gif)
1250![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1251
/// Retrieves the set of OracleParameters appropriate for the stored procedure
1252
/// </summary>
1253
/// <remarks>
1254
/// This method will query the database for this information, and then store it in a cache for future requests.
1255
/// </remarks>
1256
/// <param name="connectionString">a valid connection string for an OracleConnection</param>
1257
/// <param name="spName">the name of the stored procedure</param>
1258
/// <param name="includeReturnValueParameter">a bool value indicating whether the return value parameter should be included in the results</param>
1259
/// <returns>an array of OracleParameters</returns>
1260
public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
1261![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1262
string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter":"");
1263![](/Images/OutliningIndicators/InBlock.gif)
1264
OracleParameter[] cachedParameters;
1265
1266
cachedParameters = (OracleParameter[])paramCache[hashKey];
1267![](/Images/OutliningIndicators/InBlock.gif)
1268
if (cachedParameters == null)
1269![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1270
cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter));
1271
}
1272
1273
return CloneParameters(cachedParameters);
1274
}
1275![](/Images/OutliningIndicators/InBlock.gif)
1276
#endregion Parameter Discovery Functions
1277![](/Images/OutliningIndicators/InBlock.gif)
1278
}
1279
}
1280![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
32
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/InBlock.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/InBlock.gif)
168
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
171
![](/Images/OutliningIndicators/InBlock.gif)
172
![](/Images/OutliningIndicators/InBlock.gif)
173
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
174
![](/Images/OutliningIndicators/InBlock.gif)
175
![](/Images/OutliningIndicators/InBlock.gif)
176
![](/Images/OutliningIndicators/InBlock.gif)
177
![](/Images/OutliningIndicators/InBlock.gif)
178
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
179
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
180
![](/Images/OutliningIndicators/InBlock.gif)
181
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/InBlock.gif)
184
![](/Images/OutliningIndicators/InBlock.gif)
185
![](/Images/OutliningIndicators/InBlock.gif)
186
![](/Images/OutliningIndicators/InBlock.gif)
187
![](/Images/OutliningIndicators/InBlock.gif)
188
![](/Images/OutliningIndicators/InBlock.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/InBlock.gif)
191
![](/Images/OutliningIndicators/InBlock.gif)
192
![](/Images/OutliningIndicators/InBlock.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/InBlock.gif)
195
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/InBlock.gif)
200
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/InBlock.gif)
203
![](/Images/OutliningIndicators/InBlock.gif)
204
![](/Images/OutliningIndicators/InBlock.gif)
205
![](/Images/OutliningIndicators/InBlock.gif)
206
![](/Images/OutliningIndicators/InBlock.gif)
207
![](/Images/OutliningIndicators/InBlock.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
210
![](/Images/OutliningIndicators/InBlock.gif)
211
![](/Images/OutliningIndicators/InBlock.gif)
212
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
213
![](/Images/OutliningIndicators/InBlock.gif)
214
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
215
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
216
![](/Images/OutliningIndicators/InBlock.gif)
217
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
218
![](/Images/OutliningIndicators/InBlock.gif)
219
![](/Images/OutliningIndicators/InBlock.gif)
220
![](/Images/OutliningIndicators/InBlock.gif)
221
![](/Images/OutliningIndicators/InBlock.gif)
222
![](/Images/OutliningIndicators/InBlock.gif)
223
![](/Images/OutliningIndicators/InBlock.gif)
224
![](/Images/OutliningIndicators/InBlock.gif)
225
![](/Images/OutliningIndicators/InBlock.gif)
226
![](/Images/OutliningIndicators/InBlock.gif)
227
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
228
![](/Images/OutliningIndicators/InBlock.gif)
229
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
230
![](/Images/OutliningIndicators/InBlock.gif)
231
![](/Images/OutliningIndicators/InBlock.gif)
232
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
233
![](/Images/OutliningIndicators/InBlock.gif)
234
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
235
![](/Images/OutliningIndicators/InBlock.gif)
236
![](/Images/OutliningIndicators/InBlock.gif)
237
![](/Images/OutliningIndicators/InBlock.gif)
238
![](/Images/OutliningIndicators/InBlock.gif)
239
![](/Images/OutliningIndicators/InBlock.gif)
240
![](/Images/OutliningIndicators/InBlock.gif)
241
![](/Images/OutliningIndicators/InBlock.gif)
242
![](/Images/OutliningIndicators/InBlock.gif)
243
![](/Images/OutliningIndicators/InBlock.gif)
244
![](/Images/OutliningIndicators/InBlock.gif)
245
![](/Images/OutliningIndicators/InBlock.gif)
246
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
247
![](/Images/OutliningIndicators/InBlock.gif)
248
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
249
![](/Images/OutliningIndicators/InBlock.gif)
250
![](/Images/OutliningIndicators/InBlock.gif)
251
![](/Images/OutliningIndicators/InBlock.gif)
252
![](/Images/OutliningIndicators/InBlock.gif)
253
![](/Images/OutliningIndicators/InBlock.gif)
254
![](/Images/OutliningIndicators/InBlock.gif)
255
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
256
![](/Images/OutliningIndicators/InBlock.gif)
257
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
258
![](/Images/OutliningIndicators/InBlock.gif)
259
![](/Images/OutliningIndicators/InBlock.gif)
260
![](/Images/OutliningIndicators/InBlock.gif)
261
![](/Images/OutliningIndicators/InBlock.gif)
262
![](/Images/OutliningIndicators/InBlock.gif)
263
![](/Images/OutliningIndicators/InBlock.gif)
264
![](/Images/OutliningIndicators/InBlock.gif)
265
![](/Images/OutliningIndicators/InBlock.gif)
266
![](/Images/OutliningIndicators/InBlock.gif)
267
![](/Images/OutliningIndicators/InBlock.gif)
268
![](/Images/OutliningIndicators/InBlock.gif)
269
![](/Images/OutliningIndicators/InBlock.gif)
270
![](/Images/OutliningIndicators/InBlock.gif)
271
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
272
![](/Images/OutliningIndicators/InBlock.gif)
273
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
274
![](/Images/OutliningIndicators/InBlock.gif)
275
![](/Images/OutliningIndicators/InBlock.gif)
276
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
277
![](/Images/OutliningIndicators/InBlock.gif)
278
![](/Images/OutliningIndicators/InBlock.gif)
279
![](/Images/OutliningIndicators/InBlock.gif)
280
![](/Images/OutliningIndicators/InBlock.gif)
281
![](/Images/OutliningIndicators/InBlock.gif)
282
![](/Images/OutliningIndicators/InBlock.gif)
283
![](/Images/OutliningIndicators/InBlock.gif)
284
![](/Images/OutliningIndicators/InBlock.gif)
285
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
286
![](/Images/OutliningIndicators/InBlock.gif)
287
![](/Images/OutliningIndicators/InBlock.gif)
288
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
289
![](/Images/OutliningIndicators/InBlock.gif)
290
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
291
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
292
![](/Images/OutliningIndicators/InBlock.gif)
293
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
294
![](/Images/OutliningIndicators/InBlock.gif)
295
![](/Images/OutliningIndicators/InBlock.gif)
296
![](/Images/OutliningIndicators/InBlock.gif)
297
![](/Images/OutliningIndicators/InBlock.gif)
298
![](/Images/OutliningIndicators/InBlock.gif)
299
![](/Images/OutliningIndicators/InBlock.gif)
300
![](/Images/OutliningIndicators/InBlock.gif)
301
![](/Images/OutliningIndicators/InBlock.gif)
302
![](/Images/OutliningIndicators/InBlock.gif)
303
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
304
![](/Images/OutliningIndicators/InBlock.gif)
305
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
306
![](/Images/OutliningIndicators/InBlock.gif)
307
![](/Images/OutliningIndicators/InBlock.gif)
308
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
309
![](/Images/OutliningIndicators/InBlock.gif)
310
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
311
![](/Images/OutliningIndicators/InBlock.gif)
312
![](/Images/OutliningIndicators/InBlock.gif)
313
![](/Images/OutliningIndicators/InBlock.gif)
314
![](/Images/OutliningIndicators/InBlock.gif)
315
![](/Images/OutliningIndicators/InBlock.gif)
316
![](/Images/OutliningIndicators/InBlock.gif)
317
![](/Images/OutliningIndicators/InBlock.gif)
318
![](/Images/OutliningIndicators/InBlock.gif)
319
![](/Images/OutliningIndicators/InBlock.gif)
320
![](/Images/OutliningIndicators/InBlock.gif)
321
![](/Images/OutliningIndicators/InBlock.gif)
322
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
323
![](/Images/OutliningIndicators/InBlock.gif)
324
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
325
![](/Images/OutliningIndicators/InBlock.gif)
326
![](/Images/OutliningIndicators/InBlock.gif)
327
![](/Images/OutliningIndicators/InBlock.gif)
328
![](/Images/OutliningIndicators/InBlock.gif)
329
![](/Images/OutliningIndicators/InBlock.gif)
330
![](/Images/OutliningIndicators/InBlock.gif)
331
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
332
![](/Images/OutliningIndicators/InBlock.gif)
333
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
334
![](/Images/OutliningIndicators/InBlock.gif)
335
![](/Images/OutliningIndicators/InBlock.gif)
336
![](/Images/OutliningIndicators/InBlock.gif)
337
![](/Images/OutliningIndicators/InBlock.gif)
338
![](/Images/OutliningIndicators/InBlock.gif)
339
![](/Images/OutliningIndicators/InBlock.gif)
340
![](/Images/OutliningIndicators/InBlock.gif)
341
![](/Images/OutliningIndicators/InBlock.gif)
342
![](/Images/OutliningIndicators/InBlock.gif)
343
![](/Images/OutliningIndicators/InBlock.gif)
344
![](/Images/OutliningIndicators/InBlock.gif)
345
![](/Images/OutliningIndicators/InBlock.gif)
346
![](/Images/OutliningIndicators/InBlock.gif)
347
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
348
![](/Images/OutliningIndicators/InBlock.gif)
349
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
350
![](/Images/OutliningIndicators/InBlock.gif)
351
![](/Images/OutliningIndicators/InBlock.gif)
352
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
353
![](/Images/OutliningIndicators/InBlock.gif)
354
![](/Images/OutliningIndicators/InBlock.gif)
355
![](/Images/OutliningIndicators/InBlock.gif)
356
![](/Images/OutliningIndicators/InBlock.gif)
357
![](/Images/OutliningIndicators/InBlock.gif)
358
![](/Images/OutliningIndicators/InBlock.gif)
359
![](/Images/OutliningIndicators/InBlock.gif)
360
![](/Images/OutliningIndicators/InBlock.gif)
361
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
362
![](/Images/OutliningIndicators/InBlock.gif)
363
![](/Images/OutliningIndicators/InBlock.gif)
364
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
365
![](/Images/OutliningIndicators/InBlock.gif)
366
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
367
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
368
![](/Images/OutliningIndicators/InBlock.gif)
369
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
370
![](/Images/OutliningIndicators/InBlock.gif)
371
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
372
![](/Images/OutliningIndicators/InBlock.gif)
373
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
374
![](/Images/OutliningIndicators/InBlock.gif)
375
![](/Images/OutliningIndicators/InBlock.gif)
376
![](/Images/OutliningIndicators/InBlock.gif)
377
![](/Images/OutliningIndicators/InBlock.gif)
378
![](/Images/OutliningIndicators/InBlock.gif)
379
![](/Images/OutliningIndicators/InBlock.gif)
380
![](/Images/OutliningIndicators/InBlock.gif)
381
![](/Images/OutliningIndicators/InBlock.gif)
382
![](/Images/OutliningIndicators/InBlock.gif)
383
![](/Images/OutliningIndicators/InBlock.gif)
384
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
385
![](/Images/OutliningIndicators/InBlock.gif)
386
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
387
![](/Images/OutliningIndicators/InBlock.gif)
388
![](/Images/OutliningIndicators/InBlock.gif)
389
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
390
![](/Images/OutliningIndicators/InBlock.gif)
391
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
392
![](/Images/OutliningIndicators/InBlock.gif)
393
![](/Images/OutliningIndicators/InBlock.gif)
394
![](/Images/OutliningIndicators/InBlock.gif)
395
![](/Images/OutliningIndicators/InBlock.gif)
396
![](/Images/OutliningIndicators/InBlock.gif)
397
![](/Images/OutliningIndicators/InBlock.gif)
398
![](/Images/OutliningIndicators/InBlock.gif)
399
![](/Images/OutliningIndicators/InBlock.gif)
400
![](/Images/OutliningIndicators/InBlock.gif)
401
![](/Images/OutliningIndicators/InBlock.gif)
402
![](/Images/OutliningIndicators/InBlock.gif)
403
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
404
![](/Images/OutliningIndicators/InBlock.gif)
405
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
406
![](/Images/OutliningIndicators/InBlock.gif)
407
![](/Images/OutliningIndicators/InBlock.gif)
408
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
409
![](/Images/OutliningIndicators/InBlock.gif)
410
![](/Images/OutliningIndicators/InBlock.gif)
411
![](/Images/OutliningIndicators/InBlock.gif)
412
![](/Images/OutliningIndicators/InBlock.gif)
413
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
414
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
415
![](/Images/OutliningIndicators/InBlock.gif)
416
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
417
![](/Images/OutliningIndicators/InBlock.gif)
418
![](/Images/OutliningIndicators/InBlock.gif)
419
![](/Images/OutliningIndicators/InBlock.gif)
420
![](/Images/OutliningIndicators/InBlock.gif)
421
![](/Images/OutliningIndicators/InBlock.gif)
422
![](/Images/OutliningIndicators/InBlock.gif)
423
![](/Images/OutliningIndicators/InBlock.gif)
424
![](/Images/OutliningIndicators/InBlock.gif)
425
![](/Images/OutliningIndicators/InBlock.gif)
426
![](/Images/OutliningIndicators/InBlock.gif)
427
![](/Images/OutliningIndicators/InBlock.gif)
428
![](/Images/OutliningIndicators/InBlock.gif)
429
![](/Images/OutliningIndicators/InBlock.gif)
430
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
431
![](/Images/OutliningIndicators/InBlock.gif)
432
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
433
![](/Images/OutliningIndicators/InBlock.gif)
434
![](/Images/OutliningIndicators/InBlock.gif)
435
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
436
![](/Images/OutliningIndicators/InBlock.gif)
437
![](/Images/OutliningIndicators/InBlock.gif)
438
![](/Images/OutliningIndicators/InBlock.gif)
439
![](/Images/OutliningIndicators/InBlock.gif)
440
![](/Images/OutliningIndicators/InBlock.gif)
441
![](/Images/OutliningIndicators/InBlock.gif)
442
![](/Images/OutliningIndicators/InBlock.gif)
443
![](/Images/OutliningIndicators/InBlock.gif)
444
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
445
![](/Images/OutliningIndicators/InBlock.gif)
446
![](/Images/OutliningIndicators/InBlock.gif)
447
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
448
![](/Images/OutliningIndicators/InBlock.gif)
449
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
450
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
451
![](/Images/OutliningIndicators/InBlock.gif)
452
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
453
![](/Images/OutliningIndicators/InBlock.gif)
454
![](/Images/OutliningIndicators/InBlock.gif)
455
![](/Images/OutliningIndicators/InBlock.gif)
456
![](/Images/OutliningIndicators/InBlock.gif)
457
![](/Images/OutliningIndicators/InBlock.gif)
458
![](/Images/OutliningIndicators/InBlock.gif)
459
![](/Images/OutliningIndicators/InBlock.gif)
460
![](/Images/OutliningIndicators/InBlock.gif)
461
![](/Images/OutliningIndicators/InBlock.gif)
462
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
463
![](/Images/OutliningIndicators/InBlock.gif)
464
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
465
![](/Images/OutliningIndicators/InBlock.gif)
466
![](/Images/OutliningIndicators/InBlock.gif)
467
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
468
![](/Images/OutliningIndicators/InBlock.gif)
469
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
470
![](/Images/OutliningIndicators/InBlock.gif)
471
![](/Images/OutliningIndicators/InBlock.gif)
472
![](/Images/OutliningIndicators/InBlock.gif)
473
![](/Images/OutliningIndicators/InBlock.gif)
474
![](/Images/OutliningIndicators/InBlock.gif)
475
![](/Images/OutliningIndicators/InBlock.gif)
476
![](/Images/OutliningIndicators/InBlock.gif)
477
![](/Images/OutliningIndicators/InBlock.gif)
478
![](/Images/OutliningIndicators/InBlock.gif)
479
![](/Images/OutliningIndicators/InBlock.gif)
480
![](/Images/OutliningIndicators/InBlock.gif)
481
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
482
![](/Images/OutliningIndicators/InBlock.gif)
483
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
484
![](/Images/OutliningIndicators/InBlock.gif)
485
![](/Images/OutliningIndicators/InBlock.gif)
486
![](/Images/OutliningIndicators/InBlock.gif)
487
![](/Images/OutliningIndicators/InBlock.gif)
488
![](/Images/OutliningIndicators/InBlock.gif)
489
![](/Images/OutliningIndicators/InBlock.gif)
490
![](/Images/OutliningIndicators/InBlock.gif)
491
![](/Images/OutliningIndicators/InBlock.gif)
492
![](/Images/OutliningIndicators/InBlock.gif)
493
![](/Images/OutliningIndicators/InBlock.gif)
494
![](/Images/OutliningIndicators/InBlock.gif)
495
![](/Images/OutliningIndicators/InBlock.gif)
496
![](/Images/OutliningIndicators/InBlock.gif)
497
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
498
![](/Images/OutliningIndicators/InBlock.gif)
499
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
500
![](/Images/OutliningIndicators/InBlock.gif)
501
![](/Images/OutliningIndicators/InBlock.gif)
502
![](/Images/OutliningIndicators/InBlock.gif)
503
![](/Images/OutliningIndicators/InBlock.gif)
504
![](/Images/OutliningIndicators/InBlock.gif)
505
![](/Images/OutliningIndicators/InBlock.gif)
506
![](/Images/OutliningIndicators/InBlock.gif)
507
![](/Images/OutliningIndicators/InBlock.gif)
508
![](/Images/OutliningIndicators/InBlock.gif)
509
![](/Images/OutliningIndicators/InBlock.gif)
510
![](/Images/OutliningIndicators/InBlock.gif)
511
![](/Images/OutliningIndicators/InBlock.gif)
512
![](/Images/OutliningIndicators/InBlock.gif)
513
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
514
![](/Images/OutliningIndicators/InBlock.gif)
515
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
516
![](/Images/OutliningIndicators/InBlock.gif)
517
![](/Images/OutliningIndicators/InBlock.gif)
518
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
519
![](/Images/OutliningIndicators/InBlock.gif)
520
![](/Images/OutliningIndicators/InBlock.gif)
521
![](/Images/OutliningIndicators/InBlock.gif)
522
![](/Images/OutliningIndicators/InBlock.gif)
523
![](/Images/OutliningIndicators/InBlock.gif)
524
![](/Images/OutliningIndicators/InBlock.gif)
525
![](/Images/OutliningIndicators/InBlock.gif)
526
![](/Images/OutliningIndicators/InBlock.gif)
527
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
528
![](/Images/OutliningIndicators/InBlock.gif)
529
![](/Images/OutliningIndicators/InBlock.gif)
530
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
531
![](/Images/OutliningIndicators/InBlock.gif)
532
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
533
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
534
![](/Images/OutliningIndicators/InBlock.gif)
535
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
536
![](/Images/OutliningIndicators/InBlock.gif)
537
![](/Images/OutliningIndicators/InBlock.gif)
538
![](/Images/OutliningIndicators/InBlock.gif)
539
![](/Images/OutliningIndicators/InBlock.gif)
540
![](/Images/OutliningIndicators/InBlock.gif)
541
![](/Images/OutliningIndicators/InBlock.gif)
542
![](/Images/OutliningIndicators/InBlock.gif)
543
![](/Images/OutliningIndicators/InBlock.gif)
544
![](/Images/OutliningIndicators/InBlock.gif)
545
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
546
![](/Images/OutliningIndicators/InBlock.gif)
547
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
548
![](/Images/OutliningIndicators/InBlock.gif)
549
![](/Images/OutliningIndicators/InBlock.gif)
550
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
551
![](/Images/OutliningIndicators/InBlock.gif)
552
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
553
![](/Images/OutliningIndicators/InBlock.gif)
554
![](/Images/OutliningIndicators/InBlock.gif)
555
![](/Images/OutliningIndicators/InBlock.gif)
556
![](/Images/OutliningIndicators/InBlock.gif)
557
![](/Images/OutliningIndicators/InBlock.gif)
558
![](/Images/OutliningIndicators/InBlock.gif)
559
![](/Images/OutliningIndicators/InBlock.gif)
560
![](/Images/OutliningIndicators/InBlock.gif)
561
![](/Images/OutliningIndicators/InBlock.gif)
562
![](/Images/OutliningIndicators/InBlock.gif)
563
![](/Images/OutliningIndicators/InBlock.gif)
564
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
565
![](/Images/OutliningIndicators/InBlock.gif)
566
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
567
![](/Images/OutliningIndicators/InBlock.gif)
568
![](/Images/OutliningIndicators/InBlock.gif)
569
![](/Images/OutliningIndicators/InBlock.gif)
570
![](/Images/OutliningIndicators/InBlock.gif)
571
![](/Images/OutliningIndicators/InBlock.gif)
572
![](/Images/OutliningIndicators/InBlock.gif)
573
![](/Images/OutliningIndicators/InBlock.gif)
574
![](/Images/OutliningIndicators/InBlock.gif)
575
![](/Images/OutliningIndicators/InBlock.gif)
576
![](/Images/OutliningIndicators/InBlock.gif)
577
![](/Images/OutliningIndicators/InBlock.gif)
578
![](/Images/OutliningIndicators/InBlock.gif)
579
![](/Images/OutliningIndicators/InBlock.gif)
580
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
581
![](/Images/OutliningIndicators/InBlock.gif)
582
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
583
![](/Images/OutliningIndicators/InBlock.gif)
584
![](/Images/OutliningIndicators/InBlock.gif)
585
![](/Images/OutliningIndicators/InBlock.gif)
586
![](/Images/OutliningIndicators/InBlock.gif)
587
![](/Images/OutliningIndicators/InBlock.gif)
588
![](/Images/OutliningIndicators/InBlock.gif)
589
![](/Images/OutliningIndicators/InBlock.gif)
590
![](/Images/OutliningIndicators/InBlock.gif)
591
![](/Images/OutliningIndicators/InBlock.gif)
592
![](/Images/OutliningIndicators/InBlock.gif)
593
![](/Images/OutliningIndicators/InBlock.gif)
594
![](/Images/OutliningIndicators/InBlock.gif)
595
![](/Images/OutliningIndicators/InBlock.gif)
596
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
597
![](/Images/OutliningIndicators/InBlock.gif)
598
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
599
![](/Images/OutliningIndicators/InBlock.gif)
600
![](/Images/OutliningIndicators/InBlock.gif)
601
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
602
![](/Images/OutliningIndicators/InBlock.gif)
603
![](/Images/OutliningIndicators/InBlock.gif)
604
![](/Images/OutliningIndicators/InBlock.gif)
605
![](/Images/OutliningIndicators/InBlock.gif)
606
![](/Images/OutliningIndicators/InBlock.gif)
607
![](/Images/OutliningIndicators/InBlock.gif)
608
![](/Images/OutliningIndicators/InBlock.gif)
609
![](/Images/OutliningIndicators/InBlock.gif)
610
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
611
![](/Images/OutliningIndicators/InBlock.gif)
612
![](/Images/OutliningIndicators/InBlock.gif)
613
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
614
![](/Images/OutliningIndicators/InBlock.gif)
615
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
616
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
617
![](/Images/OutliningIndicators/InBlock.gif)
618
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
619
![](/Images/OutliningIndicators/InBlock.gif)
620
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
621
![](/Images/OutliningIndicators/InBlock.gif)
622
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
623
![](/Images/OutliningIndicators/InBlock.gif)
624
![](/Images/OutliningIndicators/InBlock.gif)
625
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
626
![](/Images/OutliningIndicators/InBlock.gif)
627
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
628
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
629
![](/Images/OutliningIndicators/InBlock.gif)
630
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
631
![](/Images/OutliningIndicators/InBlock.gif)
632
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
633
![](/Images/OutliningIndicators/InBlock.gif)
634
![](/Images/OutliningIndicators/InBlock.gif)
635
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
636
![](/Images/OutliningIndicators/InBlock.gif)
637
![](/Images/OutliningIndicators/InBlock.gif)
638
![](/Images/OutliningIndicators/InBlock.gif)
639
![](/Images/OutliningIndicators/InBlock.gif)
640
![](/Images/OutliningIndicators/InBlock.gif)
641
![](/Images/OutliningIndicators/InBlock.gif)
642
![](/Images/OutliningIndicators/InBlock.gif)
643
![](/Images/OutliningIndicators/InBlock.gif)
644
![](/Images/OutliningIndicators/InBlock.gif)
645
![](/Images/OutliningIndicators/InBlock.gif)
646
![](/Images/OutliningIndicators/InBlock.gif)
647
![](/Images/OutliningIndicators/InBlock.gif)
648
![](/Images/OutliningIndicators/InBlock.gif)
649
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
650
![](/Images/OutliningIndicators/InBlock.gif)
651
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
652
![](/Images/OutliningIndicators/InBlock.gif)
653
![](/Images/OutliningIndicators/InBlock.gif)
654
![](/Images/OutliningIndicators/InBlock.gif)
655
![](/Images/OutliningIndicators/InBlock.gif)
656
![](/Images/OutliningIndicators/InBlock.gif)
657
![](/Images/OutliningIndicators/InBlock.gif)
658
![](/Images/OutliningIndicators/InBlock.gif)
659
![](/Images/OutliningIndicators/InBlock.gif)
660
![](/Images/OutliningIndicators/InBlock.gif)
661
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
662
![](/Images/OutliningIndicators/InBlock.gif)
663
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
664
![](/Images/OutliningIndicators/InBlock.gif)
665
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
666
![](/Images/OutliningIndicators/InBlock.gif)
667
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
668
![](/Images/OutliningIndicators/InBlock.gif)
669
![](/Images/OutliningIndicators/InBlock.gif)
670
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
671
![](/Images/OutliningIndicators/InBlock.gif)
672
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
673
![](/Images/OutliningIndicators/InBlock.gif)
674
![](/Images/OutliningIndicators/InBlock.gif)
675
![](/Images/OutliningIndicators/InBlock.gif)
676
![](/Images/OutliningIndicators/InBlock.gif)
677
![](/Images/OutliningIndicators/InBlock.gif)
678
![](/Images/OutliningIndicators/InBlock.gif)
679
![](/Images/OutliningIndicators/InBlock.gif)
680
![](/Images/OutliningIndicators/InBlock.gif)
681
![](/Images/OutliningIndicators/InBlock.gif)
682
![](/Images/OutliningIndicators/InBlock.gif)
683
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
684
![](/Images/OutliningIndicators/InBlock.gif)
685
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
686
![](/Images/OutliningIndicators/InBlock.gif)
687
![](/Images/OutliningIndicators/InBlock.gif)
688
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
689
![](/Images/OutliningIndicators/InBlock.gif)
690
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
691
![](/Images/OutliningIndicators/InBlock.gif)
692
![](/Images/OutliningIndicators/InBlock.gif)
693
![](/Images/OutliningIndicators/InBlock.gif)
694
![](/Images/OutliningIndicators/InBlock.gif)
695
![](/Images/OutliningIndicators/InBlock.gif)
696
![](/Images/OutliningIndicators/InBlock.gif)
697
![](/Images/OutliningIndicators/InBlock.gif)
698
![](/Images/OutliningIndicators/InBlock.gif)
699
![](/Images/OutliningIndicators/InBlock.gif)
700
![](/Images/OutliningIndicators/InBlock.gif)
701
![](/Images/OutliningIndicators/InBlock.gif)
702
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
703
![](/Images/OutliningIndicators/InBlock.gif)
704
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
705
![](/Images/OutliningIndicators/InBlock.gif)
706
![](/Images/OutliningIndicators/InBlock.gif)
707
![](/Images/OutliningIndicators/InBlock.gif)
708
![](/Images/OutliningIndicators/InBlock.gif)
709
![](/Images/OutliningIndicators/InBlock.gif)
710
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
711
![](/Images/OutliningIndicators/InBlock.gif)
712
![](/Images/OutliningIndicators/InBlock.gif)
713
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
714
![](/Images/OutliningIndicators/InBlock.gif)
715
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
716
![](/Images/OutliningIndicators/InBlock.gif)
717
![](/Images/OutliningIndicators/InBlock.gif)
718
![](/Images/OutliningIndicators/InBlock.gif)
719
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
720
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
721
![](/Images/OutliningIndicators/InBlock.gif)
722
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
723
![](/Images/OutliningIndicators/InBlock.gif)
724
![](/Images/OutliningIndicators/InBlock.gif)
725
![](/Images/OutliningIndicators/InBlock.gif)
726
![](/Images/OutliningIndicators/InBlock.gif)
727
![](/Images/OutliningIndicators/InBlock.gif)
728
![](/Images/OutliningIndicators/InBlock.gif)
729
![](/Images/OutliningIndicators/InBlock.gif)
730
![](/Images/OutliningIndicators/InBlock.gif)
731
![](/Images/OutliningIndicators/InBlock.gif)
732
![](/Images/OutliningIndicators/InBlock.gif)
733
![](/Images/OutliningIndicators/InBlock.gif)
734
![](/Images/OutliningIndicators/InBlock.gif)
735
![](/Images/OutliningIndicators/InBlock.gif)
736
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
737
![](/Images/OutliningIndicators/InBlock.gif)
738
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
739
![](/Images/OutliningIndicators/InBlock.gif)
740
![](/Images/OutliningIndicators/InBlock.gif)
741
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
742
![](/Images/OutliningIndicators/InBlock.gif)
743
![](/Images/OutliningIndicators/InBlock.gif)
744
![](/Images/OutliningIndicators/InBlock.gif)
745
![](/Images/OutliningIndicators/InBlock.gif)
746
![](/Images/OutliningIndicators/InBlock.gif)
747
![](/Images/OutliningIndicators/InBlock.gif)
748
![](/Images/OutliningIndicators/InBlock.gif)
749
![](/Images/OutliningIndicators/InBlock.gif)
750
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
751
![](/Images/OutliningIndicators/InBlock.gif)
752
![](/Images/OutliningIndicators/InBlock.gif)
753
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
754
![](/Images/OutliningIndicators/InBlock.gif)
755
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
756
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
757
![](/Images/OutliningIndicators/InBlock.gif)
758
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
759
![](/Images/OutliningIndicators/InBlock.gif)
760
![](/Images/OutliningIndicators/InBlock.gif)
761
![](/Images/OutliningIndicators/InBlock.gif)
762
![](/Images/OutliningIndicators/InBlock.gif)
763
![](/Images/OutliningIndicators/InBlock.gif)
764
![](/Images/OutliningIndicators/InBlock.gif)
765
![](/Images/OutliningIndicators/InBlock.gif)
766
![](/Images/OutliningIndicators/InBlock.gif)
767
![](/Images/OutliningIndicators/InBlock.gif)
768
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
769
![](/Images/OutliningIndicators/InBlock.gif)
770
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
771
![](/Images/OutliningIndicators/InBlock.gif)
772
![](/Images/OutliningIndicators/InBlock.gif)
773
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
774
![](/Images/OutliningIndicators/InBlock.gif)
775
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
776
![](/Images/OutliningIndicators/InBlock.gif)
777
![](/Images/OutliningIndicators/InBlock.gif)
778
![](/Images/OutliningIndicators/InBlock.gif)
779
![](/Images/OutliningIndicators/InBlock.gif)
780
![](/Images/OutliningIndicators/InBlock.gif)
781
![](/Images/OutliningIndicators/InBlock.gif)
782
![](/Images/OutliningIndicators/InBlock.gif)
783
![](/Images/OutliningIndicators/InBlock.gif)
784
![](/Images/OutliningIndicators/InBlock.gif)
785
![](/Images/OutliningIndicators/InBlock.gif)
786
![](/Images/OutliningIndicators/InBlock.gif)
787
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
788
![](/Images/OutliningIndicators/InBlock.gif)
789
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
790
![](/Images/OutliningIndicators/InBlock.gif)
791
![](/Images/OutliningIndicators/InBlock.gif)
792
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
793
![](/Images/OutliningIndicators/InBlock.gif)
794
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
795
![](/Images/OutliningIndicators/InBlock.gif)
796
![](/Images/OutliningIndicators/InBlock.gif)
797
![](/Images/OutliningIndicators/InBlock.gif)
798
![](/Images/OutliningIndicators/InBlock.gif)
799
![](/Images/OutliningIndicators/InBlock.gif)
800
![](/Images/OutliningIndicators/InBlock.gif)
801
![](/Images/OutliningIndicators/InBlock.gif)
802
![](/Images/OutliningIndicators/InBlock.gif)
803
![](/Images/OutliningIndicators/InBlock.gif)
804
![](/Images/OutliningIndicators/InBlock.gif)
805
![](/Images/OutliningIndicators/InBlock.gif)
806
![](/Images/OutliningIndicators/InBlock.gif)
807
![](/Images/OutliningIndicators/InBlock.gif)
808
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
809
![](/Images/OutliningIndicators/InBlock.gif)
810
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
811
![](/Images/OutliningIndicators/InBlock.gif)
812
![](/Images/OutliningIndicators/InBlock.gif)
813
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
814
![](/Images/OutliningIndicators/InBlock.gif)
815
![](/Images/OutliningIndicators/InBlock.gif)
816
![](/Images/OutliningIndicators/InBlock.gif)
817
![](/Images/OutliningIndicators/InBlock.gif)
818
![](/Images/OutliningIndicators/InBlock.gif)
819
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
820
![](/Images/OutliningIndicators/InBlock.gif)
821
![](/Images/OutliningIndicators/InBlock.gif)
822
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
823
![](/Images/OutliningIndicators/InBlock.gif)
824
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
825
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
826
![](/Images/OutliningIndicators/InBlock.gif)
827
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
828
![](/Images/OutliningIndicators/InBlock.gif)
829
![](/Images/OutliningIndicators/InBlock.gif)
830
![](/Images/OutliningIndicators/InBlock.gif)
831
![](/Images/OutliningIndicators/InBlock.gif)
832
![](/Images/OutliningIndicators/InBlock.gif)
833
![](/Images/OutliningIndicators/InBlock.gif)
834
![](/Images/OutliningIndicators/InBlock.gif)
835
![](/Images/OutliningIndicators/InBlock.gif)
836
![](/Images/OutliningIndicators/InBlock.gif)
837
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
838
![](/Images/OutliningIndicators/InBlock.gif)
839
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
840
![](/Images/OutliningIndicators/InBlock.gif)
841
![](/Images/OutliningIndicators/InBlock.gif)
842
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
843
![](/Images/OutliningIndicators/InBlock.gif)
844
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
845
![](/Images/OutliningIndicators/InBlock.gif)
846
![](/Images/OutliningIndicators/InBlock.gif)
847
![](/Images/OutliningIndicators/InBlock.gif)
848
![](/Images/OutliningIndicators/InBlock.gif)
849
![](/Images/OutliningIndicators/InBlock.gif)
850
![](/Images/OutliningIndicators/InBlock.gif)
851
![](/Images/OutliningIndicators/InBlock.gif)
852
![](/Images/OutliningIndicators/InBlock.gif)
853
![](/Images/OutliningIndicators/InBlock.gif)
854
![](/Images/OutliningIndicators/InBlock.gif)
855
![](/Images/OutliningIndicators/InBlock.gif)
856
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
857
![](/Images/OutliningIndicators/InBlock.gif)
858
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
859
![](/Images/OutliningIndicators/InBlock.gif)
860
![](/Images/OutliningIndicators/InBlock.gif)
861
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
862
![](/Images/OutliningIndicators/InBlock.gif)
863
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
864
![](/Images/OutliningIndicators/InBlock.gif)
865
![](/Images/OutliningIndicators/InBlock.gif)
866
![](/Images/OutliningIndicators/InBlock.gif)
867
![](/Images/OutliningIndicators/InBlock.gif)
868
![](/Images/OutliningIndicators/InBlock.gif)
869
![](/Images/OutliningIndicators/InBlock.gif)
870
![](/Images/OutliningIndicators/InBlock.gif)
871
![](/Images/OutliningIndicators/InBlock.gif)
872
![](/Images/OutliningIndicators/InBlock.gif)
873
![](/Images/OutliningIndicators/InBlock.gif)
874
![](/Images/OutliningIndicators/InBlock.gif)
875
![](/Images/OutliningIndicators/InBlock.gif)
876
![](/Images/OutliningIndicators/InBlock.gif)
877
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
878
![](/Images/OutliningIndicators/InBlock.gif)
879
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
880
![](/Images/OutliningIndicators/InBlock.gif)
881
![](/Images/OutliningIndicators/InBlock.gif)
882
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
883
![](/Images/OutliningIndicators/InBlock.gif)
884
![](/Images/OutliningIndicators/InBlock.gif)
885
![](/Images/OutliningIndicators/InBlock.gif)
886
![](/Images/OutliningIndicators/InBlock.gif)
887
![](/Images/OutliningIndicators/InBlock.gif)
888
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
889
![](/Images/OutliningIndicators/InBlock.gif)
890
![](/Images/OutliningIndicators/InBlock.gif)
891
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
892
![](/Images/OutliningIndicators/InBlock.gif)
893
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
894
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
895
![](/Images/OutliningIndicators/InBlock.gif)
896
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
897
![](/Images/OutliningIndicators/InBlock.gif)
898
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
899
![](/Images/OutliningIndicators/InBlock.gif)
900
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
901
![](/Images/OutliningIndicators/InBlock.gif)
902
![](/Images/OutliningIndicators/InBlock.gif)
903
![](/Images/OutliningIndicators/InBlock.gif)
904
![](/Images/OutliningIndicators/InBlock.gif)
905
![](/Images/OutliningIndicators/InBlock.gif)
906
![](/Images/OutliningIndicators/InBlock.gif)
907
![](/Images/OutliningIndicators/InBlock.gif)
908
![](/Images/OutliningIndicators/InBlock.gif)
909
![](/Images/OutliningIndicators/InBlock.gif)
910
![](/Images/OutliningIndicators/InBlock.gif)
911
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
912
![](/Images/OutliningIndicators/InBlock.gif)
913
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
914
![](/Images/OutliningIndicators/InBlock.gif)
915
![](/Images/OutliningIndicators/InBlock.gif)
916
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
917
![](/Images/OutliningIndicators/InBlock.gif)
918
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
919
![](/Images/OutliningIndicators/InBlock.gif)
920
![](/Images/OutliningIndicators/InBlock.gif)
921
![](/Images/OutliningIndicators/InBlock.gif)
922
![](/Images/OutliningIndicators/InBlock.gif)
923
![](/Images/OutliningIndicators/InBlock.gif)
924
![](/Images/OutliningIndicators/InBlock.gif)
925
![](/Images/OutliningIndicators/InBlock.gif)
926
![](/Images/OutliningIndicators/InBlock.gif)
927
![](/Images/OutliningIndicators/InBlock.gif)
928
![](/Images/OutliningIndicators/InBlock.gif)
929
![](/Images/OutliningIndicators/InBlock.gif)
930
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
931
![](/Images/OutliningIndicators/InBlock.gif)
932
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
933
![](/Images/OutliningIndicators/InBlock.gif)
934
![](/Images/OutliningIndicators/InBlock.gif)
935
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
936
![](/Images/OutliningIndicators/InBlock.gif)
937
![](/Images/OutliningIndicators/InBlock.gif)
938
![](/Images/OutliningIndicators/InBlock.gif)
939
![](/Images/OutliningIndicators/InBlock.gif)
940
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
941
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
942
![](/Images/OutliningIndicators/InBlock.gif)
943
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
944
![](/Images/OutliningIndicators/InBlock.gif)
945
![](/Images/OutliningIndicators/InBlock.gif)
946
![](/Images/OutliningIndicators/InBlock.gif)
947
![](/Images/OutliningIndicators/InBlock.gif)
948
![](/Images/OutliningIndicators/InBlock.gif)
949
![](/Images/OutliningIndicators/InBlock.gif)
950
![](/Images/OutliningIndicators/InBlock.gif)
951
![](/Images/OutliningIndicators/InBlock.gif)
952
![](/Images/OutliningIndicators/InBlock.gif)
953
![](/Images/OutliningIndicators/InBlock.gif)
954
![](/Images/OutliningIndicators/InBlock.gif)
955
![](/Images/OutliningIndicators/InBlock.gif)
956
![](/Images/OutliningIndicators/InBlock.gif)
957
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
958
![](/Images/OutliningIndicators/InBlock.gif)
959
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
960
![](/Images/OutliningIndicators/InBlock.gif)
961
![](/Images/OutliningIndicators/InBlock.gif)
962
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
963
![](/Images/OutliningIndicators/InBlock.gif)
964
![](/Images/OutliningIndicators/InBlock.gif)
965
![](/Images/OutliningIndicators/InBlock.gif)
966
![](/Images/OutliningIndicators/InBlock.gif)
967
![](/Images/OutliningIndicators/InBlock.gif)
968
![](/Images/OutliningIndicators/InBlock.gif)
969
![](/Images/OutliningIndicators/InBlock.gif)
970
![](/Images/OutliningIndicators/InBlock.gif)
971
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
972
![](/Images/OutliningIndicators/InBlock.gif)
973
![](/Images/OutliningIndicators/InBlock.gif)
974
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
975
![](/Images/OutliningIndicators/InBlock.gif)
976
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
977
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
978
![](/Images/OutliningIndicators/InBlock.gif)
979
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
980
![](/Images/OutliningIndicators/InBlock.gif)
981
![](/Images/OutliningIndicators/InBlock.gif)
982
![](/Images/OutliningIndicators/InBlock.gif)
983
![](/Images/OutliningIndicators/InBlock.gif)
984
![](/Images/OutliningIndicators/InBlock.gif)
985
![](/Images/OutliningIndicators/InBlock.gif)
986
![](/Images/OutliningIndicators/InBlock.gif)
987
![](/Images/OutliningIndicators/InBlock.gif)
988
![](/Images/OutliningIndicators/InBlock.gif)
989
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
990
![](/Images/OutliningIndicators/InBlock.gif)
991
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
992
![](/Images/OutliningIndicators/InBlock.gif)
993
![](/Images/OutliningIndicators/InBlock.gif)
994
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
995
![](/Images/OutliningIndicators/InBlock.gif)
996
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
997
![](/Images/OutliningIndicators/InBlock.gif)
998
![](/Images/OutliningIndicators/InBlock.gif)
999
![](/Images/OutliningIndicators/InBlock.gif)
1000
![](/Images/OutliningIndicators/InBlock.gif)
1001
![](/Images/OutliningIndicators/InBlock.gif)
1002
![](/Images/OutliningIndicators/InBlock.gif)
1003
![](/Images/OutliningIndicators/InBlock.gif)
1004
![](/Images/OutliningIndicators/InBlock.gif)
1005
![](/Images/OutliningIndicators/InBlock.gif)
1006
![](/Images/OutliningIndicators/InBlock.gif)
1007
![](/Images/OutliningIndicators/InBlock.gif)
1008
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1009
![](/Images/OutliningIndicators/InBlock.gif)
1010
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1011
![](/Images/OutliningIndicators/InBlock.gif)
1012
![](/Images/OutliningIndicators/InBlock.gif)
1013
![](/Images/OutliningIndicators/InBlock.gif)
1014
![](/Images/OutliningIndicators/InBlock.gif)
1015
![](/Images/OutliningIndicators/InBlock.gif)
1016
![](/Images/OutliningIndicators/InBlock.gif)
1017
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1018
![](/Images/OutliningIndicators/InBlock.gif)
1019
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1020
![](/Images/OutliningIndicators/InBlock.gif)
1021
![](/Images/OutliningIndicators/InBlock.gif)
1022
![](/Images/OutliningIndicators/InBlock.gif)
1023
![](/Images/OutliningIndicators/InBlock.gif)
1024
![](/Images/OutliningIndicators/InBlock.gif)
1025
![](/Images/OutliningIndicators/InBlock.gif)
1026
![](/Images/OutliningIndicators/InBlock.gif)
1027
![](/Images/OutliningIndicators/InBlock.gif)
1028
![](/Images/OutliningIndicators/InBlock.gif)
1029
![](/Images/OutliningIndicators/InBlock.gif)
1030
![](/Images/OutliningIndicators/InBlock.gif)
1031
![](/Images/OutliningIndicators/InBlock.gif)
1032
![](/Images/OutliningIndicators/InBlock.gif)
1033
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1034
![](/Images/OutliningIndicators/InBlock.gif)
1035
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1036
![](/Images/OutliningIndicators/InBlock.gif)
1037
![](/Images/OutliningIndicators/InBlock.gif)
1038
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1039
![](/Images/OutliningIndicators/InBlock.gif)
1040
![](/Images/OutliningIndicators/InBlock.gif)
1041
![](/Images/OutliningIndicators/InBlock.gif)
1042
![](/Images/OutliningIndicators/InBlock.gif)
1043
![](/Images/OutliningIndicators/InBlock.gif)
1044
![](/Images/OutliningIndicators/InBlock.gif)
1045
![](/Images/OutliningIndicators/InBlock.gif)
1046
![](/Images/OutliningIndicators/InBlock.gif)
1047
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1048
![](/Images/OutliningIndicators/InBlock.gif)
1049
![](/Images/OutliningIndicators/InBlock.gif)
1050
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1051
![](/Images/OutliningIndicators/InBlock.gif)
1052
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1053
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1054
![](/Images/OutliningIndicators/InBlock.gif)
1055
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1056
![](/Images/OutliningIndicators/InBlock.gif)
1057
![](/Images/OutliningIndicators/InBlock.gif)
1058
![](/Images/OutliningIndicators/InBlock.gif)
1059
![](/Images/OutliningIndicators/InBlock.gif)
1060
![](/Images/OutliningIndicators/InBlock.gif)
1061
![](/Images/OutliningIndicators/InBlock.gif)
1062
![](/Images/OutliningIndicators/InBlock.gif)
1063
![](/Images/OutliningIndicators/InBlock.gif)
1064
![](/Images/OutliningIndicators/InBlock.gif)
1065
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1066
![](/Images/OutliningIndicators/InBlock.gif)
1067
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1068
![](/Images/OutliningIndicators/InBlock.gif)
1069
![](/Images/OutliningIndicators/InBlock.gif)
1070
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1071
![](/Images/OutliningIndicators/InBlock.gif)
1072
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1073
![](/Images/OutliningIndicators/InBlock.gif)
1074
![](/Images/OutliningIndicators/InBlock.gif)
1075
![](/Images/OutliningIndicators/InBlock.gif)
1076
![](/Images/OutliningIndicators/InBlock.gif)
1077
![](/Images/OutliningIndicators/InBlock.gif)
1078
![](/Images/OutliningIndicators/InBlock.gif)
1079
![](/Images/OutliningIndicators/InBlock.gif)
1080
![](/Images/OutliningIndicators/InBlock.gif)
1081
![](/Images/OutliningIndicators/InBlock.gif)
1082
![](/Images/OutliningIndicators/InBlock.gif)
1083
![](/Images/OutliningIndicators/InBlock.gif)
1084
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1085
![](/Images/OutliningIndicators/InBlock.gif)
1086
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1087
![](/Images/OutliningIndicators/InBlock.gif)
1088
![](/Images/OutliningIndicators/InBlock.gif)
1089
![](/Images/OutliningIndicators/InBlock.gif)
1090
![](/Images/OutliningIndicators/InBlock.gif)
1091
![](/Images/OutliningIndicators/InBlock.gif)
1092
![](/Images/OutliningIndicators/InBlock.gif)
1093
![](/Images/OutliningIndicators/InBlock.gif)
1094
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1095
![](/Images/OutliningIndicators/InBlock.gif)
1096
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1097
![](/Images/OutliningIndicators/InBlock.gif)
1098
![](/Images/OutliningIndicators/InBlock.gif)
1099
![](/Images/OutliningIndicators/InBlock.gif)
1100
![](/Images/OutliningIndicators/InBlock.gif)
1101
![](/Images/OutliningIndicators/InBlock.gif)
1102
![](/Images/OutliningIndicators/InBlock.gif)
1103
![](/Images/OutliningIndicators/InBlock.gif)
1104
![](/Images/OutliningIndicators/InBlock.gif)
1105
![](/Images/OutliningIndicators/InBlock.gif)
1106
![](/Images/OutliningIndicators/InBlock.gif)
1107
![](/Images/OutliningIndicators/InBlock.gif)
1108
![](/Images/OutliningIndicators/InBlock.gif)
1109
![](/Images/OutliningIndicators/InBlock.gif)
1110
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1111
![](/Images/OutliningIndicators/InBlock.gif)
1112
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1113
![](/Images/OutliningIndicators/InBlock.gif)
1114
![](/Images/OutliningIndicators/InBlock.gif)
1115
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1116
![](/Images/OutliningIndicators/InBlock.gif)
1117
![](/Images/OutliningIndicators/InBlock.gif)
1118
![](/Images/OutliningIndicators/InBlock.gif)
1119
![](/Images/OutliningIndicators/InBlock.gif)
1120
![](/Images/OutliningIndicators/InBlock.gif)
1121
![](/Images/OutliningIndicators/InBlock.gif)
1122
![](/Images/OutliningIndicators/InBlock.gif)
1123
![](/Images/OutliningIndicators/InBlock.gif)
1124
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1125
![](/Images/OutliningIndicators/InBlock.gif)
1126
![](/Images/OutliningIndicators/InBlock.gif)
1127
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1128
![](/Images/OutliningIndicators/InBlock.gif)
1129
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1130
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1131
![](/Images/OutliningIndicators/InBlock.gif)
1132
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1133
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1134
![](/Images/OutliningIndicators/InBlock.gif)
1135
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1136
![](/Images/OutliningIndicators/InBlock.gif)
1137
![](/Images/OutliningIndicators/InBlock.gif)
1138
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1139
![](/Images/OutliningIndicators/InBlock.gif)
1140
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1141
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1142
![](/Images/OutliningIndicators/InBlock.gif)
1143
![](/Images/OutliningIndicators/InBlock.gif)
1144
![](/Images/OutliningIndicators/InBlock.gif)
1145
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1146
![](/Images/OutliningIndicators/InBlock.gif)
1147
![](/Images/OutliningIndicators/InBlock.gif)
1148
![](/Images/OutliningIndicators/InBlock.gif)
1149
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1150
![](/Images/OutliningIndicators/InBlock.gif)
1151
![](/Images/OutliningIndicators/InBlock.gif)
1152
![](/Images/OutliningIndicators/InBlock.gif)
1153
![](/Images/OutliningIndicators/InBlock.gif)
1154
![](/Images/OutliningIndicators/InBlock.gif)
1155
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1156
![](/Images/OutliningIndicators/InBlock.gif)
1157
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1158
![](/Images/OutliningIndicators/InBlock.gif)
1159
![](/Images/OutliningIndicators/InBlock.gif)
1160
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1161
![](/Images/OutliningIndicators/InBlock.gif)
1162
![](/Images/OutliningIndicators/InBlock.gif)
1163
![](/Images/OutliningIndicators/InBlock.gif)
1164
![](/Images/OutliningIndicators/InBlock.gif)
1165
![](/Images/OutliningIndicators/InBlock.gif)
1166
![](/Images/OutliningIndicators/InBlock.gif)
1167
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1168
![](/Images/OutliningIndicators/InBlock.gif)
1169
![](/Images/OutliningIndicators/InBlock.gif)
1170
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1171
![](/Images/OutliningIndicators/InBlock.gif)
1172
![](/Images/OutliningIndicators/InBlock.gif)
1173
![](/Images/OutliningIndicators/InBlock.gif)
1174
![](/Images/OutliningIndicators/InBlock.gif)
1175
![](/Images/OutliningIndicators/InBlock.gif)
1176
![](/Images/OutliningIndicators/InBlock.gif)
1177
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1178
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1179
![](/Images/OutliningIndicators/InBlock.gif)
1180
![](/Images/OutliningIndicators/InBlock.gif)
1181
![](/Images/OutliningIndicators/InBlock.gif)
1182
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1183
![](/Images/OutliningIndicators/InBlock.gif)
1184
![](/Images/OutliningIndicators/InBlock.gif)
1185
![](/Images/OutliningIndicators/InBlock.gif)
1186
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1187
![](/Images/OutliningIndicators/InBlock.gif)
1188
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1189
![](/Images/OutliningIndicators/InBlock.gif)
1190
![](/Images/OutliningIndicators/InBlock.gif)
1191
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1192
![](/Images/OutliningIndicators/InBlock.gif)
1193
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1194
![](/Images/OutliningIndicators/InBlock.gif)
1195
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1196
![](/Images/OutliningIndicators/InBlock.gif)
1197
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1198
![](/Images/OutliningIndicators/InBlock.gif)
1199
![](/Images/OutliningIndicators/InBlock.gif)
1200
![](/Images/OutliningIndicators/InBlock.gif)
1201
![](/Images/OutliningIndicators/InBlock.gif)
1202
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1203
![](/Images/OutliningIndicators/InBlock.gif)
1204
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1205
![](/Images/OutliningIndicators/InBlock.gif)
1206
![](/Images/OutliningIndicators/InBlock.gif)
1207
![](/Images/OutliningIndicators/InBlock.gif)
1208
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1209
![](/Images/OutliningIndicators/InBlock.gif)
1210
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1211
![](/Images/OutliningIndicators/InBlock.gif)
1212
![](/Images/OutliningIndicators/InBlock.gif)
1213
![](/Images/OutliningIndicators/InBlock.gif)
1214
![](/Images/OutliningIndicators/InBlock.gif)
1215
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1216
![](/Images/OutliningIndicators/InBlock.gif)
1217
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1218
![](/Images/OutliningIndicators/InBlock.gif)
1219
![](/Images/OutliningIndicators/InBlock.gif)
1220
![](/Images/OutliningIndicators/InBlock.gif)
1221
![](/Images/OutliningIndicators/InBlock.gif)
1222
![](/Images/OutliningIndicators/InBlock.gif)
1223
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1224
![](/Images/OutliningIndicators/InBlock.gif)
1225
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1226
![](/Images/OutliningIndicators/InBlock.gif)
1227
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1228
![](/Images/OutliningIndicators/InBlock.gif)
1229
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1230
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1231
![](/Images/OutliningIndicators/InBlock.gif)
1232
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1233
![](/Images/OutliningIndicators/InBlock.gif)
1234
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1235
![](/Images/OutliningIndicators/InBlock.gif)
1236
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1237
![](/Images/OutliningIndicators/InBlock.gif)
1238
![](/Images/OutliningIndicators/InBlock.gif)
1239
![](/Images/OutliningIndicators/InBlock.gif)
1240
![](/Images/OutliningIndicators/InBlock.gif)
1241
![](/Images/OutliningIndicators/InBlock.gif)
1242
![](/Images/OutliningIndicators/InBlock.gif)
1243
![](/Images/OutliningIndicators/InBlock.gif)
1244
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1245
![](/Images/OutliningIndicators/InBlock.gif)
1246
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1247
![](/Images/OutliningIndicators/InBlock.gif)
1248
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1249
![](/Images/OutliningIndicators/InBlock.gif)
1250
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1251
![](/Images/OutliningIndicators/InBlock.gif)
1252
![](/Images/OutliningIndicators/InBlock.gif)
1253
![](/Images/OutliningIndicators/InBlock.gif)
1254
![](/Images/OutliningIndicators/InBlock.gif)
1255
![](/Images/OutliningIndicators/InBlock.gif)
1256
![](/Images/OutliningIndicators/InBlock.gif)
1257
![](/Images/OutliningIndicators/InBlock.gif)
1258
![](/Images/OutliningIndicators/InBlock.gif)
1259
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1260
![](/Images/OutliningIndicators/InBlock.gif)
1261
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1262
![](/Images/OutliningIndicators/InBlock.gif)
1263
![](/Images/OutliningIndicators/InBlock.gif)
1264
![](/Images/OutliningIndicators/InBlock.gif)
1265
![](/Images/OutliningIndicators/InBlock.gif)
1266
![](/Images/OutliningIndicators/InBlock.gif)
1267
![](/Images/OutliningIndicators/InBlock.gif)
1268
![](/Images/OutliningIndicators/InBlock.gif)
1269
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1270
![](/Images/OutliningIndicators/InBlock.gif)
1271
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1272
![](/Images/OutliningIndicators/InBlock.gif)
1273
![](/Images/OutliningIndicators/InBlock.gif)
1274
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1275
![](/Images/OutliningIndicators/InBlock.gif)
1276
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1277
![](/Images/OutliningIndicators/InBlock.gif)
1278
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1279
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
1280
![](/Images/OutliningIndicators/None.gif)
To be continue...