About DAAB Operation No.1
MAAB
常看到有朋友在坛子里问关于SQL SERVER & ORACLE 如何连接操作,哪里有相应的类库,是否有源码。我这边收集了一些,希望能对大家有所帮助。(这可是我的处女贴哦~)
SQLHelper — 当前使用最广泛的SQL SERVER操作类,转自MS MAAB
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
//===============================================================================
2
// Microsoft Data Access Application Block for .NET
3
// http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp
4
//
5
// SQLHelper.cs
6
//
7
// This file contains a preliminary implementations of the SqlHelper and
8
// SqlHelperParameterCache classes.
9
//
10
// For more information see the Data Access Application Block Implementation Overview.
11
//
12
//===============================================================================
13
// Copyright (C) 2000-2001 Microsoft Corporation
14
// All rights reserved.
15
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
16
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
17
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
18
// FITNESS FOR A PARTICULAR PURPOSE.
19
//==============================================================================
20![](/Images/OutliningIndicators/None.gif)
21
using System;
22
using System.Data;
23
using System.Xml;
24
using System.Data.SqlClient;
25
using System.Collections;
26![](/Images/OutliningIndicators/None.gif)
27![](/Images/OutliningIndicators/None.gif)
28
namespace Microsoft.ApplicationBlocks.Data
29![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
30![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
31
/// The SqlHelper class is intended to encapsulate high performance, scalable best practices for
32
/// common uses of SqlClient.
33
/// </summary>
34
public sealed class SqlHelper
35![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
36![](/Images/OutliningIndicators/ContractedSubBlock.gif)
private utility methods & constructors#region private utility methods & constructors
37![](/Images/OutliningIndicators/InBlock.gif)
38
//Since this class provides only static methods, make the default constructor private to prevent
39
//instances from being created with "new SqlHelper()".
40![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private SqlHelper()
{}
41![](/Images/OutliningIndicators/InBlock.gif)
42![](/Images/OutliningIndicators/InBlock.gif)
43![](/Images/OutliningIndicators/InBlock.gif)
44![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
45
/// This method is used to attach array's of SqlParameters to a SqlCommand.
46
///
47
/// This method will assign a value of DbNull to any parameter with a direction of
48
/// InputOutput and a value of null.
49
///
50
/// This behavior will prevent default values from being used, but
51
/// this will be the less common case than an intended pure output parameter (derived as InputOutput)
52
/// where the user provided no input value.
53
/// </summary>
54
/// <param name="command">The command to which the parameters will be added</param>
55
/// <param name="commandParameters">an array of SqlParameters tho be added to command</param>
56
private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
57![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58
foreach (SqlParameter p in commandParameters)
59![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
60
//check for derived output value with no value assigned
61
if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
62![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
63
p.Value = DBNull.Value;
64
}
65
66
command.Parameters.Add(p);
67
}
68
}
69![](/Images/OutliningIndicators/InBlock.gif)
70![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
71
/// This method assigns an array of values to an array of SqlParameters.
72
/// </summary>
73
/// <param name="commandParameters">array of SqlParameters to be assigned values</param>
74
/// <param name="parameterValues">array of objects holding the values to be assigned</param>
75
private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
76![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
77
if ((commandParameters == null) || (parameterValues == null))
78![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
79
//do nothing if we get no data
80
return;
81
}
82![](/Images/OutliningIndicators/InBlock.gif)
83
// we must have the same number of values as we pave parameters to put them in
84
if (commandParameters.Length != parameterValues.Length)
85![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
86
throw new ArgumentException("Parameter count does not match Parameter Value count.");
87
}
88![](/Images/OutliningIndicators/InBlock.gif)
89
//iterate through the SqlParameters, assigning the values from the corresponding position in the
90
//value array
91
for (int i = 0, j = commandParameters.Length; i < j; i++)
92![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
93
commandParameters[i].Value = parameterValues[i];
94
}
95
}
96![](/Images/OutliningIndicators/InBlock.gif)
97![](/Images/OutliningIndicators/InBlock.gif)
98![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
99
/// This method opens (if necessary) and assigns a connection, transaction, command type and parameters
100
/// to the provided command.
101
/// </summary>
102
/// <param name="command">the SqlCommand to be prepared</param>
103
/// <param name="connection">a valid SqlConnection, on which to execute this command</param>
104
/// <param name="transaction">a valid SqlTransaction, or 'null'</param>
105
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
106
/// <param name="commandText">the stored procedure name or T-SQL command</param>
107
/// <param name="commandParameters">an array of SqlParameters to be associated with the command or 'null' if no parameters are required</param>
108
private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters)
109![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
110
//if the provided connection is not open, we will open it
111
if (connection.State != ConnectionState.Open)
112![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
113
connection.Open();
114
}
115![](/Images/OutliningIndicators/InBlock.gif)
116
//associate the connectoin with the command
117
command.Connection = connection;
118![](/Images/OutliningIndicators/InBlock.gif)
119
//set the command text (stored procedure name or SQL statement)
120
command.CommandText = commandText;
121![](/Images/OutliningIndicators/InBlock.gif)
122
//if we were provided a transaction, assign it.
123
if (transaction != null)
124![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
125
command.Transaction = transaction;
126
}
127![](/Images/OutliningIndicators/InBlock.gif)
128
//set the command type
129
command.CommandType = commandType;
130![](/Images/OutliningIndicators/InBlock.gif)
131
//attach the command parameters if they are provided
132
if (commandParameters != null)
133![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
134
AttachParameters(command, commandParameters);
135
}
136![](/Images/OutliningIndicators/InBlock.gif)
137
return;
138
}
139![](/Images/OutliningIndicators/InBlock.gif)
140![](/Images/OutliningIndicators/InBlock.gif)
141
#endregion private utility methods & constructors
142![](/Images/OutliningIndicators/InBlock.gif)
143![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteNonQuery#region ExecuteNonQuery
144![](/Images/OutliningIndicators/InBlock.gif)
145![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
146
/// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in
147
/// the connection string.
148
/// </summary>
149
/// <remarks>
150
/// e.g.:
151
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
152
/// </remarks>
153
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
154
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
155
/// <param name="commandText">the stored procedure name or T-SQL command</param>
156
/// <returns>an int representing the number of rows affected by the command</returns>
157
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText)
158![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
159
//pass through the call providing null for the set of SqlParameters
160
return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null);
161
}
162![](/Images/OutliningIndicators/InBlock.gif)
163![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
164
/// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string
165
/// using the provided parameters.
166
/// </summary>
167
/// <remarks>
168
/// e.g.:
169
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
170
/// </remarks>
171
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
172
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
173
/// <param name="commandText">the stored procedure name or T-SQL command</param>
174
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
175
/// <returns>an int representing the number of rows affected by the command</returns>
176
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
177![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
178
//create & open a SqlConnection, and dispose of it after we are done.
179
using (SqlConnection cn = new SqlConnection(connectionString))
180![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
181
cn.Open();
182![](/Images/OutliningIndicators/InBlock.gif)
183
//call the overload that takes a connection in place of the connection string
184
return ExecuteNonQuery(cn, commandType, commandText, commandParameters);
185
}
186
}
187![](/Images/OutliningIndicators/InBlock.gif)
188![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
189
/// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in
190
/// the conneciton string using the provided parameter values. This method will discover the parameters for the
191
/// stored procedure, and assign the values based on parameter order.
192
/// </summary>
193
/// <remarks>
194
/// This method provides no access to output parameters or the stored procedure's return value parameter.
195
///
196
/// e.g.:
197
/// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
198
/// </remarks>
199
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
200
/// <param name="spName">the name of the stored prcedure</param>
201
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
202
/// <returns>an int representing the number of rows affected by the command</returns>
203
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
204![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
205
//if we got parameter values, we need to figure out where they go
206
if ((parameterValues != null) && (parameterValues.Length > 0))
207![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
208
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
209
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
210![](/Images/OutliningIndicators/InBlock.gif)
211
//assign the provided values to these parameters based on parameter order
212
AssignParameterValues(commandParameters, parameterValues);
213![](/Images/OutliningIndicators/InBlock.gif)
214
//call the overload that takes an array of SqlParameters
215
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
216
}
217
//otherwise we can just call the SP without params
218
else
219![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
220
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
221
}
222
}
223![](/Images/OutliningIndicators/InBlock.gif)
224![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
225
/// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided SqlConnection.
226
/// </summary>
227
/// <remarks>
228
/// e.g.:
229
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
230
/// </remarks>
231
/// <param name="connection">a valid SqlConnection</param>
232
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
233
/// <param name="commandText">the stored procedure name or T-SQL command</param>
234
/// <returns>an int representing the number of rows affected by the command</returns>
235
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText)
236![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
237
//pass through the call using a null transaction value
238
return ExecuteNonQuery(connection, null, commandType, commandText);
239
}
240![](/Images/OutliningIndicators/InBlock.gif)
241![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
242
/// Execute a SqlCommand (that returns no resultset) against the specified SqlConnection
243
/// using the provided parameters.
244
/// </summary>
245
/// <remarks>
246
/// e.g.:
247
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
248
/// </remarks>
249
/// <param name="connection">a valid SqlConnection</param>
250
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
251
/// <param name="commandText">the stored procedure name or T-SQL command</param>
252
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
253
/// <returns>an int representing the number of rows affected by the command</returns>
254
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
255![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
256
//pass through the call using a null transaction value
257
return ExecuteNonQuery(connection, null, commandType, commandText, commandParameters);
258
}
259![](/Images/OutliningIndicators/InBlock.gif)
260![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
261
/// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified SqlConnection
262
/// using the provided parameter values. This method will discover the parameters for the
263
/// stored procedure, and assign the values based on parameter order.
264
/// </summary>
265
/// <remarks>
266
/// This method provides no access to output parameters or the stored procedure's return value parameter.
267
///
268
/// e.g.:
269
/// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);
270
/// </remarks>
271
/// <param name="connection">a valid SqlConnection</param>
272
/// <param name="spName">the name of the stored prcedure</param>
273
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
274
/// <returns>an int representing the number of rows affected by the command</returns>
275
public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues)
276![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
277
//pass through the call using a null transaction value
278
return ExecuteNonQuery(connection, null, spName, parameterValues);
279
}
280![](/Images/OutliningIndicators/InBlock.gif)
281
//these three method overloads currently take both connection and transaction. In post-beta2 builds, only
282
//transaction will need to be passed in, and the .Connection property will be available from that transaction
283![](/Images/OutliningIndicators/InBlock.gif)
284![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
285
/// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided SqlConnection
286
/// and SqlTransaction.
287
/// </summary>
288
/// <remarks>
289
/// e.g.:
290
/// int result = ExecuteNonQuery(conn, trans, CommandType.StoredProcedure, "PublishOrders");
291
/// </remarks>
292
/// <param name="connection">a valid SqlConnection</param>
293
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
294
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
295
/// <param name="commandText">the stored procedure name or T-SQL command</param>
296
/// <returns>an int representing the number of rows affected by the command</returns>
297
public static int ExecuteNonQuery(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText)
298![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
299
//pass through the call providing null for the set of SqlParameters
300
return ExecuteNonQuery(connection, transaction, commandType, commandText, (SqlParameter[])null);
301
}
302![](/Images/OutliningIndicators/InBlock.gif)
303![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
304
/// Execute a SqlCommand (that returns no resultset) against the specified SqlConnection and SqlTransaction
305
/// using the provided parameters.
306
/// </summary>
307
/// <remarks>
308
/// e.g.:
309
/// int result = ExecuteNonQuery(conn, trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
310
/// </remarks>
311
/// <param name="connection">a valid SqlConnection</param>
312
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
313
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
314
/// <param name="commandText">the stored procedure name or T-SQL command</param>
315
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
316
/// <returns>an int representing the number of rows affected by the command</returns>
317
public static int ExecuteNonQuery(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
318![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
319
//create a command and prepare it for execution
320
SqlCommand cmd = new SqlCommand();
321
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);
322
323
//finally, execute the command.
324
return cmd.ExecuteNonQuery();
325
}
326![](/Images/OutliningIndicators/InBlock.gif)
327![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
328
/// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified SqlConnection
329
/// and SqlTransaction using the provided parameter values. This method will discover the parameters for the
330
/// stored procedure, and assign the values based on parameter order.
331
/// </summary>
332
/// <remarks>
333
/// This method provides no access to output parameters or the stored procedure's return value parameter.
334
///
335
/// e.g.:
336
/// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);
337
/// </remarks>
338
/// <param name="connection">a valid SqlConnection</param>
339
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
340
/// <param name="spName">the name of the stored prcedure</param>
341
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
342
/// <returns>an int representing the number of rows affected by the command</returns>
343
public static int ExecuteNonQuery(SqlConnection connection, SqlTransaction transaction, string spName, params object[] parameterValues)
344![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
345
//if we got parameter values, we need to figure out where they go
346
if ((parameterValues != null) && (parameterValues.Length > 0))
347![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
348
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
349
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
350![](/Images/OutliningIndicators/InBlock.gif)
351
//assign the provided values to these parameters based on parameter order
352
AssignParameterValues(commandParameters, parameterValues);
353![](/Images/OutliningIndicators/InBlock.gif)
354
//call the overload that takes an array of SqlParameters
355
return ExecuteNonQuery(connection, transaction, CommandType.StoredProcedure, spName, commandParameters);
356
}
357
//otherwise we can just call the SP without params
358
else
359![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
360
return ExecuteNonQuery(connection, transaction, CommandType.StoredProcedure, spName);
361
}
362
}
363![](/Images/OutliningIndicators/InBlock.gif)
364![](/Images/OutliningIndicators/InBlock.gif)
365
#endregion ExecuteNonQuery
366![](/Images/OutliningIndicators/InBlock.gif)
367![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteDataSet#region ExecuteDataSet
368![](/Images/OutliningIndicators/InBlock.gif)
369![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
370
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in
371
/// the connection string.
372
/// </summary>
373
/// <remarks>
374
/// e.g.:
375
/// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders");
376
/// </remarks>
377
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
378
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
379
/// <param name="commandText">the stored procedure name or T-SQL command</param>
380
/// <returns>a dataset containing the resultset generated by the command</returns>
381
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText)
382![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
383
//pass through the call providing null for the set of SqlParameters
384
return ExecuteDataset(connectionString, commandType, commandText, (SqlParameter[])null);
385
}
386![](/Images/OutliningIndicators/InBlock.gif)
387![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
388
/// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string
389
/// using the provided parameters.
390
/// </summary>
391
/// <remarks>
392
/// e.g.:
393
/// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
394
/// </remarks>
395
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
396
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
397
/// <param name="commandText">the stored procedure name or T-SQL command</param>
398
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
399
/// <returns>a dataset containing the resultset generated by the command</returns>
400
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
401![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
402
//create & open a SqlConnection, and dispose of it after we are done.
403
using (SqlConnection cn = new SqlConnection(connectionString))
404![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
405
cn.Open();
406![](/Images/OutliningIndicators/InBlock.gif)
407
//call the overload that takes a connection in place of the connection string
408
return ExecuteDataset(cn, commandType, commandText, commandParameters);
409
}
410
}
411![](/Images/OutliningIndicators/InBlock.gif)
412![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
413
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
414
/// the conneciton string using the provided parameter values. This method will discover the parameters for the
415
/// stored procedure, and assign the values based on parameter order.
416
/// </summary>
417
/// <remarks>
418
/// This method provides no access to output parameters or the stored procedure's return value parameter.
419
///
420
/// e.g.:
421
/// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36);
422
/// </remarks>
423
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
424
/// <param name="spName">the name of the stored prcedure</param>
425
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
426
/// <returns>a dataset containing the resultset generated by the command</returns>
427
public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues)
428![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
429
//if we got parameter values, we need to figure out where they go
430
if ((parameterValues != null) && (parameterValues.Length > 0))
431![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
432
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
433
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
434![](/Images/OutliningIndicators/InBlock.gif)
435
//assign the provided values to these parameters based on parameter order
436
AssignParameterValues(commandParameters, parameterValues);
437![](/Images/OutliningIndicators/InBlock.gif)
438
//call the overload that takes an array of SqlParameters
439
return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);
440
}
441
//otherwise we can just call the SP without params
442
else
443![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
444
return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);
445
}
446
}
447![](/Images/OutliningIndicators/InBlock.gif)
448![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
449
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
450
/// </summary>
451
/// <remarks>
452
/// e.g.:
453
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders");
454
/// </remarks>
455
/// <param name="connection">a valid SqlConnection</param>
456
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
457
/// <param name="commandText">the stored procedure name or T-SQL command</param>
458
/// <returns>a dataset containing the resultset generated by the command</returns>
459
public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText)
460![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
461
//pass through the call using a null transaction value
462
return ExecuteDataset(connection, null, commandType, commandText);
463
}
464
465![](/Images/OutliningIndicators/InBlock.gif)
466![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
467
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
468
/// using the provided parameters.
469
/// </summary>
470
/// <remarks>
471
/// e.g.:
472
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
473
/// </remarks>
474
/// <param name="connection">a valid SqlConnection</param>
475
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
476
/// <param name="commandText">the stored procedure name or T-SQL command</param>
477
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
478
/// <returns>a dataset containing the resultset generated by the command</returns>
479
public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
480![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
481
//pass through the call using a null transaction value
482
return ExecuteDataset(connection, null, commandType, commandText, commandParameters);
483
}
484
485![](/Images/OutliningIndicators/InBlock.gif)
486![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
487
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
488
/// using the provided parameter values. This method will discover the parameters for the
489
/// stored procedure, and assign the values based on parameter order.
490
/// </summary>
491
/// <remarks>
492
/// This method provides no access to output parameters or the stored procedure's return value parameter.
493
///
494
/// e.g.:
495
/// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);
496
/// </remarks>
497
/// <param name="connection">a valid SqlConnection</param>
498
/// <param name="spName">the name of the stored prcedure</param>
499
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
500
/// <returns>a dataset containing the resultset generated by the command</returns>
501
public static DataSet ExecuteDataset(SqlConnection connection, string spName, params object[] parameterValues)
502![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
503
//pass through the call using a null transaction value
504
return ExecuteDataset(connection, null, spName, parameterValues);
505
}
506![](/Images/OutliningIndicators/InBlock.gif)
507
//these three method overloads currently take both connection and transaction. In post-beta2 builds, only
508
//transaction will need to be passed in, and the .Connection property will be available from that transaction
509![](/Images/OutliningIndicators/InBlock.gif)
510![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
511
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection
512
/// and SqlTransaction.
513
/// </summary>
514
/// <remarks>
515
/// e.g.:
516
/// DataSet ds = ExecuteDataset(conn, trans, CommandType.StoredProcedure, "GetOrders");
517
/// </remarks>
518
/// <param name="connection">a valid SqlConnection</param>
519
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
520
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
521
/// <param name="commandText">the stored procedure name or T-SQL command</param>
522
/// <returns>a dataset containing the resultset generated by the command</returns>
523
public static DataSet ExecuteDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText)
524![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
525
//pass through the call providing null for the set of SqlParameters
526
return ExecuteDataset(connection, transaction, commandType, commandText, (SqlParameter[])null);
527
}
528
529![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
530
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection and SqlTransaction
531
/// using the provided parameters.
532
/// </summary>
533
/// <remarks>
534
/// e.g.:
535
/// DataSet ds = ExecuteDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
536
/// </remarks>
537
/// <param name="connection">a valid SqlConnection</param>
538
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
539
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
540
/// <param name="commandText">the stored procedure name or T-SQL command</param>
541
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
542
/// <returns>a dataset containing the resultset generated by the command</returns>
543
public static DataSet ExecuteDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
544![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
545
//create a command and prepare it for execution
546
SqlCommand cmd = new SqlCommand();
547
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);
548
549
//create the DataAdapter & DataSet
550
SqlDataAdapter da = new SqlDataAdapter(cmd);
551
DataSet ds = new DataSet();
552![](/Images/OutliningIndicators/InBlock.gif)
553
//fill the DataSet using default values for DataTable names, etc.
554
da.Fill(ds);
555
556
//return the dataset
557
return ds;
558
}
559
560![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
561
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
562
/// and SqlTransaction using the provided parameter values. This method will discover the parameters for the
563
/// stored procedure, and assign the values based on parameter order.
564
/// </summary>
565
/// <remarks>
566
/// This method provides no access to output parameters or the stored procedure's return value parameter.
567
///
568
/// e.g.:
569
/// DataSet ds = ExecuteDataset(conn, trans, "GetOrders", 24, 36);
570
/// </remarks>
571
/// <param name="connection">a valid SqlConnection</param>
572
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
573
/// <param name="spName">the name of the stored prcedure</param>
574
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
575
/// <returns>a dataset containing the resultset generated by the command</returns>
576
public static DataSet ExecuteDataset(SqlConnection connection, SqlTransaction transaction, string spName, params object[] parameterValues)
577![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
578
//if we got parameter values, we need to figure out where they go
579
if ((parameterValues != null) && (parameterValues.Length > 0))
580![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
581
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
582
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
583![](/Images/OutliningIndicators/InBlock.gif)
584
//assign the provided values to these parameters based on parameter order
585
AssignParameterValues(commandParameters, parameterValues);
586![](/Images/OutliningIndicators/InBlock.gif)
587
//call the overload that takes an array of SqlParameters
588
return ExecuteDataset(connection, transaction, CommandType.StoredProcedure, spName, commandParameters);
589
}
590
//otherwise we can just call the SP without params
591
else
592![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
593
return ExecuteDataset(connection, transaction, CommandType.StoredProcedure, spName);
594
}
595
}
596![](/Images/OutliningIndicators/InBlock.gif)
597
#endregion ExecuteDataSet
598
599![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteReader#region ExecuteReader
600![](/Images/OutliningIndicators/InBlock.gif)
601![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
602
/// this enum is used to indicate weather the connection was provided by the caller, or created by SqlHelper, so that
603
/// we can set the appropriate CommandBehavior when calling ExecuteReader()
604
/// </summary>
605
private enum SqlConnectionOwnership
606![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
607![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>Connection is owned and managed by SqlHelper</summary>
608
Internal,
609![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>Connection is owned and managed by the caller</summary>
610
External
611
}
612![](/Images/OutliningIndicators/InBlock.gif)
613![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
614
/// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior.
615
/// </summary>
616
/// <remarks>
617
/// If we created and opened the connection, we want the connection to be closed when the DataReader is closed.
618
///
619
/// If the caller provided the connection, we want to leave it to them to manage.
620
/// </remarks>
621
/// <param name="connection">a valid SqlConnection, on which to execute this command</param>
622
/// <param name="transaction">a valid SqlTransaction, or 'null'</param>
623
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
624
/// <param name="commandText">the stored procedure name or T-SQL command</param>
625
/// <param name="commandParameters">an array of SqlParameters to be associated with the command or 'null' if no parameters are required</param>
626
/// <param name="connectionOwnership">indicates weather the connection parameter was provided by the caller, or created by SqlHelper</param>
627
/// <returns>SqlDataReader containing the results of the command</returns>
628
private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership)
629![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
630
//create a command and prepare it for execution
631
SqlCommand cmd = new SqlCommand();
632
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);
633
634
//create a reader
635
SqlDataReader dr;
636![](/Images/OutliningIndicators/InBlock.gif)
637
// call ExecuteReader with the appropriate CommandBehavior
638
if (connectionOwnership == SqlConnectionOwnership.External)
639![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
640
dr = cmd.ExecuteReader();
641
}
642
else
643![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
644
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
645
}
646![](/Images/OutliningIndicators/InBlock.gif)
647
return dr;
648
}
649![](/Images/OutliningIndicators/InBlock.gif)
650![](/Images/OutliningIndicators/InBlock.gif)
651![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
652
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in
653
/// the connection string.
654
/// </summary>
655
/// <remarks>
656
/// e.g.:
657
/// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders");
658
/// </remarks>
659
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
660
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
661
/// <param name="commandText">the stored procedure name or T-SQL command</param>
662
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
663
public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText)
664![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
665
//pass through the call providing null for the set of SqlParameters
666
return ExecuteReader(connectionString, commandType, commandText, (SqlParameter[])null);
667
}
668![](/Images/OutliningIndicators/InBlock.gif)
669![](/Images/OutliningIndicators/InBlock.gif)
670![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
671
/// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string
672
/// using the provided parameters.
673
/// </summary>
674
/// <remarks>
675
/// e.g.:
676
/// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
677
/// </remarks>
678
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
679
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
680
/// <param name="commandText">the stored procedure name or T-SQL command</param>
681
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
682
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
683
public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
684![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
685
//create & open a SqlConnection
686
SqlConnection cn = new SqlConnection(connectionString);
687
cn.Open();
688![](/Images/OutliningIndicators/InBlock.gif)
689
try
690![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
691
//call the private overload that takes an internally owned connection in place of the connection string
692
return ExecuteReader(cn, null, commandType, commandText, commandParameters,SqlConnectionOwnership.Internal);
693
}
694
catch
695![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
696
//if we fail to return the SqlDatReader, we neeed to close the connection ourselves
697
cn.Close();
698
throw;
699
}
700
}
701![](/Images/OutliningIndicators/InBlock.gif)
702![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
703
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
704
/// the conneciton string using the provided parameter values. This method will discover the parameters for the
705
/// stored procedure, and assign the values based on parameter order.
706
/// </summary>
707
/// <remarks>
708
/// This method provides no access to output parameters or the stored procedure's return value parameter.
709
///
710
/// e.g.:
711
/// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36);
712
/// </remarks>
713
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
714
/// <param name="spName">the name of the stored prcedure</param>
715
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
716
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
717
public static SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues)
718![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
719
//if we got parameter values, we need to figure out where they go
720
if ((parameterValues != null) && (parameterValues.Length > 0))
721![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
722
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
723
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
724![](/Images/OutliningIndicators/InBlock.gif)
725
//assign the provided values to these parameters based on parameter order
726
AssignParameterValues(commandParameters, parameterValues);
727![](/Images/OutliningIndicators/InBlock.gif)
728
//call the overload that takes an array of SqlParameters
729
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);
730
}
731
//otherwise we can just call the SP without params
732
else
733![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
734
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName);
735
}
736
}
737![](/Images/OutliningIndicators/InBlock.gif)
738![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
739
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
740
/// </summary>
741
/// <remarks>
742
/// e.g.:
743
/// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders");
744
/// </remarks>
745
/// <param name="connection">a valid SqlConnection</param>
746
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
747
/// <param name="commandText">the stored procedure name or T-SQL command</param>
748
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
749
public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText)
750![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
751
//pass through the call using a null transaction value
752
return ExecuteReader(connection, null, commandType, commandText);
753
}
754![](/Images/OutliningIndicators/InBlock.gif)
755![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
756
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
757
/// using the provided parameters.
758
/// </summary>
759
/// <remarks>
760
/// e.g.:
761
/// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
762
/// </remarks>
763
/// <param name="connection">a valid SqlConnection</param>
764
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
765
/// <param name="commandText">the stored procedure name or T-SQL command</param>
766
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
767
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
768
public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
769![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
770
//pass through the call using a null transaction value
771
return ExecuteReader(connection, null, commandType, commandText, commandParameters);
772
}
773![](/Images/OutliningIndicators/InBlock.gif)
774![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
775
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
776
/// using the provided parameter values. This method will discover the parameters for the
777
/// stored procedure, and assign the values based on parameter order.
778
/// </summary>
779
/// <remarks>
780
/// This method provides no access to output parameters or the stored procedure's return value parameter.
781
///
782
/// e.g.:
783
/// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36);
784
/// </remarks>
785
/// <param name="connection">a valid SqlConnection</param>
786
/// <param name="spName">the name of the stored prcedure</param>
787
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
788
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
789
public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, params object[] parameterValues)
790![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
791
//pass through the call using a null transaction value
792
return ExecuteReader(connection, null, spName, parameterValues);
793
}
794![](/Images/OutliningIndicators/InBlock.gif)
795
//these three method overloads currently take both connection and transaction. In post-beta2 builds, only
796
//transaction will need to be passed in, and the .Connection property will be available from that transaction
797![](/Images/OutliningIndicators/InBlock.gif)
798![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
799
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection
800
/// and SqlTransaction.
801
/// </summary>
802
/// <remarks>
803
/// e.g.:
804
/// SqlDataReader dr = ExecuteReader(conn, trans, CommandType.StoredProcedure, "GetOrders");
805
/// </remarks>
806
/// <param name="connection">a valid SqlConnection</param>
807
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
808
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
809
/// <param name="commandText">the stored procedure name or T-SQL command</param>
810
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
811
public static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText)
812![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
813
//pass through the call providing null for the set of SqlParameters
814
return ExecuteReader(connection, transaction, commandType, commandText, (SqlParameter[])null);
815
}
816![](/Images/OutliningIndicators/InBlock.gif)
817![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
818
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection and SqlTransaction
819
/// using the provided parameters.
820
/// </summary>
821
/// <remarks>
822
/// e.g.:
823
/// SqlDataReader dr = ExecuteReader(conn, trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
824
/// </remarks>
825
/// <param name="connection">a valid SqlConnection</param>
826
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
827
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
828
/// <param name="commandText">the stored procedure name or T-SQL command</param>
829
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
830
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
831
public static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
832![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
833
//pass through to private overload, indicating that the connection is owned by the caller
834
return ExecuteReader(connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External);
835
}
836![](/Images/OutliningIndicators/InBlock.gif)
837![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
838
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
839
/// and SqlTransaction using the provided parameter values. This method will discover the parameters for the
840
/// stored procedure, and assign the values based on parameter order.
841
/// </summary>
842
/// <remarks>
843
/// This method provides no access to output parameters or the stored procedure's return value parameter.
844
///
845
/// e.g.:
846
/// SqlDataReader dr = ExecuteReader(conn, trans, "GetOrders", 24, 36);
847
/// </remarks>
848
/// <param name="connection">a valid SqlConnection</param>
849
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
850
/// <param name="spName">the name of the stored prcedure</param>
851
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
852
/// <returns>a SqlDataReader containing the resultset generated by the command</returns>
853
public static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, string spName, params object[] parameterValues)
854![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
855
//if we got parameter values, we need to figure out where they go
856
if ((parameterValues != null) && (parameterValues.Length > 0))
857![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
858
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
859![](/Images/OutliningIndicators/InBlock.gif)
860
AssignParameterValues(commandParameters, parameterValues);
861![](/Images/OutliningIndicators/InBlock.gif)
862
return ExecuteReader(connection, transaction, CommandType.StoredProcedure, spName, commandParameters);
863
}
864
//otherwise we can just call the SP without params
865
else
866![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
867
return ExecuteReader(connection, transaction, CommandType.StoredProcedure, spName);
868
}
869
}
870![](/Images/OutliningIndicators/InBlock.gif)
871
#endregion ExecuteReader
872![](/Images/OutliningIndicators/InBlock.gif)
873![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteScalar#region ExecuteScalar
874
875![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
876
/// Execute a SqlCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in
877
/// the connection string.
878
/// </summary>
879
/// <remarks>
880
/// e.g.:
881
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount");
882
/// </remarks>
883
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
884
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
885
/// <param name="commandText">the stored procedure name or T-SQL command</param>
886
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
887
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText)
888![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
889
//pass through the call providing null for the set of SqlParameters
890
return ExecuteScalar(connectionString, commandType, commandText, (SqlParameter[])null);
891
}
892![](/Images/OutliningIndicators/InBlock.gif)
893![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
894
/// Execute a SqlCommand (that returns a 1x1 resultset) against the database specified in the connection string
895
/// using the provided parameters.
896
/// </summary>
897
/// <remarks>
898
/// e.g.:
899
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
900
/// </remarks>
901
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
902
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
903
/// <param name="commandText">the stored procedure name or T-SQL command</param>
904
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
905
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
906
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
907![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
908
//create & open a SqlConnection, and dispose of it after we are done.
909
using (SqlConnection cn = new SqlConnection(connectionString))
910![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
911
cn.Open();
912![](/Images/OutliningIndicators/InBlock.gif)
913
//call the overload that takes a connection in place of the connection string
914
return ExecuteScalar(cn, commandType, commandText, commandParameters);
915
}
916
}
917![](/Images/OutliningIndicators/InBlock.gif)
918![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
919
/// Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the database specified in
920
/// the conneciton string using the provided parameter values. This method will discover the parameters for the
921
/// stored procedure, and assign the values based on parameter order.
922
/// </summary>
923
/// <remarks>
924
/// This method provides no access to output parameters or the stored procedure's return value parameter.
925
///
926
/// e.g.:
927
/// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36);
928
/// </remarks>
929
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
930
/// <param name="spName">the name of the stored prcedure</param>
931
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
932
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
933
public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues)
934![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
935
//if we got parameter values, we need to figure out where they go
936
if ((parameterValues != null) && (parameterValues.Length > 0))
937![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
938
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
939
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
940![](/Images/OutliningIndicators/InBlock.gif)
941
//assign the provided values to these parameters based on parameter order
942
AssignParameterValues(commandParameters, parameterValues);
943![](/Images/OutliningIndicators/InBlock.gif)
944
//call the overload that takes an array of SqlParameters
945
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);
946
}
947
//otherwise we can just call the SP without params
948
else
949![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
950
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);
951
}
952
}
953![](/Images/OutliningIndicators/InBlock.gif)
954![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
955
/// Execute a SqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided SqlConnection.
956
/// </summary>
957
/// <remarks>
958
/// e.g.:
959
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount");
960
/// </remarks>
961
/// <param name="connection">a valid SqlConnection</param>
962
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
963
/// <param name="commandText">the stored procedure name or T-SQL command</param>
964
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
965
public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText)
966![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
967
//pass through the call using a null transaction value
968
return ExecuteScalar(connection, null, commandType, commandText);
969
}
970![](/Images/OutliningIndicators/InBlock.gif)
971![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
972
/// Execute a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
973
/// using the provided parameters.
974
/// </summary>
975
/// <remarks>
976
/// e.g.:
977
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
978
/// </remarks>
979
/// <param name="connection">a valid SqlConnection</param>
980
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
981
/// <param name="commandText">the stored procedure name or T-SQL command</param>
982
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
983
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
984
public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
985![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
986
//pass through the call using a null transaction value
987
return ExecuteScalar(connection, null, commandType, commandText, commandParameters);
988
}
989![](/Images/OutliningIndicators/InBlock.gif)
990![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
991
/// Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
992
/// using the provided parameter values. This method will discover the parameters for the
993
/// stored procedure, and assign the values based on parameter order.
994
/// </summary>
995
/// <remarks>
996
/// This method provides no access to output parameters or the stored procedure's return value parameter.
997
///
998
/// e.g.:
999
/// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36);
1000
/// </remarks>
1001
/// <param name="connection">a valid SqlConnection</param>
1002
/// <param name="spName">the name of the stored prcedure</param>
1003
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
1004
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1005
public static object ExecuteScalar(SqlConnection connection, string spName, params object[] parameterValues)
1006![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1007
//pass through the call using a null transaction value
1008
return ExecuteScalar(connection, null, spName, parameterValues);
1009
}
1010![](/Images/OutliningIndicators/InBlock.gif)
1011
//these three method overloads currently take both connection and transaction. In post-beta2 builds, only
1012
//transaction will need to be passed in, and the .Connection property will be available from that transaction
1013![](/Images/OutliningIndicators/InBlock.gif)
1014![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1015
/// Execute a SqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided SqlConnection
1016
/// and SqlTransaction.
1017
/// </summary>
1018
/// <remarks>
1019
/// e.g.:
1020
/// int orderCount = (int)ExecuteScalar(conn, trans, CommandType.StoredProcedure, "GetOrderCount");
1021
/// </remarks>
1022
/// <param name="connection">a valid SqlConnection</param>
1023
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
1024
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1025
/// <param name="commandText">the stored procedure name or T-SQL command</param>
1026
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1027
public static object ExecuteScalar(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText)
1028![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1029
//pass through the call providing null for the set of SqlParameters
1030
return ExecuteScalar(connection, transaction, commandType, commandText, (SqlParameter[])null);
1031
}
1032![](/Images/OutliningIndicators/InBlock.gif)
1033![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1034
/// Execute a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection and SqlTransaction
1035
/// using the provided parameters.
1036
/// </summary>
1037
/// <remarks>
1038
/// e.g.:
1039
/// int orderCount = (int)ExecuteScalar(conn, trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
1040
/// </remarks>
1041
/// <param name="connection">a valid SqlConnection</param>
1042
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
1043
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1044
/// <param name="commandText">the stored procedure name or T-SQL command</param>
1045
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
1046
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1047
public static object ExecuteScalar(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1048![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1049
//create a command and prepare it for execution
1050
SqlCommand cmd = new SqlCommand();
1051
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);
1052
1053
//execute the command & return the results
1054
return cmd.ExecuteScalar();
1055![](/Images/OutliningIndicators/InBlock.gif)
1056
}
1057![](/Images/OutliningIndicators/InBlock.gif)
1058![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1059
/// Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
1060
/// and SqlTransaction using the provided parameter values. This method will discover the parameters for the
1061
/// stored procedure, and assign the values based on parameter order.
1062
/// </summary>
1063
/// <remarks>
1064
/// This method provides no access to output parameters or the stored procedure's return value parameter.
1065
///
1066
/// e.g.:
1067
/// int orderCount = (int)ExecuteScalar(conn, trans, "GetOrderCount", 24, 36);
1068
/// </remarks>
1069
/// <param name="connection">a valid SqlConnection</param>
1070
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
1071
/// <param name="spName">the name of the stored prcedure</param>
1072
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
1073
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns>
1074
public static object ExecuteScalar(SqlConnection connection, SqlTransaction transaction, string spName, params object[] parameterValues)
1075![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1076
//if we got parameter values, we need to figure out where they go
1077
if ((parameterValues != null) && (parameterValues.Length > 0))
1078![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1079
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
1080
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
1081![](/Images/OutliningIndicators/InBlock.gif)
1082
//assign the provided values to these parameters based on parameter order
1083
AssignParameterValues(commandParameters, parameterValues);
1084![](/Images/OutliningIndicators/InBlock.gif)
1085
//call the overload that takes an array of SqlParameters
1086
return ExecuteScalar(connection, transaction, CommandType.StoredProcedure, spName, commandParameters);
1087
}
1088
//otherwise we can just call the SP without params
1089
else
1090![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1091
return ExecuteScalar(connection, transaction, CommandType.StoredProcedure, spName);
1092
}
1093
}
1094![](/Images/OutliningIndicators/InBlock.gif)
1095
#endregion ExecuteScalar
1096![](/Images/OutliningIndicators/InBlock.gif)
1097![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ExecuteXmlReader#region ExecuteXmlReader
1098![](/Images/OutliningIndicators/InBlock.gif)
1099![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1100
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
1101
/// </summary>
1102
/// <remarks>
1103
/// e.g.:
1104
/// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders");
1105
/// </remarks>
1106
/// <param name="connection">a valid SqlConnection</param>
1107
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1108
/// <param name="commandText">the stored procedure name or T-SQL command using "FOR XML AUTO"</param>
1109
/// <returns>an XmlReader containing the resultset generated by the command</returns>
1110
public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText)
1111![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1112
//pass through the call using a null transaction value
1113
return ExecuteXmlReader(connection, null, commandType, commandText);
1114
}
1115![](/Images/OutliningIndicators/InBlock.gif)
1116![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1117
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
1118
/// using the provided parameters.
1119
/// </summary>
1120
/// <remarks>
1121
/// e.g.:
1122
/// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1123
/// </remarks>
1124
/// <param name="connection">a valid SqlConnection</param>
1125
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1126
/// <param name="commandText">the stored procedure name or T-SQL command using "FOR XML AUTO"</param>
1127
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
1128
/// <returns>an XmlReader containing the resultset generated by the command</returns>
1129
public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1130![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1131
//pass through the call using a null transaction value
1132
return ExecuteXmlReader(connection, null, commandType, commandText, commandParameters);
1133
}
1134![](/Images/OutliningIndicators/InBlock.gif)
1135![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1136
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
1137
/// using the provided parameter values. This method will discover the parameters for the
1138
/// stored procedure, and assign the values based on parameter order.
1139
/// </summary>
1140
/// <remarks>
1141
/// This method provides no access to output parameters or the stored procedure's return value parameter.
1142
///
1143
/// e.g.:
1144
/// XmlReader r = ExecuteXmlReader(conn, "GetOrders", 24, 36);
1145
/// </remarks>
1146
/// <param name="connection">a valid SqlConnection</param>
1147
/// <param name="spName">the name of the stored prcedure using "FOR XML AUTO"</param>
1148
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
1149
/// <returns>an XmlReader containing the resultset generated by the command</returns>
1150
public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues)
1151![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1152
//pass through the call using a null transaction value
1153
return ExecuteXmlReader(connection, null, spName, parameterValues);
1154
}
1155![](/Images/OutliningIndicators/InBlock.gif)
1156
//these three method overloads currently take both connection and transaction. In post-beta2 builds, only
1157
//transaction will need to be passed in, and the .Connection property will be available from that transaction
1158![](/Images/OutliningIndicators/InBlock.gif)
1159![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1160
/// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection
1161
/// and SqlTransaction.
1162
/// </summary>
1163
/// <remarks>
1164
/// e.g.:
1165
/// XmlReader r = ExecuteXmlReader(conn, trans, CommandType.StoredProcedure, "GetOrders");
1166
/// </remarks>
1167
/// <param name="connection">a valid SqlConnection</param>
1168
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
1169
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1170
/// <param name="commandText">the stored procedure name or T-SQL command using "FOR XML AUTO"</param>
1171
/// <returns>an XmlReader containing the resultset generated by the command</returns>
1172
public static XmlReader ExecuteXmlReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText)
1173![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1174
//pass through the call providing null for the set of SqlParameters
1175
return ExecuteXmlReader(connection, transaction, commandType, commandText, (SqlParameter[])null);
1176
}
1177![](/Images/OutliningIndicators/InBlock.gif)
1178![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1179
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection and SqlTransaction
1180
/// using the provided parameters.
1181
/// </summary>
1182
/// <remarks>
1183
/// e.g.:
1184
/// XmlReader r = ExecuteXmlReader(conn, trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1185
/// </remarks>
1186
/// <param name="connection">a valid SqlConnection</param>
1187
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
1188
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
1189
/// <param name="commandText">the stored procedure name or T-SQL command using "FOR XML AUTO"</param>
1190
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
1191
/// <returns>an XmlReader containing the resultset generated by the command</returns>
1192
public static XmlReader ExecuteXmlReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1193![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1194
//create a command and prepare it for execution
1195
SqlCommand cmd = new SqlCommand();
1196
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);
1197
1198
//create the DataAdapter & DataSet
1199
return cmd.ExecuteXmlReader();
1200
}
1201![](/Images/OutliningIndicators/InBlock.gif)
1202![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1203
/// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
1204
/// and SqlTransaction using the provided parameter values. This method will discover the parameters for the
1205
/// stored procedure, and assign the values based on parameter order.
1206
/// </summary>
1207
/// <remarks>
1208
/// This method provides no access to output parameters or the stored procedure's return value parameter.
1209
///
1210
/// e.g.:
1211
/// XmlReader r = ExecuteXmlReader(conn, trans, "GetOrders", 24, 36);
1212
/// </remarks>
1213
/// <param name="connection">a valid SqlConnection</param>
1214
/// <param name="transaction">a valid SqlTransaction associated with the connection</param>
1215
/// <param name="spName">the name of the stored prcedure</param>
1216
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param>
1217
/// <returns>a dataset containing the resultset generated by the command</returns>
1218
public static XmlReader ExecuteXmlReader(SqlConnection connection, SqlTransaction transaction, string spName, params object[] parameterValues)
1219![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1220
//if we got parameter values, we need to figure out where they go
1221
if ((parameterValues != null) && (parameterValues.Length > 0))
1222![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1223
//pull the parameters for this stored procedure from the parameter cache (or discover them & populet the cache)
1224
SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName);
1225![](/Images/OutliningIndicators/InBlock.gif)
1226
//assign the provided values to these parameters based on parameter order
1227
AssignParameterValues(commandParameters, parameterValues);
1228![](/Images/OutliningIndicators/InBlock.gif)
1229
//call the overload that takes an array of SqlParameters
1230
return ExecuteXmlReader(connection, transaction, CommandType.StoredProcedure, spName, commandParameters);
1231
}
1232
//otherwise we can just call the SP without params
1233
else
1234![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1235
return ExecuteXmlReader(connection, transaction, CommandType.StoredProcedure, spName);
1236
}
1237
}
1238![](/Images/OutliningIndicators/InBlock.gif)
1239![](/Images/OutliningIndicators/InBlock.gif)
1240
#endregion ExecuteXmlReader
1241
}
1242![](/Images/OutliningIndicators/InBlock.gif)
1243![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1244
/// SqlHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the
1245
/// ability to discover parameters for stored procedures at run-time.
1246
/// </summary>
1247
public sealed class SqlHelperParameterCache
1248![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1249![](/Images/OutliningIndicators/ContractedSubBlock.gif)
private methods, variables, and constructors#region private methods, variables, and constructors
1250![](/Images/OutliningIndicators/InBlock.gif)
1251
//Since this class provides only static methods, make the default constructor private to prevent
1252
//instances from being created with "new SqlHelperParameterCache()".
1253![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private SqlHelperParameterCache()
{}
1254![](/Images/OutliningIndicators/InBlock.gif)
1255
//these hashtables are used to map the sp_procedure_params_rowset resultset to the SqlCommand property enum values
1256
private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
1257
private static Hashtable paramTypes = Hashtable.Synchronized(new Hashtable());
1258
private static Hashtable paramDirections = Hashtable.Synchronized(new Hashtable());
1259![](/Images/OutliningIndicators/InBlock.gif)
1260![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1261
/// resolve at run-time the appropriate set of SqlParameters for a stored procedure
1262
/// </summary>
1263
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
1264
/// <param name="spName">the name of the stored prcedure</param>
1265
/// <param name="includeReturnValueParameter">weather or not to onclude ther return value parameter</param>
1266
/// <returns></returns>
1267
private static SqlParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
1268![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1269
DataTable paramDescriptions = new DataTable("paramDescriptions");
1270
using (SqlConnection cn = new SqlConnection(connectionString))
1271![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1272
cn.Open();
1273
SqlCommand cmd = new SqlCommand("sp_procedure_params_rowset",cn);
1274
cmd.CommandType = CommandType.StoredProcedure;
1275
cmd.Parameters.Add("@procedure_name", spName);
1276![](/Images/OutliningIndicators/InBlock.gif)
1277
SqlDataAdapter da = new SqlDataAdapter(cmd);
1278
da.Fill(paramDescriptions);
1279
}
1280![](/Images/OutliningIndicators/InBlock.gif)
1281
SqlParameter[] discoveredParameters;
1282
1283
if (paramDescriptions.Rows.Count <= 0)
1284![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1285
//sp not found - throw exception
1286
throw(new ArgumentException("Stored procedure '" + spName + "' not found", "spName"));
1287
}
1288![](/Images/OutliningIndicators/InBlock.gif)
1289
int startRow;
1290
if (includeReturnValueParameter)
1291![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1292
discoveredParameters = new SqlParameter[paramDescriptions.Rows.Count];
1293
startRow = 0;
1294
}
1295
else
1296![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1297
discoveredParameters = new SqlParameter[paramDescriptions.Rows.Count-1];
1298
startRow = 1;
1299
}
1300![](/Images/OutliningIndicators/InBlock.gif)
1301
for (int i = 0, j = discoveredParameters.Length; i < j; i++)
1302![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1303
DataRow paramRow = paramDescriptions.Rows[i + startRow];
1304
discoveredParameters[i] = new SqlParameter();
1305
discoveredParameters[i].ParameterName = (string)paramRow["PARAMETER_NAME"];
1306
discoveredParameters[i].SqlDbType = (SqlDbType)paramTypes[(string)paramRow["TYPE_NAME"]];
1307
discoveredParameters[i].Direction = (ParameterDirection)paramDirections[(short)paramRow["PARAMETER_TYPE"]];
1308
discoveredParameters[i].Size = paramRow["CHARACTER_OCTET_LENGTH"]==DBNull.Value ? 0 : (int)paramRow["CHARACTER_OCTET_LENGTH"];
1309
discoveredParameters[i].Precision = paramRow["NUMERIC_PRECISION"]==DBNull.Value ? (byte)0 : (byte)(short)paramRow["NUMERIC_PRECISION"];
1310
discoveredParameters[i].Scale = paramRow["NUMERIC_SCALE"]==DBNull.Value ? (byte)0 : (byte)(short)paramRow["NUMERIC_SCALE"];
1311
}
1312![](/Images/OutliningIndicators/InBlock.gif)
1313
return discoveredParameters;
1314
}
1315![](/Images/OutliningIndicators/InBlock.gif)
1316
static SqlHelperParameterCache()
1317![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1318
//populate the mapping hashtables
1319
paramTypes.Add("bigint",SqlDbType.BigInt);
1320
paramTypes.Add("binary",SqlDbType.Binary);
1321
paramTypes.Add("bit",SqlDbType.Bit);
1322
paramTypes.Add("char",SqlDbType.Char);
1323
paramTypes.Add("datetime",SqlDbType.DateTime);
1324
paramTypes.Add("decimal",SqlDbType.Decimal);
1325
paramTypes.Add("float",SqlDbType.Float);
1326
paramTypes.Add("image",SqlDbType.Image);
1327
paramTypes.Add("int",SqlDbType.Int);
1328
paramTypes.Add("money",SqlDbType.Money);
1329
paramTypes.Add("nchar",SqlDbType.NChar);
1330
paramTypes.Add("ntext",SqlDbType.NText);
1331
paramTypes.Add("numeric",SqlDbType.Decimal);
1332
paramTypes.Add("nvarchar",SqlDbType.NVarChar);
1333
paramTypes.Add("real",SqlDbType.Real);
1334
paramTypes.Add("smalldatetime",SqlDbType.SmallDateTime);
1335
paramTypes.Add("smallint",SqlDbType.SmallInt);
1336
paramTypes.Add("smallmoney",SqlDbType.SmallMoney);
1337
paramTypes.Add("sql_variant",SqlDbType.Variant);
1338
paramTypes.Add("text",SqlDbType.Text);
1339
paramTypes.Add("timestamp",SqlDbType.Timestamp);
1340
paramTypes.Add("tinyint",SqlDbType.TinyInt);
1341
paramTypes.Add("uniqueidentifier",SqlDbType.UniqueIdentifier);
1342
paramTypes.Add("varbinary",SqlDbType.VarBinary);
1343
paramTypes.Add("varchar",SqlDbType.VarChar);
1344![](/Images/OutliningIndicators/InBlock.gif)
1345
paramDirections.Add((short)1,ParameterDirection.Input);
1346
paramDirections.Add((short)2,ParameterDirection.InputOutput);
1347
paramDirections.Add((short)4,ParameterDirection.ReturnValue);
1348![](/Images/OutliningIndicators/InBlock.gif)
1349
}
1350
//deep copy of cached SqlParameter array
1351
private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
1352![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1353
SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length];
1354![](/Images/OutliningIndicators/InBlock.gif)
1355
for (int i = 0, j = originalParameters.Length; i < j; i++)
1356![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1357
clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone();
1358
}
1359![](/Images/OutliningIndicators/InBlock.gif)
1360
return clonedParameters;
1361
}
1362![](/Images/OutliningIndicators/InBlock.gif)
1363
#endregion private methods, variables, and constructors
1364![](/Images/OutliningIndicators/InBlock.gif)
1365![](/Images/OutliningIndicators/ContractedSubBlock.gif)
caching functions#region caching functions
1366![](/Images/OutliningIndicators/InBlock.gif)
1367![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1368
/// add parameter array to the cache
1369
/// </summary>
1370
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
1371
/// <param name="commandText">the stored procedure name or T-SQL command</param>
1372
/// <param name="commandParameters">an array of SqlParamters to be cached</param>
1373
public static void CacheParameterSet(string connectionString, string commandText, params SqlParameter[] commandParameters)
1374![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1375
string hashKey = connectionString + ":" + commandText;
1376![](/Images/OutliningIndicators/InBlock.gif)
1377
paramCache[hashKey] = commandParameters;
1378
}
1379![](/Images/OutliningIndicators/InBlock.gif)
1380![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1381
/// retrieve a parameter array from the cache
1382
/// </summary>
1383
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
1384
/// <param name="commandText">the stored procedure name or T-SQL command</param>
1385
/// <returns>an array of SqlParamters</returns>
1386
public static SqlParameter[] GetCachedParameterSet(string connectionString, string commandText)
1387![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1388
string hashKey = connectionString + ":" + commandText;
1389![](/Images/OutliningIndicators/InBlock.gif)
1390
SqlParameter[] cachedParameters = (SqlParameter[])paramCache[hashKey];
1391
1392
if (cachedParameters == null)
1393![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1394
return null;
1395
}
1396
else
1397![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1398
return CloneParameters(cachedParameters);
1399
}
1400
}
1401![](/Images/OutliningIndicators/InBlock.gif)
1402
#endregion caching functions
1403![](/Images/OutliningIndicators/InBlock.gif)
1404![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Parameter Discovery Functions#region Parameter Discovery Functions
1405![](/Images/OutliningIndicators/InBlock.gif)
1406![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1407
/// Retrieves the set of SqlParameters appropriate for the stored procedure
1408
/// </summary>
1409
/// <remarks>
1410
/// This method will query the database for this information, and then store it in a cache for future requests.
1411
/// </remarks>
1412
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
1413
/// <param name="spName">the name of the stored prcedure</param>
1414
/// <returns>an array of SqlParameters</returns>
1415
public static SqlParameter[] GetSpParameterSet(string connectionString, string spName)
1416![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1417
return GetSpParameterSet(connectionString, spName, false);
1418
}
1419![](/Images/OutliningIndicators/InBlock.gif)
1420![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
1421
/// Retrieves the set of SqlParameters appropriate for the stored procedure
1422
/// </summary>
1423
/// <remarks>
1424
/// This method will query the database for this information, and then store it in a cache for future requests.
1425
/// </remarks>
1426
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
1427
/// <param name="spName">the name of the stored prcedure</param>
1428
/// <param name="includeReturnValueParameter">a bool value indicating weather the return value parameter should be included in the results</param>
1429
/// <returns>an array of SqlParameters</returns>
1430
public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
1431![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1432
string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter":"");
1433![](/Images/OutliningIndicators/InBlock.gif)
1434
SqlParameter[] cachedParameters;
1435
1436
cachedParameters = (SqlParameter[])paramCache[hashKey];
1437![](/Images/OutliningIndicators/InBlock.gif)
1438
if (cachedParameters == null)
1439![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
1440
cachedParameters = (SqlParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter));
1441
}
1442
1443
return CloneParameters(cachedParameters);
1444
}
1445![](/Images/OutliningIndicators/InBlock.gif)
1446
#endregion Parameter Discovery Functions
1447![](/Images/OutliningIndicators/InBlock.gif)
1448
}
1449
}
1450![](/Images/OutliningIndicators/None.gif)
To be continue...
SQLHelper — 当前使用最广泛的SQL SERVER操作类,转自MS MAAB
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
![](/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/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
36
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
79
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
95
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/InBlock.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/InBlock.gif)
168
![](/Images/OutliningIndicators/InBlock.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/InBlock.gif)
171
![](/Images/OutliningIndicators/InBlock.gif)
172
![](/Images/OutliningIndicators/InBlock.gif)
173
![](/Images/OutliningIndicators/InBlock.gif)
174
![](/Images/OutliningIndicators/InBlock.gif)
175
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
176
![](/Images/OutliningIndicators/InBlock.gif)
177
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
178
![](/Images/OutliningIndicators/InBlock.gif)
179
![](/Images/OutliningIndicators/InBlock.gif)
180
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
181
![](/Images/OutliningIndicators/InBlock.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/InBlock.gif)
184
![](/Images/OutliningIndicators/InBlock.gif)
185
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
186
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
187
![](/Images/OutliningIndicators/InBlock.gif)
188
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/InBlock.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/InBlock.gif)
200
![](/Images/OutliningIndicators/InBlock.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
203
![](/Images/OutliningIndicators/InBlock.gif)
204
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
205
![](/Images/OutliningIndicators/InBlock.gif)
206
![](/Images/OutliningIndicators/InBlock.gif)
207
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/InBlock.gif)
210
![](/Images/OutliningIndicators/InBlock.gif)
211
![](/Images/OutliningIndicators/InBlock.gif)
212
![](/Images/OutliningIndicators/InBlock.gif)
213
![](/Images/OutliningIndicators/InBlock.gif)
214
![](/Images/OutliningIndicators/InBlock.gif)
215
![](/Images/OutliningIndicators/InBlock.gif)
216
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
217
![](/Images/OutliningIndicators/InBlock.gif)
218
![](/Images/OutliningIndicators/InBlock.gif)
219
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
220
![](/Images/OutliningIndicators/InBlock.gif)
221
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
222
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
223
![](/Images/OutliningIndicators/InBlock.gif)
224
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
225
![](/Images/OutliningIndicators/InBlock.gif)
226
![](/Images/OutliningIndicators/InBlock.gif)
227
![](/Images/OutliningIndicators/InBlock.gif)
228
![](/Images/OutliningIndicators/InBlock.gif)
229
![](/Images/OutliningIndicators/InBlock.gif)
230
![](/Images/OutliningIndicators/InBlock.gif)
231
![](/Images/OutliningIndicators/InBlock.gif)
232
![](/Images/OutliningIndicators/InBlock.gif)
233
![](/Images/OutliningIndicators/InBlock.gif)
234
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
235
![](/Images/OutliningIndicators/InBlock.gif)
236
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
237
![](/Images/OutliningIndicators/InBlock.gif)
238
![](/Images/OutliningIndicators/InBlock.gif)
239
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
240
![](/Images/OutliningIndicators/InBlock.gif)
241
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
242
![](/Images/OutliningIndicators/InBlock.gif)
243
![](/Images/OutliningIndicators/InBlock.gif)
244
![](/Images/OutliningIndicators/InBlock.gif)
245
![](/Images/OutliningIndicators/InBlock.gif)
246
![](/Images/OutliningIndicators/InBlock.gif)
247
![](/Images/OutliningIndicators/InBlock.gif)
248
![](/Images/OutliningIndicators/InBlock.gif)
249
![](/Images/OutliningIndicators/InBlock.gif)
250
![](/Images/OutliningIndicators/InBlock.gif)
251
![](/Images/OutliningIndicators/InBlock.gif)
252
![](/Images/OutliningIndicators/InBlock.gif)
253
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
254
![](/Images/OutliningIndicators/InBlock.gif)
255
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
256
![](/Images/OutliningIndicators/InBlock.gif)
257
![](/Images/OutliningIndicators/InBlock.gif)
258
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
259
![](/Images/OutliningIndicators/InBlock.gif)
260
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
272
![](/Images/OutliningIndicators/InBlock.gif)
273
![](/Images/OutliningIndicators/InBlock.gif)
274
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.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/ExpandedSubBlockEnd.gif)
280
![](/Images/OutliningIndicators/InBlock.gif)
281
![](/Images/OutliningIndicators/InBlock.gif)
282
![](/Images/OutliningIndicators/InBlock.gif)
283
![](/Images/OutliningIndicators/InBlock.gif)
284
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
285
![](/Images/OutliningIndicators/InBlock.gif)
286
![](/Images/OutliningIndicators/InBlock.gif)
287
![](/Images/OutliningIndicators/InBlock.gif)
288
![](/Images/OutliningIndicators/InBlock.gif)
289
![](/Images/OutliningIndicators/InBlock.gif)
290
![](/Images/OutliningIndicators/InBlock.gif)
291
![](/Images/OutliningIndicators/InBlock.gif)
292
![](/Images/OutliningIndicators/InBlock.gif)
293
![](/Images/OutliningIndicators/InBlock.gif)
294
![](/Images/OutliningIndicators/InBlock.gif)
295
![](/Images/OutliningIndicators/InBlock.gif)
296
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
297
![](/Images/OutliningIndicators/InBlock.gif)
298
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
299
![](/Images/OutliningIndicators/InBlock.gif)
300
![](/Images/OutliningIndicators/InBlock.gif)
301
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
302
![](/Images/OutliningIndicators/InBlock.gif)
303
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
304
![](/Images/OutliningIndicators/InBlock.gif)
305
![](/Images/OutliningIndicators/InBlock.gif)
306
![](/Images/OutliningIndicators/InBlock.gif)
307
![](/Images/OutliningIndicators/InBlock.gif)
308
![](/Images/OutliningIndicators/InBlock.gif)
309
![](/Images/OutliningIndicators/InBlock.gif)
310
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
317
![](/Images/OutliningIndicators/InBlock.gif)
318
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
319
![](/Images/OutliningIndicators/InBlock.gif)
320
![](/Images/OutliningIndicators/InBlock.gif)
321
![](/Images/OutliningIndicators/InBlock.gif)
322
![](/Images/OutliningIndicators/InBlock.gif)
323
![](/Images/OutliningIndicators/InBlock.gif)
324
![](/Images/OutliningIndicators/InBlock.gif)
325
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
326
![](/Images/OutliningIndicators/InBlock.gif)
327
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
328
![](/Images/OutliningIndicators/InBlock.gif)
329
![](/Images/OutliningIndicators/InBlock.gif)
330
![](/Images/OutliningIndicators/InBlock.gif)
331
![](/Images/OutliningIndicators/InBlock.gif)
332
![](/Images/OutliningIndicators/InBlock.gif)
333
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
343
![](/Images/OutliningIndicators/InBlock.gif)
344
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
345
![](/Images/OutliningIndicators/InBlock.gif)
346
![](/Images/OutliningIndicators/InBlock.gif)
347
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
348
![](/Images/OutliningIndicators/InBlock.gif)
349
![](/Images/OutliningIndicators/InBlock.gif)
350
![](/Images/OutliningIndicators/InBlock.gif)
351
![](/Images/OutliningIndicators/InBlock.gif)
352
![](/Images/OutliningIndicators/InBlock.gif)
353
![](/Images/OutliningIndicators/InBlock.gif)
354
![](/Images/OutliningIndicators/InBlock.gif)
355
![](/Images/OutliningIndicators/InBlock.gif)
356
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
357
![](/Images/OutliningIndicators/InBlock.gif)
358
![](/Images/OutliningIndicators/InBlock.gif)
359
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
360
![](/Images/OutliningIndicators/InBlock.gif)
361
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
362
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
363
![](/Images/OutliningIndicators/InBlock.gif)
364
![](/Images/OutliningIndicators/InBlock.gif)
365
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
366
![](/Images/OutliningIndicators/InBlock.gif)
367
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
368
![](/Images/OutliningIndicators/InBlock.gif)
369
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
370
![](/Images/OutliningIndicators/InBlock.gif)
371
![](/Images/OutliningIndicators/InBlock.gif)
372
![](/Images/OutliningIndicators/InBlock.gif)
373
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
381
![](/Images/OutliningIndicators/InBlock.gif)
382
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
383
![](/Images/OutliningIndicators/InBlock.gif)
384
![](/Images/OutliningIndicators/InBlock.gif)
385
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
386
![](/Images/OutliningIndicators/InBlock.gif)
387
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
388
![](/Images/OutliningIndicators/InBlock.gif)
389
![](/Images/OutliningIndicators/InBlock.gif)
390
![](/Images/OutliningIndicators/InBlock.gif)
391
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
400
![](/Images/OutliningIndicators/InBlock.gif)
401
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
402
![](/Images/OutliningIndicators/InBlock.gif)
403
![](/Images/OutliningIndicators/InBlock.gif)
404
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
405
![](/Images/OutliningIndicators/InBlock.gif)
406
![](/Images/OutliningIndicators/InBlock.gif)
407
![](/Images/OutliningIndicators/InBlock.gif)
408
![](/Images/OutliningIndicators/InBlock.gif)
409
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
410
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
411
![](/Images/OutliningIndicators/InBlock.gif)
412
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
413
![](/Images/OutliningIndicators/InBlock.gif)
414
![](/Images/OutliningIndicators/InBlock.gif)
415
![](/Images/OutliningIndicators/InBlock.gif)
416
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
427
![](/Images/OutliningIndicators/InBlock.gif)
428
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
429
![](/Images/OutliningIndicators/InBlock.gif)
430
![](/Images/OutliningIndicators/InBlock.gif)
431
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
432
![](/Images/OutliningIndicators/InBlock.gif)
433
![](/Images/OutliningIndicators/InBlock.gif)
434
![](/Images/OutliningIndicators/InBlock.gif)
435
![](/Images/OutliningIndicators/InBlock.gif)
436
![](/Images/OutliningIndicators/InBlock.gif)
437
![](/Images/OutliningIndicators/InBlock.gif)
438
![](/Images/OutliningIndicators/InBlock.gif)
439
![](/Images/OutliningIndicators/InBlock.gif)
440
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
441
![](/Images/OutliningIndicators/InBlock.gif)
442
![](/Images/OutliningIndicators/InBlock.gif)
443
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
444
![](/Images/OutliningIndicators/InBlock.gif)
445
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
446
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
447
![](/Images/OutliningIndicators/InBlock.gif)
448
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
449
![](/Images/OutliningIndicators/InBlock.gif)
450
![](/Images/OutliningIndicators/InBlock.gif)
451
![](/Images/OutliningIndicators/InBlock.gif)
452
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
459
![](/Images/OutliningIndicators/InBlock.gif)
460
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
461
![](/Images/OutliningIndicators/InBlock.gif)
462
![](/Images/OutliningIndicators/InBlock.gif)
463
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
464
![](/Images/OutliningIndicators/InBlock.gif)
465
![](/Images/OutliningIndicators/InBlock.gif)
466
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
467
![](/Images/OutliningIndicators/InBlock.gif)
468
![](/Images/OutliningIndicators/InBlock.gif)
469
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
479
![](/Images/OutliningIndicators/InBlock.gif)
480
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
481
![](/Images/OutliningIndicators/InBlock.gif)
482
![](/Images/OutliningIndicators/InBlock.gif)
483
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
484
![](/Images/OutliningIndicators/InBlock.gif)
485
![](/Images/OutliningIndicators/InBlock.gif)
486
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
498
![](/Images/OutliningIndicators/InBlock.gif)
499
![](/Images/OutliningIndicators/InBlock.gif)
500
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
501
![](/Images/OutliningIndicators/InBlock.gif)
502
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
503
![](/Images/OutliningIndicators/InBlock.gif)
504
![](/Images/OutliningIndicators/InBlock.gif)
505
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
506
![](/Images/OutliningIndicators/InBlock.gif)
507
![](/Images/OutliningIndicators/InBlock.gif)
508
![](/Images/OutliningIndicators/InBlock.gif)
509
![](/Images/OutliningIndicators/InBlock.gif)
510
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
511
![](/Images/OutliningIndicators/InBlock.gif)
512
![](/Images/OutliningIndicators/InBlock.gif)
513
![](/Images/OutliningIndicators/InBlock.gif)
514
![](/Images/OutliningIndicators/InBlock.gif)
515
![](/Images/OutliningIndicators/InBlock.gif)
516
![](/Images/OutliningIndicators/InBlock.gif)
517
![](/Images/OutliningIndicators/InBlock.gif)
518
![](/Images/OutliningIndicators/InBlock.gif)
519
![](/Images/OutliningIndicators/InBlock.gif)
520
![](/Images/OutliningIndicators/InBlock.gif)
521
![](/Images/OutliningIndicators/InBlock.gif)
522
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
523
![](/Images/OutliningIndicators/InBlock.gif)
524
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
525
![](/Images/OutliningIndicators/InBlock.gif)
526
![](/Images/OutliningIndicators/InBlock.gif)
527
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
528
![](/Images/OutliningIndicators/InBlock.gif)
529
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
530
![](/Images/OutliningIndicators/InBlock.gif)
531
![](/Images/OutliningIndicators/InBlock.gif)
532
![](/Images/OutliningIndicators/InBlock.gif)
533
![](/Images/OutliningIndicators/InBlock.gif)
534
![](/Images/OutliningIndicators/InBlock.gif)
535
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
543
![](/Images/OutliningIndicators/InBlock.gif)
544
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
545
![](/Images/OutliningIndicators/InBlock.gif)
546
![](/Images/OutliningIndicators/InBlock.gif)
547
![](/Images/OutliningIndicators/InBlock.gif)
548
![](/Images/OutliningIndicators/InBlock.gif)
549
![](/Images/OutliningIndicators/InBlock.gif)
550
![](/Images/OutliningIndicators/InBlock.gif)
551
![](/Images/OutliningIndicators/InBlock.gif)
552
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
559
![](/Images/OutliningIndicators/InBlock.gif)
560
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
561
![](/Images/OutliningIndicators/InBlock.gif)
562
![](/Images/OutliningIndicators/InBlock.gif)
563
![](/Images/OutliningIndicators/InBlock.gif)
564
![](/Images/OutliningIndicators/InBlock.gif)
565
![](/Images/OutliningIndicators/InBlock.gif)
566
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
576
![](/Images/OutliningIndicators/InBlock.gif)
577
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
578
![](/Images/OutliningIndicators/InBlock.gif)
579
![](/Images/OutliningIndicators/InBlock.gif)
580
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
581
![](/Images/OutliningIndicators/InBlock.gif)
582
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
590
![](/Images/OutliningIndicators/InBlock.gif)
591
![](/Images/OutliningIndicators/InBlock.gif)
592
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
593
![](/Images/OutliningIndicators/InBlock.gif)
594
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
595
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
596
![](/Images/OutliningIndicators/InBlock.gif)
597
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
598
![](/Images/OutliningIndicators/InBlock.gif)
599
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
600
![](/Images/OutliningIndicators/InBlock.gif)
601
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
602
![](/Images/OutliningIndicators/InBlock.gif)
603
![](/Images/OutliningIndicators/InBlock.gif)
604
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
605
![](/Images/OutliningIndicators/InBlock.gif)
606
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
607
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
608
![](/Images/OutliningIndicators/InBlock.gif)
609
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
610
![](/Images/OutliningIndicators/InBlock.gif)
611
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
612
![](/Images/OutliningIndicators/InBlock.gif)
613
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
614
![](/Images/OutliningIndicators/InBlock.gif)
615
![](/Images/OutliningIndicators/InBlock.gif)
616
![](/Images/OutliningIndicators/InBlock.gif)
617
![](/Images/OutliningIndicators/InBlock.gif)
618
![](/Images/OutliningIndicators/InBlock.gif)
619
![](/Images/OutliningIndicators/InBlock.gif)
620
![](/Images/OutliningIndicators/InBlock.gif)
621
![](/Images/OutliningIndicators/InBlock.gif)
622
![](/Images/OutliningIndicators/InBlock.gif)
623
![](/Images/OutliningIndicators/InBlock.gif)
624
![](/Images/OutliningIndicators/InBlock.gif)
625
![](/Images/OutliningIndicators/InBlock.gif)
626
![](/Images/OutliningIndicators/InBlock.gif)
627
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
628
![](/Images/OutliningIndicators/InBlock.gif)
629
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
630
![](/Images/OutliningIndicators/InBlock.gif)
631
![](/Images/OutliningIndicators/InBlock.gif)
632
![](/Images/OutliningIndicators/InBlock.gif)
633
![](/Images/OutliningIndicators/InBlock.gif)
634
![](/Images/OutliningIndicators/InBlock.gif)
635
![](/Images/OutliningIndicators/InBlock.gif)
636
![](/Images/OutliningIndicators/InBlock.gif)
637
![](/Images/OutliningIndicators/InBlock.gif)
638
![](/Images/OutliningIndicators/InBlock.gif)
639
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
640
![](/Images/OutliningIndicators/InBlock.gif)
641
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
642
![](/Images/OutliningIndicators/InBlock.gif)
643
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
644
![](/Images/OutliningIndicators/InBlock.gif)
645
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
646
![](/Images/OutliningIndicators/InBlock.gif)
647
![](/Images/OutliningIndicators/InBlock.gif)
648
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
649
![](/Images/OutliningIndicators/InBlock.gif)
650
![](/Images/OutliningIndicators/InBlock.gif)
651
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
662
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
663
![](/Images/OutliningIndicators/InBlock.gif)
664
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
665
![](/Images/OutliningIndicators/InBlock.gif)
666
![](/Images/OutliningIndicators/InBlock.gif)
667
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
668
![](/Images/OutliningIndicators/InBlock.gif)
669
![](/Images/OutliningIndicators/InBlock.gif)
670
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
671
![](/Images/OutliningIndicators/InBlock.gif)
672
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
683
![](/Images/OutliningIndicators/InBlock.gif)
684
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
685
![](/Images/OutliningIndicators/InBlock.gif)
686
![](/Images/OutliningIndicators/InBlock.gif)
687
![](/Images/OutliningIndicators/InBlock.gif)
688
![](/Images/OutliningIndicators/InBlock.gif)
689
![](/Images/OutliningIndicators/InBlock.gif)
690
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
691
![](/Images/OutliningIndicators/InBlock.gif)
692
![](/Images/OutliningIndicators/InBlock.gif)
693
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
694
![](/Images/OutliningIndicators/InBlock.gif)
695
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
696
![](/Images/OutliningIndicators/InBlock.gif)
697
![](/Images/OutliningIndicators/InBlock.gif)
698
![](/Images/OutliningIndicators/InBlock.gif)
699
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
700
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
701
![](/Images/OutliningIndicators/InBlock.gif)
702
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
703
![](/Images/OutliningIndicators/InBlock.gif)
704
![](/Images/OutliningIndicators/InBlock.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/InBlock.gif)
711
![](/Images/OutliningIndicators/InBlock.gif)
712
![](/Images/OutliningIndicators/InBlock.gif)
713
![](/Images/OutliningIndicators/InBlock.gif)
714
![](/Images/OutliningIndicators/InBlock.gif)
715
![](/Images/OutliningIndicators/InBlock.gif)
716
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
717
![](/Images/OutliningIndicators/InBlock.gif)
718
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
719
![](/Images/OutliningIndicators/InBlock.gif)
720
![](/Images/OutliningIndicators/InBlock.gif)
721
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
722
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
731
![](/Images/OutliningIndicators/InBlock.gif)
732
![](/Images/OutliningIndicators/InBlock.gif)
733
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
734
![](/Images/OutliningIndicators/InBlock.gif)
735
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
736
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
737
![](/Images/OutliningIndicators/InBlock.gif)
738
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
739
![](/Images/OutliningIndicators/InBlock.gif)
740
![](/Images/OutliningIndicators/InBlock.gif)
741
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
749
![](/Images/OutliningIndicators/InBlock.gif)
750
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
751
![](/Images/OutliningIndicators/InBlock.gif)
752
![](/Images/OutliningIndicators/InBlock.gif)
753
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
754
![](/Images/OutliningIndicators/InBlock.gif)
755
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
756
![](/Images/OutliningIndicators/InBlock.gif)
757
![](/Images/OutliningIndicators/InBlock.gif)
758
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
768
![](/Images/OutliningIndicators/InBlock.gif)
769
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
770
![](/Images/OutliningIndicators/InBlock.gif)
771
![](/Images/OutliningIndicators/InBlock.gif)
772
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
773
![](/Images/OutliningIndicators/InBlock.gif)
774
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
775
![](/Images/OutliningIndicators/InBlock.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/InBlock.gif)
788
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
789
![](/Images/OutliningIndicators/InBlock.gif)
790
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
791
![](/Images/OutliningIndicators/InBlock.gif)
792
![](/Images/OutliningIndicators/InBlock.gif)
793
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
794
![](/Images/OutliningIndicators/InBlock.gif)
795
![](/Images/OutliningIndicators/InBlock.gif)
796
![](/Images/OutliningIndicators/InBlock.gif)
797
![](/Images/OutliningIndicators/InBlock.gif)
798
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
809
![](/Images/OutliningIndicators/InBlock.gif)
810
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
811
![](/Images/OutliningIndicators/InBlock.gif)
812
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
813
![](/Images/OutliningIndicators/InBlock.gif)
814
![](/Images/OutliningIndicators/InBlock.gif)
815
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
816
![](/Images/OutliningIndicators/InBlock.gif)
817
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
818
![](/Images/OutliningIndicators/InBlock.gif)
819
![](/Images/OutliningIndicators/InBlock.gif)
820
![](/Images/OutliningIndicators/InBlock.gif)
821
![](/Images/OutliningIndicators/InBlock.gif)
822
![](/Images/OutliningIndicators/InBlock.gif)
823
![](/Images/OutliningIndicators/InBlock.gif)
824
![](/Images/OutliningIndicators/InBlock.gif)
825
![](/Images/OutliningIndicators/InBlock.gif)
826
![](/Images/OutliningIndicators/InBlock.gif)
827
![](/Images/OutliningIndicators/InBlock.gif)
828
![](/Images/OutliningIndicators/InBlock.gif)
829
![](/Images/OutliningIndicators/InBlock.gif)
830
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
831
![](/Images/OutliningIndicators/InBlock.gif)
832
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
833
![](/Images/OutliningIndicators/InBlock.gif)
834
![](/Images/OutliningIndicators/InBlock.gif)
835
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
836
![](/Images/OutliningIndicators/InBlock.gif)
837
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
838
![](/Images/OutliningIndicators/InBlock.gif)
839
![](/Images/OutliningIndicators/InBlock.gif)
840
![](/Images/OutliningIndicators/InBlock.gif)
841
![](/Images/OutliningIndicators/InBlock.gif)
842
![](/Images/OutliningIndicators/InBlock.gif)
843
![](/Images/OutliningIndicators/InBlock.gif)
844
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
853
![](/Images/OutliningIndicators/InBlock.gif)
854
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
855
![](/Images/OutliningIndicators/InBlock.gif)
856
![](/Images/OutliningIndicators/InBlock.gif)
857
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
858
![](/Images/OutliningIndicators/InBlock.gif)
859
![](/Images/OutliningIndicators/InBlock.gif)
860
![](/Images/OutliningIndicators/InBlock.gif)
861
![](/Images/OutliningIndicators/InBlock.gif)
862
![](/Images/OutliningIndicators/InBlock.gif)
863
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
864
![](/Images/OutliningIndicators/InBlock.gif)
865
![](/Images/OutliningIndicators/InBlock.gif)
866
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
867
![](/Images/OutliningIndicators/InBlock.gif)
868
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
869
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
870
![](/Images/OutliningIndicators/InBlock.gif)
871
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
872
![](/Images/OutliningIndicators/InBlock.gif)
873
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
874
![](/Images/OutliningIndicators/InBlock.gif)
875
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
876
![](/Images/OutliningIndicators/InBlock.gif)
877
![](/Images/OutliningIndicators/InBlock.gif)
878
![](/Images/OutliningIndicators/InBlock.gif)
879
![](/Images/OutliningIndicators/InBlock.gif)
880
![](/Images/OutliningIndicators/InBlock.gif)
881
![](/Images/OutliningIndicators/InBlock.gif)
882
![](/Images/OutliningIndicators/InBlock.gif)
883
![](/Images/OutliningIndicators/InBlock.gif)
884
![](/Images/OutliningIndicators/InBlock.gif)
885
![](/Images/OutliningIndicators/InBlock.gif)
886
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
887
![](/Images/OutliningIndicators/InBlock.gif)
888
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
889
![](/Images/OutliningIndicators/InBlock.gif)
890
![](/Images/OutliningIndicators/InBlock.gif)
891
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
892
![](/Images/OutliningIndicators/InBlock.gif)
893
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
894
![](/Images/OutliningIndicators/InBlock.gif)
895
![](/Images/OutliningIndicators/InBlock.gif)
896
![](/Images/OutliningIndicators/InBlock.gif)
897
![](/Images/OutliningIndicators/InBlock.gif)
898
![](/Images/OutliningIndicators/InBlock.gif)
899
![](/Images/OutliningIndicators/InBlock.gif)
900
![](/Images/OutliningIndicators/InBlock.gif)
901
![](/Images/OutliningIndicators/InBlock.gif)
902
![](/Images/OutliningIndicators/InBlock.gif)
903
![](/Images/OutliningIndicators/InBlock.gif)
904
![](/Images/OutliningIndicators/InBlock.gif)
905
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
906
![](/Images/OutliningIndicators/InBlock.gif)
907
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
908
![](/Images/OutliningIndicators/InBlock.gif)
909
![](/Images/OutliningIndicators/InBlock.gif)
910
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
911
![](/Images/OutliningIndicators/InBlock.gif)
912
![](/Images/OutliningIndicators/InBlock.gif)
913
![](/Images/OutliningIndicators/InBlock.gif)
914
![](/Images/OutliningIndicators/InBlock.gif)
915
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.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/InBlock.gif)
931
![](/Images/OutliningIndicators/InBlock.gif)
932
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
933
![](/Images/OutliningIndicators/InBlock.gif)
934
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
935
![](/Images/OutliningIndicators/InBlock.gif)
936
![](/Images/OutliningIndicators/InBlock.gif)
937
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
938
![](/Images/OutliningIndicators/InBlock.gif)
939
![](/Images/OutliningIndicators/InBlock.gif)
940
![](/Images/OutliningIndicators/InBlock.gif)
941
![](/Images/OutliningIndicators/InBlock.gif)
942
![](/Images/OutliningIndicators/InBlock.gif)
943
![](/Images/OutliningIndicators/InBlock.gif)
944
![](/Images/OutliningIndicators/InBlock.gif)
945
![](/Images/OutliningIndicators/InBlock.gif)
946
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
947
![](/Images/OutliningIndicators/InBlock.gif)
948
![](/Images/OutliningIndicators/InBlock.gif)
949
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
950
![](/Images/OutliningIndicators/InBlock.gif)
951
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
952
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
953
![](/Images/OutliningIndicators/InBlock.gif)
954
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
955
![](/Images/OutliningIndicators/InBlock.gif)
956
![](/Images/OutliningIndicators/InBlock.gif)
957
![](/Images/OutliningIndicators/InBlock.gif)
958
![](/Images/OutliningIndicators/InBlock.gif)
959
![](/Images/OutliningIndicators/InBlock.gif)
960
![](/Images/OutliningIndicators/InBlock.gif)
961
![](/Images/OutliningIndicators/InBlock.gif)
962
![](/Images/OutliningIndicators/InBlock.gif)
963
![](/Images/OutliningIndicators/InBlock.gif)
964
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
965
![](/Images/OutliningIndicators/InBlock.gif)
966
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
967
![](/Images/OutliningIndicators/InBlock.gif)
968
![](/Images/OutliningIndicators/InBlock.gif)
969
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
970
![](/Images/OutliningIndicators/InBlock.gif)
971
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
972
![](/Images/OutliningIndicators/InBlock.gif)
973
![](/Images/OutliningIndicators/InBlock.gif)
974
![](/Images/OutliningIndicators/InBlock.gif)
975
![](/Images/OutliningIndicators/InBlock.gif)
976
![](/Images/OutliningIndicators/InBlock.gif)
977
![](/Images/OutliningIndicators/InBlock.gif)
978
![](/Images/OutliningIndicators/InBlock.gif)
979
![](/Images/OutliningIndicators/InBlock.gif)
980
![](/Images/OutliningIndicators/InBlock.gif)
981
![](/Images/OutliningIndicators/InBlock.gif)
982
![](/Images/OutliningIndicators/InBlock.gif)
983
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
984
![](/Images/OutliningIndicators/InBlock.gif)
985
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
986
![](/Images/OutliningIndicators/InBlock.gif)
987
![](/Images/OutliningIndicators/InBlock.gif)
988
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
989
![](/Images/OutliningIndicators/InBlock.gif)
990
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
991
![](/Images/OutliningIndicators/InBlock.gif)
992
![](/Images/OutliningIndicators/InBlock.gif)
993
![](/Images/OutliningIndicators/InBlock.gif)
994
![](/Images/OutliningIndicators/InBlock.gif)
995
![](/Images/OutliningIndicators/InBlock.gif)
996
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
1005
![](/Images/OutliningIndicators/InBlock.gif)
1006
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1007
![](/Images/OutliningIndicators/InBlock.gif)
1008
![](/Images/OutliningIndicators/InBlock.gif)
1009
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1010
![](/Images/OutliningIndicators/InBlock.gif)
1011
![](/Images/OutliningIndicators/InBlock.gif)
1012
![](/Images/OutliningIndicators/InBlock.gif)
1013
![](/Images/OutliningIndicators/InBlock.gif)
1014
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1015
![](/Images/OutliningIndicators/InBlock.gif)
1016
![](/Images/OutliningIndicators/InBlock.gif)
1017
![](/Images/OutliningIndicators/InBlock.gif)
1018
![](/Images/OutliningIndicators/InBlock.gif)
1019
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
1027
![](/Images/OutliningIndicators/InBlock.gif)
1028
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1029
![](/Images/OutliningIndicators/InBlock.gif)
1030
![](/Images/OutliningIndicators/InBlock.gif)
1031
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1032
![](/Images/OutliningIndicators/InBlock.gif)
1033
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1034
![](/Images/OutliningIndicators/InBlock.gif)
1035
![](/Images/OutliningIndicators/InBlock.gif)
1036
![](/Images/OutliningIndicators/InBlock.gif)
1037
![](/Images/OutliningIndicators/InBlock.gif)
1038
![](/Images/OutliningIndicators/InBlock.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/ExpandedSubBlockEnd.gif)
1047
![](/Images/OutliningIndicators/InBlock.gif)
1048
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1049
![](/Images/OutliningIndicators/InBlock.gif)
1050
![](/Images/OutliningIndicators/InBlock.gif)
1051
![](/Images/OutliningIndicators/InBlock.gif)
1052
![](/Images/OutliningIndicators/InBlock.gif)
1053
![](/Images/OutliningIndicators/InBlock.gif)
1054
![](/Images/OutliningIndicators/InBlock.gif)
1055
![](/Images/OutliningIndicators/InBlock.gif)
1056
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1057
![](/Images/OutliningIndicators/InBlock.gif)
1058
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
1066
![](/Images/OutliningIndicators/InBlock.gif)
1067
![](/Images/OutliningIndicators/InBlock.gif)
1068
![](/Images/OutliningIndicators/InBlock.gif)
1069
![](/Images/OutliningIndicators/InBlock.gif)
1070
![](/Images/OutliningIndicators/InBlock.gif)
1071
![](/Images/OutliningIndicators/InBlock.gif)
1072
![](/Images/OutliningIndicators/InBlock.gif)
1073
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1074
![](/Images/OutliningIndicators/InBlock.gif)
1075
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1076
![](/Images/OutliningIndicators/InBlock.gif)
1077
![](/Images/OutliningIndicators/InBlock.gif)
1078
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.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/InBlock.gif)
1085
![](/Images/OutliningIndicators/InBlock.gif)
1086
![](/Images/OutliningIndicators/InBlock.gif)
1087
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1088
![](/Images/OutliningIndicators/InBlock.gif)
1089
![](/Images/OutliningIndicators/InBlock.gif)
1090
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1091
![](/Images/OutliningIndicators/InBlock.gif)
1092
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1093
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1094
![](/Images/OutliningIndicators/InBlock.gif)
1095
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1096
![](/Images/OutliningIndicators/InBlock.gif)
1097
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1098
![](/Images/OutliningIndicators/InBlock.gif)
1099
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/ExpandedSubBlockEnd.gif)
1110
![](/Images/OutliningIndicators/InBlock.gif)
1111
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1112
![](/Images/OutliningIndicators/InBlock.gif)
1113
![](/Images/OutliningIndicators/InBlock.gif)
1114
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1115
![](/Images/OutliningIndicators/InBlock.gif)
1116
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.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/InBlock.gif)
1125
![](/Images/OutliningIndicators/InBlock.gif)
1126
![](/Images/OutliningIndicators/InBlock.gif)
1127
![](/Images/OutliningIndicators/InBlock.gif)
1128
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1129
![](/Images/OutliningIndicators/InBlock.gif)
1130
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1131
![](/Images/OutliningIndicators/InBlock.gif)
1132
![](/Images/OutliningIndicators/InBlock.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/InBlock.gif)
1139
![](/Images/OutliningIndicators/InBlock.gif)
1140
![](/Images/OutliningIndicators/InBlock.gif)
1141
![](/Images/OutliningIndicators/InBlock.gif)
1142
![](/Images/OutliningIndicators/InBlock.gif)
1143
![](/Images/OutliningIndicators/InBlock.gif)
1144
![](/Images/OutliningIndicators/InBlock.gif)
1145
![](/Images/OutliningIndicators/InBlock.gif)
1146
![](/Images/OutliningIndicators/InBlock.gif)
1147
![](/Images/OutliningIndicators/InBlock.gif)
1148
![](/Images/OutliningIndicators/InBlock.gif)
1149
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1150
![](/Images/OutliningIndicators/InBlock.gif)
1151
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1152
![](/Images/OutliningIndicators/InBlock.gif)
1153
![](/Images/OutliningIndicators/InBlock.gif)
1154
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1155
![](/Images/OutliningIndicators/InBlock.gif)
1156
![](/Images/OutliningIndicators/InBlock.gif)
1157
![](/Images/OutliningIndicators/InBlock.gif)
1158
![](/Images/OutliningIndicators/InBlock.gif)
1159
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1160
![](/Images/OutliningIndicators/InBlock.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/InBlock.gif)
1168
![](/Images/OutliningIndicators/InBlock.gif)
1169
![](/Images/OutliningIndicators/InBlock.gif)
1170
![](/Images/OutliningIndicators/InBlock.gif)
1171
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1172
![](/Images/OutliningIndicators/InBlock.gif)
1173
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1174
![](/Images/OutliningIndicators/InBlock.gif)
1175
![](/Images/OutliningIndicators/InBlock.gif)
1176
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1177
![](/Images/OutliningIndicators/InBlock.gif)
1178
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1179
![](/Images/OutliningIndicators/InBlock.gif)
1180
![](/Images/OutliningIndicators/InBlock.gif)
1181
![](/Images/OutliningIndicators/InBlock.gif)
1182
![](/Images/OutliningIndicators/InBlock.gif)
1183
![](/Images/OutliningIndicators/InBlock.gif)
1184
![](/Images/OutliningIndicators/InBlock.gif)
1185
![](/Images/OutliningIndicators/InBlock.gif)
1186
![](/Images/OutliningIndicators/InBlock.gif)
1187
![](/Images/OutliningIndicators/InBlock.gif)
1188
![](/Images/OutliningIndicators/InBlock.gif)
1189
![](/Images/OutliningIndicators/InBlock.gif)
1190
![](/Images/OutliningIndicators/InBlock.gif)
1191
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1192
![](/Images/OutliningIndicators/InBlock.gif)
1193
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1194
![](/Images/OutliningIndicators/InBlock.gif)
1195
![](/Images/OutliningIndicators/InBlock.gif)
1196
![](/Images/OutliningIndicators/InBlock.gif)
1197
![](/Images/OutliningIndicators/InBlock.gif)
1198
![](/Images/OutliningIndicators/InBlock.gif)
1199
![](/Images/OutliningIndicators/InBlock.gif)
1200
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1201
![](/Images/OutliningIndicators/InBlock.gif)
1202
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1203
![](/Images/OutliningIndicators/InBlock.gif)
1204
![](/Images/OutliningIndicators/InBlock.gif)
1205
![](/Images/OutliningIndicators/InBlock.gif)
1206
![](/Images/OutliningIndicators/InBlock.gif)
1207
![](/Images/OutliningIndicators/InBlock.gif)
1208
![](/Images/OutliningIndicators/InBlock.gif)
1209
![](/Images/OutliningIndicators/InBlock.gif)
1210
![](/Images/OutliningIndicators/InBlock.gif)
1211
![](/Images/OutliningIndicators/InBlock.gif)
1212
![](/Images/OutliningIndicators/InBlock.gif)
1213
![](/Images/OutliningIndicators/InBlock.gif)
1214
![](/Images/OutliningIndicators/InBlock.gif)
1215
![](/Images/OutliningIndicators/InBlock.gif)
1216
![](/Images/OutliningIndicators/InBlock.gif)
1217
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1218
![](/Images/OutliningIndicators/InBlock.gif)
1219
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1220
![](/Images/OutliningIndicators/InBlock.gif)
1221
![](/Images/OutliningIndicators/InBlock.gif)
1222
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1223
![](/Images/OutliningIndicators/InBlock.gif)
1224
![](/Images/OutliningIndicators/InBlock.gif)
1225
![](/Images/OutliningIndicators/InBlock.gif)
1226
![](/Images/OutliningIndicators/InBlock.gif)
1227
![](/Images/OutliningIndicators/InBlock.gif)
1228
![](/Images/OutliningIndicators/InBlock.gif)
1229
![](/Images/OutliningIndicators/InBlock.gif)
1230
![](/Images/OutliningIndicators/InBlock.gif)
1231
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1232
![](/Images/OutliningIndicators/InBlock.gif)
1233
![](/Images/OutliningIndicators/InBlock.gif)
1234
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1235
![](/Images/OutliningIndicators/InBlock.gif)
1236
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1237
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1238
![](/Images/OutliningIndicators/InBlock.gif)
1239
![](/Images/OutliningIndicators/InBlock.gif)
1240
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1241
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1242
![](/Images/OutliningIndicators/InBlock.gif)
1243
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1244
![](/Images/OutliningIndicators/InBlock.gif)
1245
![](/Images/OutliningIndicators/InBlock.gif)
1246
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1247
![](/Images/OutliningIndicators/InBlock.gif)
1248
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1249
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1250
![](/Images/OutliningIndicators/InBlock.gif)
1251
![](/Images/OutliningIndicators/InBlock.gif)
1252
![](/Images/OutliningIndicators/InBlock.gif)
1253
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.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/InBlock.gif)
1260
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1261
![](/Images/OutliningIndicators/InBlock.gif)
1262
![](/Images/OutliningIndicators/InBlock.gif)
1263
![](/Images/OutliningIndicators/InBlock.gif)
1264
![](/Images/OutliningIndicators/InBlock.gif)
1265
![](/Images/OutliningIndicators/InBlock.gif)
1266
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1267
![](/Images/OutliningIndicators/InBlock.gif)
1268
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1269
![](/Images/OutliningIndicators/InBlock.gif)
1270
![](/Images/OutliningIndicators/InBlock.gif)
1271
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1272
![](/Images/OutliningIndicators/InBlock.gif)
1273
![](/Images/OutliningIndicators/InBlock.gif)
1274
![](/Images/OutliningIndicators/InBlock.gif)
1275
![](/Images/OutliningIndicators/InBlock.gif)
1276
![](/Images/OutliningIndicators/InBlock.gif)
1277
![](/Images/OutliningIndicators/InBlock.gif)
1278
![](/Images/OutliningIndicators/InBlock.gif)
1279
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1280
![](/Images/OutliningIndicators/InBlock.gif)
1281
![](/Images/OutliningIndicators/InBlock.gif)
1282
![](/Images/OutliningIndicators/InBlock.gif)
1283
![](/Images/OutliningIndicators/InBlock.gif)
1284
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1285
![](/Images/OutliningIndicators/InBlock.gif)
1286
![](/Images/OutliningIndicators/InBlock.gif)
1287
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1288
![](/Images/OutliningIndicators/InBlock.gif)
1289
![](/Images/OutliningIndicators/InBlock.gif)
1290
![](/Images/OutliningIndicators/InBlock.gif)
1291
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1292
![](/Images/OutliningIndicators/InBlock.gif)
1293
![](/Images/OutliningIndicators/InBlock.gif)
1294
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1295
![](/Images/OutliningIndicators/InBlock.gif)
1296
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1297
![](/Images/OutliningIndicators/InBlock.gif)
1298
![](/Images/OutliningIndicators/InBlock.gif)
1299
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1300
![](/Images/OutliningIndicators/InBlock.gif)
1301
![](/Images/OutliningIndicators/InBlock.gif)
1302
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1303
![](/Images/OutliningIndicators/InBlock.gif)
1304
![](/Images/OutliningIndicators/InBlock.gif)
1305
![](/Images/OutliningIndicators/InBlock.gif)
1306
![](/Images/OutliningIndicators/InBlock.gif)
1307
![](/Images/OutliningIndicators/InBlock.gif)
1308
![](/Images/OutliningIndicators/InBlock.gif)
1309
![](/Images/OutliningIndicators/InBlock.gif)
1310
![](/Images/OutliningIndicators/InBlock.gif)
1311
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1312
![](/Images/OutliningIndicators/InBlock.gif)
1313
![](/Images/OutliningIndicators/InBlock.gif)
1314
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1315
![](/Images/OutliningIndicators/InBlock.gif)
1316
![](/Images/OutliningIndicators/InBlock.gif)
1317
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1318
![](/Images/OutliningIndicators/InBlock.gif)
1319
![](/Images/OutliningIndicators/InBlock.gif)
1320
![](/Images/OutliningIndicators/InBlock.gif)
1321
![](/Images/OutliningIndicators/InBlock.gif)
1322
![](/Images/OutliningIndicators/InBlock.gif)
1323
![](/Images/OutliningIndicators/InBlock.gif)
1324
![](/Images/OutliningIndicators/InBlock.gif)
1325
![](/Images/OutliningIndicators/InBlock.gif)
1326
![](/Images/OutliningIndicators/InBlock.gif)
1327
![](/Images/OutliningIndicators/InBlock.gif)
1328
![](/Images/OutliningIndicators/InBlock.gif)
1329
![](/Images/OutliningIndicators/InBlock.gif)
1330
![](/Images/OutliningIndicators/InBlock.gif)
1331
![](/Images/OutliningIndicators/InBlock.gif)
1332
![](/Images/OutliningIndicators/InBlock.gif)
1333
![](/Images/OutliningIndicators/InBlock.gif)
1334
![](/Images/OutliningIndicators/InBlock.gif)
1335
![](/Images/OutliningIndicators/InBlock.gif)
1336
![](/Images/OutliningIndicators/InBlock.gif)
1337
![](/Images/OutliningIndicators/InBlock.gif)
1338
![](/Images/OutliningIndicators/InBlock.gif)
1339
![](/Images/OutliningIndicators/InBlock.gif)
1340
![](/Images/OutliningIndicators/InBlock.gif)
1341
![](/Images/OutliningIndicators/InBlock.gif)
1342
![](/Images/OutliningIndicators/InBlock.gif)
1343
![](/Images/OutliningIndicators/InBlock.gif)
1344
![](/Images/OutliningIndicators/InBlock.gif)
1345
![](/Images/OutliningIndicators/InBlock.gif)
1346
![](/Images/OutliningIndicators/InBlock.gif)
1347
![](/Images/OutliningIndicators/InBlock.gif)
1348
![](/Images/OutliningIndicators/InBlock.gif)
1349
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1350
![](/Images/OutliningIndicators/InBlock.gif)
1351
![](/Images/OutliningIndicators/InBlock.gif)
1352
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1353
![](/Images/OutliningIndicators/InBlock.gif)
1354
![](/Images/OutliningIndicators/InBlock.gif)
1355
![](/Images/OutliningIndicators/InBlock.gif)
1356
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1357
![](/Images/OutliningIndicators/InBlock.gif)
1358
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1359
![](/Images/OutliningIndicators/InBlock.gif)
1360
![](/Images/OutliningIndicators/InBlock.gif)
1361
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1362
![](/Images/OutliningIndicators/InBlock.gif)
1363
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1364
![](/Images/OutliningIndicators/InBlock.gif)
1365
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1366
![](/Images/OutliningIndicators/InBlock.gif)
1367
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1368
![](/Images/OutliningIndicators/InBlock.gif)
1369
![](/Images/OutliningIndicators/InBlock.gif)
1370
![](/Images/OutliningIndicators/InBlock.gif)
1371
![](/Images/OutliningIndicators/InBlock.gif)
1372
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1373
![](/Images/OutliningIndicators/InBlock.gif)
1374
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1375
![](/Images/OutliningIndicators/InBlock.gif)
1376
![](/Images/OutliningIndicators/InBlock.gif)
1377
![](/Images/OutliningIndicators/InBlock.gif)
1378
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1379
![](/Images/OutliningIndicators/InBlock.gif)
1380
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1381
![](/Images/OutliningIndicators/InBlock.gif)
1382
![](/Images/OutliningIndicators/InBlock.gif)
1383
![](/Images/OutliningIndicators/InBlock.gif)
1384
![](/Images/OutliningIndicators/InBlock.gif)
1385
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1386
![](/Images/OutliningIndicators/InBlock.gif)
1387
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1388
![](/Images/OutliningIndicators/InBlock.gif)
1389
![](/Images/OutliningIndicators/InBlock.gif)
1390
![](/Images/OutliningIndicators/InBlock.gif)
1391
![](/Images/OutliningIndicators/InBlock.gif)
1392
![](/Images/OutliningIndicators/InBlock.gif)
1393
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1394
![](/Images/OutliningIndicators/InBlock.gif)
1395
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1396
![](/Images/OutliningIndicators/InBlock.gif)
1397
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1398
![](/Images/OutliningIndicators/InBlock.gif)
1399
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1400
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1401
![](/Images/OutliningIndicators/InBlock.gif)
1402
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1403
![](/Images/OutliningIndicators/InBlock.gif)
1404
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
1405
![](/Images/OutliningIndicators/InBlock.gif)
1406
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1407
![](/Images/OutliningIndicators/InBlock.gif)
1408
![](/Images/OutliningIndicators/InBlock.gif)
1409
![](/Images/OutliningIndicators/InBlock.gif)
1410
![](/Images/OutliningIndicators/InBlock.gif)
1411
![](/Images/OutliningIndicators/InBlock.gif)
1412
![](/Images/OutliningIndicators/InBlock.gif)
1413
![](/Images/OutliningIndicators/InBlock.gif)
1414
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1415
![](/Images/OutliningIndicators/InBlock.gif)
1416
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1417
![](/Images/OutliningIndicators/InBlock.gif)
1418
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1419
![](/Images/OutliningIndicators/InBlock.gif)
1420
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
1421
![](/Images/OutliningIndicators/InBlock.gif)
1422
![](/Images/OutliningIndicators/InBlock.gif)
1423
![](/Images/OutliningIndicators/InBlock.gif)
1424
![](/Images/OutliningIndicators/InBlock.gif)
1425
![](/Images/OutliningIndicators/InBlock.gif)
1426
![](/Images/OutliningIndicators/InBlock.gif)
1427
![](/Images/OutliningIndicators/InBlock.gif)
1428
![](/Images/OutliningIndicators/InBlock.gif)
1429
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1430
![](/Images/OutliningIndicators/InBlock.gif)
1431
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1432
![](/Images/OutliningIndicators/InBlock.gif)
1433
![](/Images/OutliningIndicators/InBlock.gif)
1434
![](/Images/OutliningIndicators/InBlock.gif)
1435
![](/Images/OutliningIndicators/InBlock.gif)
1436
![](/Images/OutliningIndicators/InBlock.gif)
1437
![](/Images/OutliningIndicators/InBlock.gif)
1438
![](/Images/OutliningIndicators/InBlock.gif)
1439
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
1440
![](/Images/OutliningIndicators/InBlock.gif)
1441
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1442
![](/Images/OutliningIndicators/InBlock.gif)
1443
![](/Images/OutliningIndicators/InBlock.gif)
1444
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1445
![](/Images/OutliningIndicators/InBlock.gif)
1446
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1447
![](/Images/OutliningIndicators/InBlock.gif)
1448
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
1449
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
1450
![](/Images/OutliningIndicators/None.gif)
To be continue...