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 the implementations of the SqlHelper and SqlHelperParameterCache
8
//
classes.
9
//
10
//
For more information see the Data Access Application Block Implementation Overview.
11
//
===============================================================================
12
//
Release history
13
//
VERSION DESCRIPTION
14
//
2.0 Added support for FillDataset, UpdateDataset and "Param" helper methods
15
//
16
//
===============================================================================
17
//
Copyright (C) 2000-2001 Microsoft Corporation
18
//
All rights reserved.
19
//
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
20
//
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
21
//
LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
22
//
FITNESS FOR A PARTICULAR PURPOSE.
23
//
==============================================================================
24
25
using
System;
26
using
System.Data;
27
using
System.Xml;
28
using
System.Data.SqlClient;
29
using
System.Collections;
30
31
namespace
Microsoft.ApplicationBlocks.Data
32
{
33
///
<summary>
34
///
The SqlHelper class is intended to encapsulate high performance, scalable best practices for
35
///
common uses of SqlClient
36
///
</summary>
37
public
sealed
class
SqlHelper
38
{
39
#region
private utility methods & constructors
40
41
//
Since this class provides only static methods, make the default constructor private to prevent
42
//
instances from being created with "new SqlHelper()"
43
private
SqlHelper() {}
44
45
///
<summary>
46
///
This method is used to attach array of SqlParameters to a SqlCommand.
47
///
48
///
This method will assign a value of DbNull to any parameter with a direction of
49
///
InputOutput and a value of null.
50
///
51
///
This behavior will prevent default values from being used, but
52
///
this will be the less common case than an intended pure output parameter (derived as InputOutput)
53
///
where the user provided no input value.
54
///
</summary>
55
///
<param name="command">
The command to which the parameters will be added
</param>
56
///
<param name="commandParameters">
An array of SqlParameters to be added to command
</param>
57
private
static
void
AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
58
{
59
if
( command
==
null
)
throw
new
ArgumentNullException(
"
command
"
);
60
if
( commandParameters
!=
null
)
61
{
62
foreach
(SqlParameter p
in
commandParameters)
63
{
64
if
( p
!=
null
)
65
{
66
//
Check for derived output value with no value assigned
67
if
( ( p.Direction
==
ParameterDirection.InputOutput
||
68
p.Direction
==
ParameterDirection.Input )
&&
69
(p.Value
==
null
))
70
{
71
p.Value
=
DBNull.Value;
72
}
73
command.Parameters.Add(p);
74
}
75
}
76
}
77
}
78
79
///
<summary>
80
///
This method assigns dataRow column values to an array of SqlParameters
81
///
</summary>
82
///
<param name="commandParameters">
Array of SqlParameters to be assigned values
</param>
83
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values
</param>
84
private
static
void
AssignParameterValues(SqlParameter[] commandParameters, DataRow dataRow)
85
{
86
if
((commandParameters
==
null
)
||
(dataRow
==
null
))
87
{
88
//
Do nothing if we get no data
89
return
;
90
}
91
92
int
i
=
0
;
93
//
Set the parameters values
94
foreach
(SqlParameter commandParameter
in
commandParameters)
95
{
96
//
Check the parameter name
97
if
( commandParameter.ParameterName
==
null
||
98
commandParameter.ParameterName.Length
<=
1
)
99
throw
new
Exception(
100
string
.Format(
101
"
Please provide a valid parameter name on the parameter #{0}, the ParameterName property has the following value: '{1}'.
"
,
102
i, commandParameter.ParameterName ) );
103
if
(dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(
1
))
!=
-
1
)
104
commandParameter.Value
=
dataRow[commandParameter.ParameterName.Substring(
1
)];
105
i
++
;
106
}
107
}
108
109
///
<summary>
110
///
This method assigns an array of values to an array of SqlParameters
111
///
</summary>
112
///
<param name="commandParameters">
Array of SqlParameters to be assigned values
</param>
113
///
<param name="parameterValues">
Array of objects holding the values to be assigned
</param>
114
private
static
void
AssignParameterValues(SqlParameter[] commandParameters,
object
[] parameterValues)
115
{
116
if
((commandParameters
==
null
)
||
(parameterValues
==
null
))
117
{
118
//
Do nothing if we get no data
119
return
;
120
}
121
122
//
We must have the same number of values as we pave parameters to put them in
123
if
(commandParameters.Length
!=
parameterValues.Length)
124
{
125
throw
new
ArgumentException(
"
Parameter count does not match Parameter Value count.
"
);
126
}
127
128
//
Iterate through the SqlParameters, assigning the values from the corresponding position in the
129
//
value array
130
for
(
int
i
=
0
, j
=
commandParameters.Length; i
<
j; i
++
)
131
{
132
//
If the current array value derives from IDbDataParameter, then assign its Value property
133
if
(parameterValues[i]
is
IDbDataParameter)
134
{
135
IDbDataParameter paramInstance
=
(IDbDataParameter)parameterValues[i];
136
if
( paramInstance.Value
==
null
)
137
{
138
commandParameters[i].Value
=
DBNull.Value;
139
}
140
else
141
{
142
commandParameters[i].Value
=
paramInstance.Value;
143
}
144
}
145
else
if
(parameterValues[i]
==
null
)
146
{
147
commandParameters[i].Value
=
DBNull.Value;
148
}
149
else
150
{
151
commandParameters[i].Value
=
parameterValues[i];
152
}
153
}
154
}
155
156
///
<summary>
157
///
This method opens (if necessary) and assigns a connection, transaction, command type and parameters
158
///
to the provided command
159
///
</summary>
160
///
<param name="command">
The SqlCommand to be prepared
</param>
161
///
<param name="connection">
A valid SqlConnection, on which to execute this command
</param>
162
///
<param name="transaction">
A valid SqlTransaction, or 'null'
</param>
163
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
164
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
165
///
<param name="commandParameters">
An array of SqlParameters to be associated with the command or 'null' if no parameters are required
</param>
166
///
<param name="mustCloseConnection"><c>
true
</c>
if the connection was opened by the method, otherwose is false.
</param>
167
private
static
void
PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType,
string
commandText, SqlParameter[] commandParameters,
out
bool
mustCloseConnection )
168
{
169
if
( command
==
null
)
throw
new
ArgumentNullException(
"
command
"
);
170
if
( commandText
==
null
||
commandText.Length
==
0
)
throw
new
ArgumentNullException(
"
commandText
"
);
171
172
//
If the provided connection is not open, we will open it
173
if
(connection.State
!=
ConnectionState.Open)
174
{
175
mustCloseConnection
=
true
;
176
connection.Open();
177
}
178
else
179
{
180
mustCloseConnection
=
false
;
181
}
182
183
//
Associate the connection with the command
184
command.Connection
=
connection;
185
186
//
Set the command text (stored procedure name or SQL statement)
187
command.CommandText
=
commandText;
188
189
//
If we were provided a transaction, assign it
190
if
(transaction
!=
null
)
191
{
192
if
( transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
193
command.Transaction
=
transaction;
194
}
195
196
//
Set the command type
197
command.CommandType
=
commandType;
198
199
//
Attach the command parameters if they are provided
200
if
(commandParameters
!=
null
)
201
{
202
AttachParameters(command, commandParameters);
203
}
204
return
;
205
}
206
207
#endregion
private utility methods & constructors
208
209
#region
ExecuteNonQuery
210
211
///
<summary>
212
///
Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in
213
///
the connection string
214
///
</summary>
215
///
<remarks>
216
///
e.g.:
217
///
int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
218
///
</remarks>
219
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
220
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
221
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
222
///
<returns>
An int representing the number of rows affected by the command
</returns>
223
public
static
int
ExecuteNonQuery(
string
connectionString, CommandType commandType,
string
commandText)
224
{
225
//
Pass through the call providing null for the set of SqlParameters
226
return
ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])
null
);
227
}
228
229
///
<summary>
230
///
Execute a SqlCommand (that returns no resultset) against the database specified in the connection string
231
///
using the provided parameters
232
///
</summary>
233
///
<remarks>
234
///
e.g.:
235
///
int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
236
///
</remarks>
237
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
238
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
239
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
240
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
241
///
<returns>
An int representing the number of rows affected by the command
</returns>
242
public
static
int
ExecuteNonQuery(
string
connectionString, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
243
{
244
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
245
246
//
Create & open a SqlConnection, and dispose of it after we are done
247
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
248
{
249
connection.Open();
250
251
//
Call the overload that takes a connection in place of the connection string
252
return
ExecuteNonQuery(connection, commandType, commandText, commandParameters);
253
}
254
}
255
256
///
<summary>
257
///
Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in
258
///
the connection string using the provided parameter values. This method will query the database to discover the parameters for the
259
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
260
///
</summary>
261
///
<remarks>
262
///
This method provides no access to output parameters or the stored procedure's return value parameter.
263
///
264
///
e.g.:
265
///
int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
266
///
</remarks>
267
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
268
///
<param name="spName">
The name of the stored prcedure
</param>
269
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
270
///
<returns>
An int representing the number of rows affected by the command
</returns>
271
public
static
int
ExecuteNonQuery(
string
connectionString,
string
spName,
params
object
[] parameterValues)
272
{
273
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
274
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
275
276
//
If we receive parameter values, we need to figure out where they go
277
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
278
{
279
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
280
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
281
282
//
Assign the provided values to these parameters based on parameter order
283
AssignParameterValues(commandParameters, parameterValues);
284
285
//
Call the overload that takes an array of SqlParameters
286
return
ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
287
}
288
else
289
{
290
//
Otherwise we can just call the SP without params
291
return
ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
292
}
293
}
294
295
///
<summary>
296
///
Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided SqlConnection.
297
///
</summary>
298
///
<remarks>
299
///
e.g.:
300
///
int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
301
///
</remarks>
302
///
<param name="connection">
A valid SqlConnection
</param>
303
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
304
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
305
///
<returns>
An int representing the number of rows affected by the command
</returns>
306
public
static
int
ExecuteNonQuery(SqlConnection connection, CommandType commandType,
string
commandText)
307
{
308
//
Pass through the call providing null for the set of SqlParameters
309
return
ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])
null
);
310
}
311
312
///
<summary>
313
///
Execute a SqlCommand (that returns no resultset) against the specified SqlConnection
314
///
using the provided parameters.
315
///
</summary>
316
///
<remarks>
317
///
e.g.:
318
///
int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
319
///
</remarks>
320
///
<param name="connection">
A valid SqlConnection
</param>
321
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
322
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
323
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
324
///
<returns>
An int representing the number of rows affected by the command
</returns>
325
public
static
int
ExecuteNonQuery(SqlConnection connection, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
326
{
327
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
328
329
//
Create a command and prepare it for execution
330
SqlCommand cmd
=
new
SqlCommand();
331
bool
mustCloseConnection
=
false
;
332
PrepareCommand(cmd, connection, (SqlTransaction)
null
, commandType, commandText, commandParameters,
out
mustCloseConnection );
333
334
//
Finally, execute the command
335
int
retval
=
cmd.ExecuteNonQuery();
336
337
//
Detach the SqlParameters from the command object, so they can be used again
338
cmd.Parameters.Clear();
339
if
( mustCloseConnection )
340
connection.Close();
341
return
retval;
342
}
343
344
///
<summary>
345
///
Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified SqlConnection
346
///
using the provided parameter values. This method will query the database to discover the parameters for the
347
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
348
///
</summary>
349
///
<remarks>
350
///
This method provides no access to output parameters or the stored procedure's return value parameter.
351
///
352
///
e.g.:
353
///
int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);
354
///
</remarks>
355
///
<param name="connection">
A valid SqlConnection
</param>
356
///
<param name="spName">
The name of the stored procedure
</param>
357
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
358
///
<returns>
An int representing the number of rows affected by the command
</returns>
359
public
static
int
ExecuteNonQuery(SqlConnection connection,
string
spName,
params
object
[] parameterValues)
360
{
361
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
362
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
363
364
//
If we receive parameter values, we need to figure out where they go
365
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
366
{
367
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
368
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
369
370
//
Assign the provided values to these parameters based on parameter order
371
AssignParameterValues(commandParameters, parameterValues);
372
373
//
Call the overload that takes an array of SqlParameters
374
return
ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
375
}
376
else
377
{
378
//
Otherwise we can just call the SP without params
379
return
ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
380
}
381
}
382
383
///
<summary>
384
///
Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided SqlTransaction.
385
///
</summary>
386
///
<remarks>
387
///
e.g.:
388
///
int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");
389
///
</remarks>
390
///
<param name="transaction">
A valid SqlTransaction
</param>
391
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
392
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
393
///
<returns>
An int representing the number of rows affected by the command
</returns>
394
public
static
int
ExecuteNonQuery(SqlTransaction transaction, CommandType commandType,
string
commandText)
395
{
396
//
Pass through the call providing null for the set of SqlParameters
397
return
ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])
null
);
398
}
399
400
///
<summary>
401
///
Execute a SqlCommand (that returns no resultset) against the specified SqlTransaction
402
///
using the provided parameters.
403
///
</summary>
404
///
<remarks>
405
///
e.g.:
406
///
int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
407
///
</remarks>
408
///
<param name="transaction">
A valid SqlTransaction
</param>
409
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
410
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
411
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
412
///
<returns>
An int representing the number of rows affected by the command
</returns>
413
public
static
int
ExecuteNonQuery(SqlTransaction transaction, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
414
{
415
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
416
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
417
418
//
Create a command and prepare it for execution
419
SqlCommand cmd
=
new
SqlCommand();
420
bool
mustCloseConnection
=
false
;
421
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters,
out
mustCloseConnection );
422
423
//
Finally, execute the command
424
int
retval
=
cmd.ExecuteNonQuery();
425
426
//
Detach the SqlParameters from the command object, so they can be used again
427
cmd.Parameters.Clear();
428
return
retval;
429
}
430
431
///
<summary>
432
///
Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified
433
///
SqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the
434
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
435
///
</summary>
436
///
<remarks>
437
///
This method provides no access to output parameters or the stored procedure's return value parameter.
438
///
439
///
e.g.:
440
///
int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);
441
///
</remarks>
442
///
<param name="transaction">
A valid SqlTransaction
</param>
443
///
<param name="spName">
The name of the stored procedure
</param>
444
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
445
///
<returns>
An int representing the number of rows affected by the command
</returns>
446
public
static
int
ExecuteNonQuery(SqlTransaction transaction,
string
spName,
params
object
[] parameterValues)
447
{
448
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
449
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
450
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
451
452
//
If we receive parameter values, we need to figure out where they go
453
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
454
{
455
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
456
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
457
458
//
Assign the provided values to these parameters based on parameter order
459
AssignParameterValues(commandParameters, parameterValues);
460
461
//
Call the overload that takes an array of SqlParameters
462
return
ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
463
}
464
else
465
{
466
//
Otherwise we can just call the SP without params
467
return
ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
468
}
469
}
470
471
#endregion
ExecuteNonQuery
472
473
#region
ExecuteDataset
474
475
///
<summary>
476
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in
477
///
the connection string.
478
///
</summary>
479
///
<remarks>
480
///
e.g.:
481
///
DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders");
482
///
</remarks>
483
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
484
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
485
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
486
///
<returns>
A dataset containing the resultset generated by the command
</returns>
487
public
static
DataSet ExecuteDataset(
string
connectionString, CommandType commandType,
string
commandText)
488
{
489
//
Pass through the call providing null for the set of SqlParameters
490
return
ExecuteDataset(connectionString, commandType, commandText, (SqlParameter[])
null
);
491
}
492
493
///
<summary>
494
///
Execute a SqlCommand (that returns a resultset) against the database specified in the connection string
495
///
using the provided parameters.
496
///
</summary>
497
///
<remarks>
498
///
e.g.:
499
///
DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
500
///
</remarks>
501
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
502
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
503
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
504
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
505
///
<returns>
A dataset containing the resultset generated by the command
</returns>
506
public
static
DataSet ExecuteDataset(
string
connectionString, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
507
{
508
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
509
510
//
Create & open a SqlConnection, and dispose of it after we are done
511
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
512
{
513
connection.Open();
514
515
//
Call the overload that takes a connection in place of the connection string
516
return
ExecuteDataset(connection, commandType, commandText, commandParameters);
517
}
518
}
519
520
///
<summary>
521
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
522
///
the connection string using the provided parameter values. This method will query the database to discover the parameters for the
523
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
524
///
</summary>
525
///
<remarks>
526
///
This method provides no access to output parameters or the stored procedure's return value parameter.
527
///
528
///
e.g.:
529
///
DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36);
530
///
</remarks>
531
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
532
///
<param name="spName">
The name of the stored procedure
</param>
533
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
534
///
<returns>
A dataset containing the resultset generated by the command
</returns>
535
public
static
DataSet ExecuteDataset(
string
connectionString,
string
spName,
params
object
[] parameterValues)
536
{
537
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
538
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
539
540
//
If we receive parameter values, we need to figure out where they go
541
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
542
{
543
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
544
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
545
546
//
Assign the provided values to these parameters based on parameter order
547
AssignParameterValues(commandParameters, parameterValues);
548
549
//
Call the overload that takes an array of SqlParameters
550
return
ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);
551
}
552
else
553
{
554
//
Otherwise we can just call the SP without params
555
return
ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);
556
}
557
}
558
559
///
<summary>
560
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
561
///
</summary>
562
///
<remarks>
563
///
e.g.:
564
///
DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders");
565
///
</remarks>
566
///
<param name="connection">
A valid SqlConnection
</param>
567
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
568
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
569
///
<returns>
A dataset containing the resultset generated by the command
</returns>
570
public
static
DataSet ExecuteDataset(SqlConnection connection, CommandType commandType,
string
commandText)
571
{
572
//
Pass through the call providing null for the set of SqlParameters
573
return
ExecuteDataset(connection, commandType, commandText, (SqlParameter[])
null
);
574
}
575
576
///
<summary>
577
///
Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
578
///
using the provided parameters.
579
///
</summary>
580
///
<remarks>
581
///
e.g.:
582
///
DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
583
///
</remarks>
584
///
<param name="connection">
A valid SqlConnection
</param>
585
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
586
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
587
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
588
///
<returns>
A dataset containing the resultset generated by the command
</returns>
589
public
static
DataSet ExecuteDataset(SqlConnection connection, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
590
{
591
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
592
593
//
Create a command and prepare it for execution
594
SqlCommand cmd
=
new
SqlCommand();
595
bool
mustCloseConnection
=
false
;
596
PrepareCommand(cmd, connection, (SqlTransaction)
null
, commandType, commandText, commandParameters,
out
mustCloseConnection );
597
598
//
Create the DataAdapter & DataSet
599
using
( SqlDataAdapter da
=
new
SqlDataAdapter(cmd) )
600
{
601
DataSet ds
=
new
DataSet();
602
603
//
Fill the DataSet using default values for DataTable names, etc
604
da.Fill(ds);
605
606
//
Detach the SqlParameters from the command object, so they can be used again
607
cmd.Parameters.Clear();
608
609
if
( mustCloseConnection )
610
connection.Close();
611
612
//
Return the dataset
613
return
ds;
614
}
615
}
616
617
///
<summary>
618
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
619
///
using the provided parameter values. This method will query the database to discover the parameters for the
620
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
621
///
</summary>
622
///
<remarks>
623
///
This method provides no access to output parameters or the stored procedure's return value parameter.
624
///
625
///
e.g.:
626
///
DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);
627
///
</remarks>
628
///
<param name="connection">
A valid SqlConnection
</param>
629
///
<param name="spName">
The name of the stored procedure
</param>
630
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
631
///
<returns>
A dataset containing the resultset generated by the command
</returns>
632
public
static
DataSet ExecuteDataset(SqlConnection connection,
string
spName,
params
object
[] parameterValues)
633
{
634
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
635
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
636
637
//
If we receive parameter values, we need to figure out where they go
638
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
639
{
640
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
641
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
642
643
//
Assign the provided values to these parameters based on parameter order
644
AssignParameterValues(commandParameters, parameterValues);
645
646
//
Call the overload that takes an array of SqlParameters
647
return
ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);
648
}
649
else
650
{
651
//
Otherwise we can just call the SP without params
652
return
ExecuteDataset(connection, CommandType.StoredProcedure, spName);
653
}
654
}
655
656
///
<summary>
657
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlTransaction.
658
///
</summary>
659
///
<remarks>
660
///
e.g.:
661
///
DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders");
662
///
</remarks>
663
///
<param name="transaction">
A valid SqlTransaction
</param>
664
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
665
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
666
///
<returns>
A dataset containing the resultset generated by the command
</returns>
667
public
static
DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType,
string
commandText)
668
{
669
//
Pass through the call providing null for the set of SqlParameters
670
return
ExecuteDataset(transaction, commandType, commandText, (SqlParameter[])
null
);
671
}
672
673
///
<summary>
674
///
Execute a SqlCommand (that returns a resultset) against the specified SqlTransaction
675
///
using the provided parameters.
676
///
</summary>
677
///
<remarks>
678
///
e.g.:
679
///
DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
680
///
</remarks>
681
///
<param name="transaction">
A valid SqlTransaction
</param>
682
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
683
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
684
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
685
///
<returns>
A dataset containing the resultset generated by the command
</returns>
686
public
static
DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
687
{
688
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
689
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
690
691
//
Create a command and prepare it for execution
692
SqlCommand cmd
=
new
SqlCommand();
693
bool
mustCloseConnection
=
false
;
694
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters,
out
mustCloseConnection );
695
696
//
Create the DataAdapter & DataSet
697
using
( SqlDataAdapter da
=
new
SqlDataAdapter(cmd) )
698
{
699
DataSet ds
=
new
DataSet();
700
701
//
Fill the DataSet using default values for DataTable names, etc
702
da.Fill(ds);
703
704
//
Detach the SqlParameters from the command object, so they can be used again
705
cmd.Parameters.Clear();
706
707
//
Return the dataset
708
return
ds;
709
}
710
}
711
712
///
<summary>
713
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified
714
///
SqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the
715
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
716
///
</summary>
717
///
<remarks>
718
///
This method provides no access to output parameters or the stored procedure's return value parameter.
719
///
720
///
e.g.:
721
///
DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36);
722
///
</remarks>
723
///
<param name="transaction">
A valid SqlTransaction
</param>
724
///
<param name="spName">
The name of the stored procedure
</param>
725
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
726
///
<returns>
A dataset containing the resultset generated by the command
</returns>
727
public
static
DataSet ExecuteDataset(SqlTransaction transaction,
string
spName,
params
object
[] parameterValues)
728
{
729
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
730
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
731
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
732
733
//
If we receive parameter values, we need to figure out where they go
734
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
735
{
736
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
737
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
738
739
//
Assign the provided values to these parameters based on parameter order
740
AssignParameterValues(commandParameters, parameterValues);
741
742
//
Call the overload that takes an array of SqlParameters
743
return
ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);
744
}
745
else
746
{
747
//
Otherwise we can just call the SP without params
748
return
ExecuteDataset(transaction, CommandType.StoredProcedure, spName);
749
}
750
}
751
752
#endregion
ExecuteDataset
753
754
#region
ExecuteReader
755
756
///
<summary>
757
///
This enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that
758
///
we can set the appropriate CommandBehavior when calling ExecuteReader()
759
///
</summary>
760
private
enum
SqlConnectionOwnership
761
{
762
///
<summary>
Connection is owned and managed by SqlHelper
</summary>
763
Internal,
764
///
<summary>
Connection is owned and managed by the caller
</summary>
765
External
766
}
767
768
///
<summary>
769
///
Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior.
770
///
</summary>
771
///
<remarks>
772
///
If we created and opened the connection, we want the connection to be closed when the DataReader is closed.
773
///
774
///
If the caller provided the connection, we want to leave it to them to manage.
775
///
</remarks>
776
///
<param name="connection">
A valid SqlConnection, on which to execute this command
</param>
777
///
<param name="transaction">
A valid SqlTransaction, or 'null'
</param>
778
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
779
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
780
///
<param name="commandParameters">
An array of SqlParameters to be associated with the command or 'null' if no parameters are required
</param>
781
///
<param name="connectionOwnership">
Indicates whether the connection parameter was provided by the caller, or created by SqlHelper
</param>
782
///
<returns>
SqlDataReader containing the results of the command
</returns>
783
private
static
SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType,
string
commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership)
784
{
785
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
786
787
bool
mustCloseConnection
=
false
;
788
//
Create a command and prepare it for execution
789
SqlCommand cmd
=
new
SqlCommand();
790
try
791
{
792
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters,
out
mustCloseConnection );
793
794
//
Create a reader
795
SqlDataReader dataReader;
796
797
//
Call ExecuteReader with the appropriate CommandBehavior
798
if
(connectionOwnership
==
SqlConnectionOwnership.External)
799
{
800
dataReader
=
cmd.ExecuteReader();
801
}
802
else
803
{
804
dataReader
=
cmd.ExecuteReader(CommandBehavior.CloseConnection);
805
}
806
807
//
Detach the SqlParameters from the command object, so they can be used again.
808
//
HACK: There is a problem here, the output parameter values are fletched
809
//
when the reader is closed, so if the parameters are detached from the command
810
//
then the SqlReader can磘 set its values.
811
//
When this happen, the parameters can磘 be used again in other command.
812
bool
canClear
=
true
;
813
foreach
(SqlParameter commandParameter
in
cmd.Parameters)
814
{
815
if
(commandParameter.Direction
!=
ParameterDirection.Input)
816
canClear
=
false
;
817
}
818
819
if
(canClear)
820
{
821
cmd.Parameters.Clear();
822
}
823
824
return
dataReader;
825
}
826
catch
827
{
828
if
( mustCloseConnection )
829
connection.Close();
830
throw
;
831
}
832
}
833
834
///
<summary>
835
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in
836
///
the connection string.
837
///
</summary>
838
///
<remarks>
839
///
e.g.:
840
///
SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders");
841
///
</remarks>
842
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
843
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
844
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
845
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
846
public
static
SqlDataReader ExecuteReader(
string
connectionString, CommandType commandType,
string
commandText)
847
{
848
//
Pass through the call providing null for the set of SqlParameters
849
return
ExecuteReader(connectionString, commandType, commandText, (SqlParameter[])
null
);
850
}
851
852
///
<summary>
853
///
Execute a SqlCommand (that returns a resultset) against the database specified in the connection string
854
///
using the provided parameters.
855
///
</summary>
856
///
<remarks>
857
///
e.g.:
858
///
SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
859
///
</remarks>
860
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
861
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
862
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
863
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
864
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
865
public
static
SqlDataReader ExecuteReader(
string
connectionString, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
866
{
867
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
868
SqlConnection connection
=
null
;
869
try
870
{
871
connection
=
new
SqlConnection(connectionString);
872
connection.Open();
873
874
//
Call the private overload that takes an internally owned connection in place of the connection string
875
return
ExecuteReader(connection,
null
, commandType, commandText, commandParameters,SqlConnectionOwnership.Internal);
876
}
877
catch
878
{
879
//
If we fail to return the SqlDatReader, we need to close the connection ourselves
880
if
( connection
!=
null
) connection.Close();
881
throw
;
882
}
883
884
}
885
886
///
<summary>
887
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
888
///
the connection string using the provided parameter values. This method will query the database to discover the parameters for the
889
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
890
///
</summary>
891
///
<remarks>
892
///
This method provides no access to output parameters or the stored procedure's return value parameter.
893
///
894
///
e.g.:
895
///
SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36);
896
///
</remarks>
897
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
898
///
<param name="spName">
The name of the stored procedure
</param>
899
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
900
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
901
public
static
SqlDataReader ExecuteReader(
string
connectionString,
string
spName,
params
object
[] parameterValues)
902
{
903
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
904
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
905
906
//
If we receive parameter values, we need to figure out where they go
907
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
908
{
909
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
910
911
AssignParameterValues(commandParameters, parameterValues);
912
913
return
ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);
914
}
915
else
916
{
917
//
Otherwise we can just call the SP without params
918
return
ExecuteReader(connectionString, CommandType.StoredProcedure, spName);
919
}
920
}
921
922
///
<summary>
923
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
924
///
</summary>
925
///
<remarks>
926
///
e.g.:
927
///
SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders");
928
///
</remarks>
929
///
<param name="connection">
A valid SqlConnection
</param>
930
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
931
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
932
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
933
public
static
SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType,
string
commandText)
934
{
935
//
Pass through the call providing null for the set of SqlParameters
936
return
ExecuteReader(connection, commandType, commandText, (SqlParameter[])
null
);
937
}
938
939
///
<summary>
940
///
Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
941
///
using the provided parameters.
942
///
</summary>
943
///
<remarks>
944
///
e.g.:
945
///
SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
946
///
</remarks>
947
///
<param name="connection">
A valid SqlConnection
</param>
948
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
949
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
950
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
951
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
952
public
static
SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
953
{
954
//
Pass through the call to the private overload using a null transaction value and an externally owned connection
955
return
ExecuteReader(connection, (SqlTransaction)
null
, commandType, commandText, commandParameters, SqlConnectionOwnership.External);
956
}
957
958
///
<summary>
959
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
960
///
using the provided parameter values. This method will query the database to discover the parameters for the
961
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
962
///
</summary>
963
///
<remarks>
964
///
This method provides no access to output parameters or the stored procedure's return value parameter.
965
///
966
///
e.g.:
967
///
SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36);
968
///
</remarks>
969
///
<param name="connection">
A valid SqlConnection
</param>
970
///
<param name="spName">
The name of the stored procedure
</param>
971
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
972
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
973
public
static
SqlDataReader ExecuteReader(SqlConnection connection,
string
spName,
params
object
[] parameterValues)
974
{
975
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
976
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
977
978
//
If we receive parameter values, we need to figure out where they go
979
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
980
{
981
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
982
983
AssignParameterValues(commandParameters, parameterValues);
984
985
return
ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);
986
}
987
else
988
{
989
//
Otherwise we can just call the SP without params
990
return
ExecuteReader(connection, CommandType.StoredProcedure, spName);
991
}
992
}
993
994
///
<summary>
995
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlTransaction.
996
///
</summary>
997
///
<remarks>
998
///
e.g.:
999
///
SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders");
1000
///
</remarks>
1001
///
<param name="transaction">
A valid SqlTransaction
</param>
1002
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1003
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1004
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
1005
public
static
SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType,
string
commandText)
1006
{
1007
//
Pass through the call providing null for the set of SqlParameters
1008
return
ExecuteReader(transaction, commandType, commandText, (SqlParameter[])
null
);
1009
}
1010
1011
///
<summary>
1012
///
Execute a SqlCommand (that returns a resultset) against the specified SqlTransaction
1013
///
using the provided parameters.
1014
///
</summary>
1015
///
<remarks>
1016
///
e.g.:
1017
///
SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1018
///
</remarks>
1019
///
<param name="transaction">
A valid SqlTransaction
</param>
1020
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1021
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1022
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1023
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
1024
public
static
SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
1025
{
1026
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1027
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1028
1029
//
Pass through to private overload, indicating that the connection is owned by the caller
1030
return
ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External);
1031
}
1032
1033
///
<summary>
1034
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified
1035
///
SqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the
1036
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1037
///
</summary>
1038
///
<remarks>
1039
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1040
///
1041
///
e.g.:
1042
///
SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36);
1043
///
</remarks>
1044
///
<param name="transaction">
A valid SqlTransaction
</param>
1045
///
<param name="spName">
The name of the stored procedure
</param>
1046
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1047
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
1048
public
static
SqlDataReader ExecuteReader(SqlTransaction transaction,
string
spName,
params
object
[] parameterValues)
1049
{
1050
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1051
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1052
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1053
1054
//
If we receive parameter values, we need to figure out where they go
1055
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1056
{
1057
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
1058
1059
AssignParameterValues(commandParameters, parameterValues);
1060
1061
return
ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
1062
}
1063
else
1064
{
1065
//
Otherwise we can just call the SP without params
1066
return
ExecuteReader(transaction, CommandType.StoredProcedure, spName);
1067
}
1068
}
1069
1070
#endregion
ExecuteReader
1071
1072
#region
ExecuteScalar
1073
1074
///
<summary>
1075
///
Execute a SqlCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in
1076
///
the connection string.
1077
///
</summary>
1078
///
<remarks>
1079
///
e.g.:
1080
///
int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount");
1081
///
</remarks>
1082
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1083
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1084
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1085
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1086
public
static
object
ExecuteScalar(
string
connectionString, CommandType commandType,
string
commandText)
1087
{
1088
//
Pass through the call providing null for the set of SqlParameters
1089
return
ExecuteScalar(connectionString, commandType, commandText, (SqlParameter[])
null
);
1090
}
1091
1092
///
<summary>
1093
///
Execute a SqlCommand (that returns a 1x1 resultset) against the database specified in the connection string
1094
///
using the provided parameters.
1095
///
</summary>
1096
///
<remarks>
1097
///
e.g.:
1098
///
int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
1099
///
</remarks>
1100
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1101
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1102
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1103
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1104
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1105
public
static
object
ExecuteScalar(
string
connectionString, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
1106
{
1107
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
1108
//
Create & open a SqlConnection, and dispose of it after we are done
1109
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
1110
{
1111
connection.Open();
1112
1113
//
Call the overload that takes a connection in place of the connection string
1114
return
ExecuteScalar(connection, commandType, commandText, commandParameters);
1115
}
1116
}
1117
1118
///
<summary>
1119
///
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the database specified in
1120
///
the connection string using the provided parameter values. This method will query the database to discover the parameters for the
1121
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1122
///
</summary>
1123
///
<remarks>
1124
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1125
///
1126
///
e.g.:
1127
///
int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36);
1128
///
</remarks>
1129
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1130
///
<param name="spName">
The name of the stored procedure
</param>
1131
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1132
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1133
public
static
object
ExecuteScalar(
string
connectionString,
string
spName,
params
object
[] parameterValues)
1134
{
1135
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
1136
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1137
1138
//
If we receive parameter values, we need to figure out where they go
1139
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1140
{
1141
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1142
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
1143
1144
//
Assign the provided values to these parameters based on parameter order
1145
AssignParameterValues(commandParameters, parameterValues);
1146
1147
//
Call the overload that takes an array of SqlParameters
1148
return
ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);
1149
}
1150
else
1151
{
1152
//
Otherwise we can just call the SP without params
1153
return
ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);
1154
}
1155
}
1156
1157
///
<summary>
1158
///
Execute a SqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided SqlConnection.
1159
///
</summary>
1160
///
<remarks>
1161
///
e.g.:
1162
///
int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount");
1163
///
</remarks>
1164
///
<param name="connection">
A valid SqlConnection
</param>
1165
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1166
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1167
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1168
public
static
object
ExecuteScalar(SqlConnection connection, CommandType commandType,
string
commandText)
1169
{
1170
//
Pass through the call providing null for the set of SqlParameters
1171
return
ExecuteScalar(connection, commandType, commandText, (SqlParameter[])
null
);
1172
}
1173
1174
///
<summary>
1175
///
Execute a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
1176
///
using the provided parameters.
1177
///
</summary>
1178
///
<remarks>
1179
///
e.g.:
1180
///
int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
1181
///
</remarks>
1182
///
<param name="connection">
A valid SqlConnection
</param>
1183
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1184
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1185
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1186
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1187
public
static
object
ExecuteScalar(SqlConnection connection, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
1188
{
1189
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1190
1191
//
Create a command and prepare it for execution
1192
SqlCommand cmd
=
new
SqlCommand();
1193
1194
bool
mustCloseConnection
=
false
;
1195
PrepareCommand(cmd, connection, (SqlTransaction)
null
, commandType, commandText, commandParameters,
out
mustCloseConnection );
1196
1197
//
Execute the command & return the results
1198
object
retval
=
cmd.ExecuteScalar();
1199
1200
//
Detach the SqlParameters from the command object, so they can be used again
1201
cmd.Parameters.Clear();
1202
1203
if
( mustCloseConnection )
1204
connection.Close();
1205
1206
return
retval;
1207
}
1208
1209
///
<summary>
1210
///
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
1211
///
using the provided parameter values. This method will query the database to discover the parameters for the
1212
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1213
///
</summary>
1214
///
<remarks>
1215
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1216
///
1217
///
e.g.:
1218
///
int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36);
1219
///
</remarks>
1220
///
<param name="connection">
A valid SqlConnection
</param>
1221
///
<param name="spName">
The name of the stored procedure
</param>
1222
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1223
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1224
public
static
object
ExecuteScalar(SqlConnection connection,
string
spName,
params
object
[] parameterValues)
1225
{
1226
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1227
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1228
1229
//
If we receive parameter values, we need to figure out where they go
1230
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1231
{
1232
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1233
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1234
1235
//
Assign the provided values to these parameters based on parameter order
1236
AssignParameterValues(commandParameters, parameterValues);
1237
1238
//
Call the overload that takes an array of SqlParameters
1239
return
ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);
1240
}
1241
else
1242
{
1243
//
Otherwise we can just call the SP without params
1244
return
ExecuteScalar(connection, CommandType.StoredProcedure, spName);
1245
}
1246
}
1247
1248
///
<summary>
1249
///
Execute a SqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided SqlTransaction.
1250
///
</summary>
1251
///
<remarks>
1252
///
e.g.:
1253
///
int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount");
1254
///
</remarks>
1255
///
<param name="transaction">
A valid SqlTransaction
</param>
1256
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1257
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1258
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1259
public
static
object
ExecuteScalar(SqlTransaction transaction, CommandType commandType,
string
commandText)
1260
{
1261
//
Pass through the call providing null for the set of SqlParameters
1262
return
ExecuteScalar(transaction, commandType, commandText, (SqlParameter[])
null
);
1263
}
1264
1265
///
<summary>
1266
///
Execute a SqlCommand (that returns a 1x1 resultset) against the specified SqlTransaction
1267
///
using the provided parameters.
1268
///
</summary>
1269
///
<remarks>
1270
///
e.g.:
1271
///
int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
1272
///
</remarks>
1273
///
<param name="transaction">
A valid SqlTransaction
</param>
1274
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1275
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1276
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1277
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1278
public
static
object
ExecuteScalar(SqlTransaction transaction, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
1279
{
1280
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1281
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1282
1283
//
Create a command and prepare it for execution
1284
SqlCommand cmd
=
new
SqlCommand();
1285
bool
mustCloseConnection
=
false
;
1286
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters,
out
mustCloseConnection );
1287
1288
//
Execute the command & return the results
1289
object
retval
=
cmd.ExecuteScalar();
1290
1291
//
Detach the SqlParameters from the command object, so they can be used again
1292
cmd.Parameters.Clear();
1293
return
retval;
1294
}
1295
1296
///
<summary>
1297
///
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the specified
1298
///
SqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the
1299
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1300
///
</summary>
1301
///
<remarks>
1302
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1303
///
1304
///
e.g.:
1305
///
int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36);
1306
///
</remarks>
1307
///
<param name="transaction">
A valid SqlTransaction
</param>
1308
///
<param name="spName">
The name of the stored procedure
</param>
1309
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1310
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
1311
public
static
object
ExecuteScalar(SqlTransaction transaction,
string
spName,
params
object
[] parameterValues)
1312
{
1313
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1314
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1315
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1316
1317
//
If we receive parameter values, we need to figure out where they go
1318
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1319
{
1320
//
PPull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1321
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
1322
1323
//
Assign the provided values to these parameters based on parameter order
1324
AssignParameterValues(commandParameters, parameterValues);
1325
1326
//
Call the overload that takes an array of SqlParameters
1327
return
ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);
1328
}
1329
else
1330
{
1331
//
Otherwise we can just call the SP without params
1332
return
ExecuteScalar(transaction, CommandType.StoredProcedure, spName);
1333
}
1334
}
1335
1336
#endregion
ExecuteScalar
1337
1338
#region
ExecuteXmlReader
1339
///
<summary>
1340
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
1341
///
</summary>
1342
///
<remarks>
1343
///
e.g.:
1344
///
XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders");
1345
///
</remarks>
1346
///
<param name="connection">
A valid SqlConnection
</param>
1347
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1348
///
<param name="commandText">
The stored procedure name or T-SQL command using "FOR XML AUTO"
</param>
1349
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
1350
public
static
XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType,
string
commandText)
1351
{
1352
//
Pass through the call providing null for the set of SqlParameters
1353
return
ExecuteXmlReader(connection, commandType, commandText, (SqlParameter[])
null
);
1354
}
1355
1356
///
<summary>
1357
///
Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
1358
///
using the provided parameters.
1359
///
</summary>
1360
///
<remarks>
1361
///
e.g.:
1362
///
XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1363
///
</remarks>
1364
///
<param name="connection">
A valid SqlConnection
</param>
1365
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1366
///
<param name="commandText">
The stored procedure name or T-SQL command using "FOR XML AUTO"
</param>
1367
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1368
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
1369
public
static
XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
1370
{
1371
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1372
1373
bool
mustCloseConnection
=
false
;
1374
//
Create a command and prepare it for execution
1375
SqlCommand cmd
=
new
SqlCommand();
1376
try
1377
{
1378
PrepareCommand(cmd, connection, (SqlTransaction)
null
, commandType, commandText, commandParameters,
out
mustCloseConnection );
1379
1380
//
Create the DataAdapter & DataSet
1381
XmlReader retval
=
cmd.ExecuteXmlReader();
1382
1383
//
Detach the SqlParameters from the command object, so they can be used again
1384
cmd.Parameters.Clear();
1385
1386
return
retval;
1387
}
1388
catch
1389
{
1390
if
( mustCloseConnection )
1391
connection.Close();
1392
throw
;
1393
}
1394
}
1395
1396
///
<summary>
1397
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
1398
///
using the provided parameter values. This method will query the database to discover the parameters for the
1399
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1400
///
</summary>
1401
///
<remarks>
1402
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1403
///
1404
///
e.g.:
1405
///
XmlReader r = ExecuteXmlReader(conn, "GetOrders", 24, 36);
1406
///
</remarks>
1407
///
<param name="connection">
A valid SqlConnection
</param>
1408
///
<param name="spName">
The name of the stored procedure using "FOR XML AUTO"
</param>
1409
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1410
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
1411
public
static
XmlReader ExecuteXmlReader(SqlConnection connection,
string
spName,
params
object
[] parameterValues)
1412
{
1413
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1414
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1415
1416
//
If we receive parameter values, we need to figure out where they go
1417
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1418
{
1419
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1420
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1421
1422
//
Assign the provided values to these parameters based on parameter order
1423
AssignParameterValues(commandParameters, parameterValues);
1424
1425
//
Call the overload that takes an array of SqlParameters
1426
return
ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);
1427
}
1428
else
1429
{
1430
//
Otherwise we can just call the SP without params
1431
return
ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);
1432
}
1433
}
1434
1435
///
<summary>
1436
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlTransaction.
1437
///
</summary>
1438
///
<remarks>
1439
///
e.g.:
1440
///
XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders");
1441
///
</remarks>
1442
///
<param name="transaction">
A valid SqlTransaction
</param>
1443
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1444
///
<param name="commandText">
The stored procedure name or T-SQL command using "FOR XML AUTO"
</param>
1445
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
1446
public
static
XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType,
string
commandText)
1447
{
1448
//
Pass through the call providing null for the set of SqlParameters
1449
return
ExecuteXmlReader(transaction, commandType, commandText, (SqlParameter[])
null
);
1450
}
1451
1452
///
<summary>
1453
///
Execute a SqlCommand (that returns a resultset) against the specified SqlTransaction
1454
///
using the provided parameters.
1455
///
</summary>
1456
///
<remarks>
1457
///
e.g.:
1458
///
XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1459
///
</remarks>
1460
///
<param name="transaction">
A valid SqlTransaction
</param>
1461
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1462
///
<param name="commandText">
The stored procedure name or T-SQL command using "FOR XML AUTO"
</param>
1463
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1464
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
1465
public
static
XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType,
string
commandText,
params
SqlParameter[] commandParameters)
1466
{
1467
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1468
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1469
1470
//
Create a command and prepare it for execution
1471
SqlCommand cmd
=
new
SqlCommand();
1472
bool
mustCloseConnection
=
false
;
1473
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters,
out
mustCloseConnection );
1474
1475
//
Create the DataAdapter & DataSet
1476
XmlReader retval
=
cmd.ExecuteXmlReader();
1477
1478
//
Detach the SqlParameters from the command object, so they can be used again
1479
cmd.Parameters.Clear();
1480
return
retval;
1481
}
1482
1483
///
<summary>
1484
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified
1485
///
SqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the
1486
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1487
///
</summary>
1488
///
<remarks>
1489
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1490
///
1491
///
e.g.:
1492
///
XmlReader r = ExecuteXmlReader(trans, "GetOrders", 24, 36);
1493
///
</remarks>
1494
///
<param name="transaction">
A valid SqlTransaction
</param>
1495
///
<param name="spName">
The name of the stored procedure
</param>
1496
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1497
///
<returns>
A dataset containing the resultset generated by the command
</returns>
1498
public
static
XmlReader ExecuteXmlReader(SqlTransaction transaction,
string
spName,
params
object
[] parameterValues)
1499
{
1500
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1501
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1502
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1503
1504
//
If we receive parameter values, we need to figure out where they go
1505
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1506
{
1507
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1508
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
1509
1510
//
Assign the provided values to these parameters based on parameter order
1511
AssignParameterValues(commandParameters, parameterValues);
1512
1513
//
Call the overload that takes an array of SqlParameters
1514
return
ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
1515
}
1516
else
1517
{
1518
//
Otherwise we can just call the SP without params
1519
return
ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName);
1520
}
1521
}
1522
1523
#endregion
ExecuteXmlReader
1524
1525
#region
FillDataset
1526
///
<summary>
1527
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in
1528
///
the connection string.
1529
///
</summary>
1530
///
<remarks>
1531
///
e.g.:
1532
///
FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
1533
///
</remarks>
1534
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1535
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1536
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1537
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1538
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1539
///
by a user defined name (probably the actual table name)
</param>
1540
public
static
void
FillDataset(
string
connectionString, CommandType commandType,
string
commandText, DataSet dataSet,
string
[] tableNames)
1541
{
1542
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
1543
if
( dataSet
==
null
)
throw
new
ArgumentNullException(
"
dataSet
"
);
1544
1545
//
Create & open a SqlConnection, and dispose of it after we are done
1546
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
1547
{
1548
connection.Open();
1549
1550
//
Call the overload that takes a connection in place of the connection string
1551
FillDataset(connection, commandType, commandText, dataSet, tableNames);
1552
}
1553
}
1554
1555
///
<summary>
1556
///
Execute a SqlCommand (that returns a resultset) against the database specified in the connection string
1557
///
using the provided parameters.
1558
///
</summary>
1559
///
<remarks>
1560
///
e.g.:
1561
///
FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
1562
///
</remarks>
1563
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1564
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1565
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1566
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1567
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1568
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1569
///
by a user defined name (probably the actual table name)
1570
///
</param>
1571
public
static
void
FillDataset(
string
connectionString, CommandType commandType,
1572
string
commandText, DataSet dataSet,
string
[] tableNames,
1573
params
SqlParameter[] commandParameters)
1574
{
1575
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
1576
if
( dataSet
==
null
)
throw
new
ArgumentNullException(
"
dataSet
"
);
1577
//
Create & open a SqlConnection, and dispose of it after we are done
1578
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
1579
{
1580
connection.Open();
1581
1582
//
Call the overload that takes a connection in place of the connection string
1583
FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters);
1584
}
1585
}
1586
1587
///
<summary>
1588
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
1589
///
the connection string using the provided parameter values. This method will query the database to discover the parameters for the
1590
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1591
///
</summary>
1592
///
<remarks>
1593
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1594
///
1595
///
e.g.:
1596
///
FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24);
1597
///
</remarks>
1598
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1599
///
<param name="spName">
The name of the stored procedure
</param>
1600
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1601
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1602
///
by a user defined name (probably the actual table name)
1603
///
</param>
1604
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1605
public
static
void
FillDataset(
string
connectionString,
string
spName,
1606
DataSet dataSet,
string
[] tableNames,
1607
params
object
[] parameterValues)
1608
{
1609
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
1610
if
( dataSet
==
null
)
throw
new
ArgumentNullException(
"
dataSet
"
);
1611
//
Create & open a SqlConnection, and dispose of it after we are done
1612
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
1613
{
1614
connection.Open();
1615
1616
//
Call the overload that takes a connection in place of the connection string
1617
FillDataset (connection, spName, dataSet, tableNames, parameterValues);
1618
}
1619
}
1620
1621
///
<summary>
1622
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlConnection.
1623
///
</summary>
1624
///
<remarks>
1625
///
e.g.:
1626
///
FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
1627
///
</remarks>
1628
///
<param name="connection">
A valid SqlConnection
</param>
1629
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1630
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1631
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1632
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1633
///
by a user defined name (probably the actual table name)
1634
///
</param>
1635
public
static
void
FillDataset(SqlConnection connection, CommandType commandType,
1636
string
commandText, DataSet dataSet,
string
[] tableNames)
1637
{
1638
FillDataset(connection, commandType, commandText, dataSet, tableNames,
null
);
1639
}
1640
1641
///
<summary>
1642
///
Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
1643
///
using the provided parameters.
1644
///
</summary>
1645
///
<remarks>
1646
///
e.g.:
1647
///
FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
1648
///
</remarks>
1649
///
<param name="connection">
A valid SqlConnection
</param>
1650
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1651
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1652
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1653
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1654
///
by a user defined name (probably the actual table name)
1655
///
</param>
1656
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1657
public
static
void
FillDataset(SqlConnection connection, CommandType commandType,
1658
string
commandText, DataSet dataSet,
string
[] tableNames,
1659
params
SqlParameter[] commandParameters)
1660
{
1661
FillDataset(connection,
null
, commandType, commandText, dataSet, tableNames, commandParameters);
1662
}
1663
1664
///
<summary>
1665
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
1666
///
using the provided parameter values. This method will query the database to discover the parameters for the
1667
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1668
///
</summary>
1669
///
<remarks>
1670
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1671
///
1672
///
e.g.:
1673
///
FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36);
1674
///
</remarks>
1675
///
<param name="connection">
A valid SqlConnection
</param>
1676
///
<param name="spName">
The name of the stored procedure
</param>
1677
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1678
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1679
///
by a user defined name (probably the actual table name)
1680
///
</param>
1681
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1682
public
static
void
FillDataset(SqlConnection connection,
string
spName,
1683
DataSet dataSet,
string
[] tableNames,
1684
params
object
[] parameterValues)
1685
{
1686
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1687
if
(dataSet
==
null
)
throw
new
ArgumentNullException(
"
dataSet
"
);
1688
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1689
1690
//
If we receive parameter values, we need to figure out where they go
1691
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1692
{
1693
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1694
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1695
1696
//
Assign the provided values to these parameters based on parameter order
1697
AssignParameterValues(commandParameters, parameterValues);
1698
1699
//
Call the overload that takes an array of SqlParameters
1700
FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);
1701
}
1702
else
1703
{
1704
//
Otherwise we can just call the SP without params
1705
FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames);
1706
}
1707
}
1708
1709
///
<summary>
1710
///
Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided SqlTransaction.
1711
///
</summary>
1712
///
<remarks>
1713
///
e.g.:
1714
///
FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
1715
///
</remarks>
1716
///
<param name="transaction">
A valid SqlTransaction
</param>
1717
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1718
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1719
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1720
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1721
///
by a user defined name (probably the actual table name)
1722
///
</param>
1723
public
static
void
FillDataset(SqlTransaction transaction, CommandType commandType,
1724
string
commandText,
1725
DataSet dataSet,
string
[] tableNames)
1726
{
1727
FillDataset (transaction, commandType, commandText, dataSet, tableNames,
null
);
1728
}
1729
1730
///
<summary>
1731
///
Execute a SqlCommand (that returns a resultset) against the specified SqlTransaction
1732
///
using the provided parameters.
1733
///
</summary>
1734
///
<remarks>
1735
///
e.g.:
1736
///
FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
1737
///
</remarks>
1738
///
<param name="transaction">
A valid SqlTransaction
</param>
1739
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1740
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1741
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1742
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1743
///
by a user defined name (probably the actual table name)
1744
///
</param>
1745
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1746
public
static
void
FillDataset(SqlTransaction transaction, CommandType commandType,
1747
string
commandText, DataSet dataSet,
string
[] tableNames,
1748
params
SqlParameter[] commandParameters)
1749
{
1750
FillDataset(transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters);
1751
}
1752
1753
///
<summary>
1754
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified
1755
///
SqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the
1756
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
1757
///
</summary>
1758
///
<remarks>
1759
///
This method provides no access to output parameters or the stored procedure's return value parameter.
1760
///
1761
///
e.g.:
1762
///
FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36);
1763
///
</remarks>
1764
///
<param name="transaction">
A valid SqlTransaction
</param>
1765
///
<param name="spName">
The name of the stored procedure
</param>
1766
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1767
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1768
///
by a user defined name (probably the actual table name)
1769
///
</param>
1770
///
<param name="parameterValues">
An array of objects to be assigned as the input values of the stored procedure
</param>
1771
public
static
void
FillDataset(SqlTransaction transaction,
string
spName,
1772
DataSet dataSet,
string
[] tableNames,
1773
params
object
[] parameterValues)
1774
{
1775
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
1776
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
1777
if
( dataSet
==
null
)
throw
new
ArgumentNullException(
"
dataSet
"
);
1778
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1779
1780
//
If we receive parameter values, we need to figure out where they go
1781
if
((parameterValues
!=
null
)
&&
(parameterValues.Length
>
0
))
1782
{
1783
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1784
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
1785
1786
//
Assign the provided values to these parameters based on parameter order
1787
AssignParameterValues(commandParameters, parameterValues);
1788
1789
//
Call the overload that takes an array of SqlParameters
1790
FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);
1791
}
1792
else
1793
{
1794
//
Otherwise we can just call the SP without params
1795
FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames);
1796
}
1797
}
1798
1799
///
<summary>
1800
///
Private helper method that execute a SqlCommand (that returns a resultset) against the specified SqlTransaction and SqlConnection
1801
///
using the provided parameters.
1802
///
</summary>
1803
///
<remarks>
1804
///
e.g.:
1805
///
FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
1806
///
</remarks>
1807
///
<param name="connection">
A valid SqlConnection
</param>
1808
///
<param name="transaction">
A valid SqlTransaction
</param>
1809
///
<param name="commandType">
The CommandType (stored procedure, text, etc.)
</param>
1810
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
1811
///
<param name="dataSet">
A dataset wich will contain the resultset generated by the command
</param>
1812
///
<param name="tableNames">
This array will be used to create table mappings allowing the DataTables to be referenced
1813
///
by a user defined name (probably the actual table name)
1814
///
</param>
1815
///
<param name="commandParameters">
An array of SqlParamters used to execute the command
</param>
1816
private
static
void
FillDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType,
1817
string
commandText, DataSet dataSet,
string
[] tableNames,
1818
params
SqlParameter[] commandParameters)
1819
{
1820
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1821
if
( dataSet
==
null
)
throw
new
ArgumentNullException(
"
dataSet
"
);
1822
1823
//
Create a command and prepare it for execution
1824
SqlCommand command
=
new
SqlCommand();
1825
bool
mustCloseConnection
=
false
;
1826
PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters,
out
mustCloseConnection );
1827
1828
//
Create the DataAdapter & DataSet
1829
using
( SqlDataAdapter dataAdapter
=
new
SqlDataAdapter(command) )
1830
{
1831
1832
//
Add the table mappings specified by the user
1833
if
(tableNames
!=
null
&&
tableNames.Length
>
0
)
1834
{
1835
string
tableName
=
"
Table
"
;
1836
for
(
int
index
=
0
; index
<
tableNames.Length; index
++
)
1837
{
1838
if
( tableNames[index]
==
null
||
tableNames[index].Length
==
0
)
throw
new
ArgumentException(
"
The tableNames parameter must contain a list of tables, a value was provided as null or empty string.
"
,
"
tableNames
"
);
1839
dataAdapter.TableMappings.Add(tableName, tableNames[index]);
1840
tableName
+=
(index
+
1
).ToString();
1841
}
1842
}
1843
1844
//
Fill the DataSet using default values for DataTable names, etc
1845
dataAdapter.Fill(dataSet);
1846
1847
//
Detach the SqlParameters from the command object, so they can be used again
1848
command.Parameters.Clear();
1849
}
1850
1851
if
( mustCloseConnection )
1852
connection.Close();
1853
}
1854
#endregion
1855
1856
#region
UpdateDataset
1857
///
<summary>
1858
///
Executes the respective command for each inserted, updated, or deleted row in the DataSet.
1859
///
</summary>
1860
///
<remarks>
1861
///
e.g.:
1862
///
UpdateDataset(conn, insertCommand, deleteCommand, updateCommand, dataSet, "Order");
1863
///
</remarks>
1864
///
<param name="insertCommand">
A valid transact-SQL statement or stored procedure to insert new records into the data source
</param>
1865
///
<param name="deleteCommand">
A valid transact-SQL statement or stored procedure to delete records from the data source
</param>
1866
///
<param name="updateCommand">
A valid transact-SQL statement or stored procedure used to update records in the data source
</param>
1867
///
<param name="dataSet">
The DataSet used to update the data source
</param>
1868
///
<param name="tableName">
The DataTable used to update the data source.
</param>
1869
public
static
void
UpdateDataset(SqlCommand insertCommand, SqlCommand deleteCommand, SqlCommand updateCommand, DataSet dataSet,
string
tableName)
1870
{
1871
if
( insertCommand
==
null
)
throw
new
ArgumentNullException(
"
insertCommand
"
);
1872
if
( deleteCommand
==
null
)
throw
new
ArgumentNullException(
"
deleteCommand
"
);
1873
if
( updateCommand
==
null
)
throw
new
ArgumentNullException(
"
updateCommand
"
);
1874
if
( tableName
==
null
||
tableName.Length
==
0
)
throw
new
ArgumentNullException(
"
tableName
"
);
1875
1876
//
Create a SqlDataAdapter, and dispose of it after we are done
1877
using
(SqlDataAdapter dataAdapter
=
new
SqlDataAdapter())
1878
{
1879
//
Set the data adapter commands
1880
dataAdapter.UpdateCommand
=
updateCommand;
1881
dataAdapter.InsertCommand
=
insertCommand;
1882
dataAdapter.DeleteCommand
=
deleteCommand;
1883
1884
//
Update the dataset changes in the data source
1885
dataAdapter.Update (dataSet, tableName);
1886
1887
//
Commit all the changes made to the DataSet
1888
dataSet.AcceptChanges();
1889
}
1890
}
1891
#endregion
1892
1893
#region
CreateCommand
1894
///
<summary>
1895
///
Simplify the creation of a Sql command object by allowing
1896
///
a stored procedure and optional parameters to be provided
1897
///
</summary>
1898
///
<remarks>
1899
///
e.g.:
1900
///
SqlCommand command = CreateCommand(conn, "AddCustomer", "CustomerID", "CustomerName");
1901
///
</remarks>
1902
///
<param name="connection">
A valid SqlConnection object
</param>
1903
///
<param name="spName">
The name of the stored procedure
</param>
1904
///
<param name="sourceColumns">
An array of string to be assigned as the source columns of the stored procedure parameters
</param>
1905
///
<returns>
A valid SqlCommand object
</returns>
1906
public
static
SqlCommand CreateCommand(SqlConnection connection,
string
spName,
params
string
[] sourceColumns)
1907
{
1908
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1909
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1910
1911
//
Create a SqlCommand
1912
SqlCommand cmd
=
new
SqlCommand( spName, connection );
1913
cmd.CommandType
=
CommandType.StoredProcedure;
1914
1915
//
If we receive parameter values, we need to figure out where they go
1916
if
((sourceColumns
!=
null
)
&&
(sourceColumns.Length
>
0
))
1917
{
1918
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1919
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1920
1921
//
Assign the provided source columns to these parameters based on parameter order
1922
for
(
int
index
=
0
; index
<
sourceColumns.Length; index
++
)
1923
commandParameters[index].SourceColumn
=
sourceColumns[index];
1924
1925
//
Attach the discovered parameters to the SqlCommand object
1926
AttachParameters (cmd, commandParameters);
1927
}
1928
1929
return
cmd;
1930
}
1931
#endregion
1932
1933
#region
ExecuteNonQueryTypedParams
1934
///
<summary>
1935
///
Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in
1936
///
the connection string using the dataRow column values as the stored procedure's parameters values.
1937
///
This method will query the database to discover the parameters for the
1938
///
stored procedure (the first time each stored procedure is called), and assign the values based on row values.
1939
///
</summary>
1940
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
1941
///
<param name="spName">
The name of the stored procedure
</param>
1942
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
1943
///
<returns>
An int representing the number of rows affected by the command
</returns>
1944
public
static
int
ExecuteNonQueryTypedParams(String connectionString, String spName, DataRow dataRow)
1945
{
1946
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
1947
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1948
1949
//
If the row has values, the store procedure parameters must be initialized
1950
if
(dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
1951
{
1952
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1953
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
1954
1955
//
Set the parameters values
1956
AssignParameterValues(commandParameters, dataRow);
1957
1958
return
SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
1959
}
1960
else
1961
{
1962
return
SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
1963
}
1964
}
1965
1966
///
<summary>
1967
///
Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified SqlConnection
1968
///
using the dataRow column values as the stored procedure's parameters values.
1969
///
This method will query the database to discover the parameters for the
1970
///
stored procedure (the first time each stored procedure is called), and assign the values based on row values.
1971
///
</summary>
1972
///
<param name="connection">
A valid SqlConnection object
</param>
1973
///
<param name="spName">
The name of the stored procedure
</param>
1974
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
1975
///
<returns>
An int representing the number of rows affected by the command
</returns>
1976
public
static
int
ExecuteNonQueryTypedParams(SqlConnection connection, String spName, DataRow dataRow)
1977
{
1978
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
1979
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
1980
1981
//
If the row has values, the store procedure parameters must be initialized
1982
if
(dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
1983
{
1984
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
1985
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1986
1987
//
Set the parameters values
1988
AssignParameterValues(commandParameters, dataRow);
1989
1990
return
SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
1991
}
1992
else
1993
{
1994
return
SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
1995
}
1996
}
1997
1998
///
<summary>
1999
///
Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified
2000
///
SqlTransaction using the dataRow column values as the stored procedure's parameters values.
2001
///
This method will query the database to discover the parameters for the
2002
///
stored procedure (the first time each stored procedure is called), and assign the values based on row values.
2003
///
</summary>
2004
///
<param name="transaction">
A valid SqlTransaction object
</param>
2005
///
<param name="spName">
The name of the stored procedure
</param>
2006
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2007
///
<returns>
An int representing the number of rows affected by the command
</returns>
2008
public
static
int
ExecuteNonQueryTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
2009
{
2010
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
2011
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
2012
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2013
2014
//
Sf the row has values, the store procedure parameters must be initialized
2015
if
(dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2016
{
2017
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2018
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2019
2020
//
Set the parameters values
2021
AssignParameterValues(commandParameters, dataRow);
2022
2023
return
SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
2024
}
2025
else
2026
{
2027
return
SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
2028
}
2029
}
2030
#endregion
2031
2032
#region
ExecuteDatasetTypedParams
2033
///
<summary>
2034
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
2035
///
the connection string using the dataRow column values as the stored procedure's parameters values.
2036
///
This method will query the database to discover the parameters for the
2037
///
stored procedure (the first time each stored procedure is called), and assign the values based on row values.
2038
///
</summary>
2039
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2040
///
<param name="spName">
The name of the stored procedure
</param>
2041
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2042
///
<returns>
A dataset containing the resultset generated by the command
</returns>
2043
public
static
DataSet ExecuteDatasetTypedParams(
string
connectionString, String spName, DataRow dataRow)
2044
{
2045
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
2046
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2047
2048
//
If the row has values, the store procedure parameters must be initialized
2049
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2050
{
2051
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2052
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
2053
2054
//
Set the parameters values
2055
AssignParameterValues(commandParameters, dataRow);
2056
2057
return
SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);
2058
}
2059
else
2060
{
2061
return
SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);
2062
}
2063
}
2064
2065
///
<summary>
2066
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
2067
///
using the dataRow column values as the store procedure's parameters values.
2068
///
This method will query the database to discover the parameters for the
2069
///
stored procedure (the first time each stored procedure is called), and assign the values based on row values.
2070
///
</summary>
2071
///
<param name="connection">
A valid SqlConnection object
</param>
2072
///
<param name="spName">
The name of the stored procedure
</param>
2073
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2074
///
<returns>
A dataset containing the resultset generated by the command
</returns>
2075
public
static
DataSet ExecuteDatasetTypedParams(SqlConnection connection, String spName, DataRow dataRow)
2076
{
2077
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2078
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2079
2080
//
If the row has values, the store procedure parameters must be initialized
2081
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2082
{
2083
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2084
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
2085
2086
//
Set the parameters values
2087
AssignParameterValues(commandParameters, dataRow);
2088
2089
return
SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);
2090
}
2091
else
2092
{
2093
return
SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName);
2094
}
2095
}
2096
2097
///
<summary>
2098
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlTransaction
2099
///
using the dataRow column values as the stored procedure's parameters values.
2100
///
This method will query the database to discover the parameters for the
2101
///
stored procedure (the first time each stored procedure is called), and assign the values based on row values.
2102
///
</summary>
2103
///
<param name="transaction">
A valid SqlTransaction object
</param>
2104
///
<param name="spName">
The name of the stored procedure
</param>
2105
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2106
///
<returns>
A dataset containing the resultset generated by the command
</returns>
2107
public
static
DataSet ExecuteDatasetTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
2108
{
2109
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
2110
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
2111
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2112
2113
//
If the row has values, the store procedure parameters must be initialized
2114
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2115
{
2116
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2117
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2118
2119
//
Set the parameters values
2120
AssignParameterValues(commandParameters, dataRow);
2121
2122
return
SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);
2123
}
2124
else
2125
{
2126
return
SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName);
2127
}
2128
}
2129
2130
#endregion
2131
2132
#region
ExecuteReaderTypedParams
2133
///
<summary>
2134
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
2135
///
the connection string using the dataRow column values as the stored procedure's parameters values.
2136
///
This method will query the database to discover the parameters for the
2137
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2138
///
</summary>
2139
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2140
///
<param name="spName">
The name of the stored procedure
</param>
2141
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2142
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
2143
public
static
SqlDataReader ExecuteReaderTypedParams(String connectionString, String spName, DataRow dataRow)
2144
{
2145
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
2146
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2147
2148
//
If the row has values, the store procedure parameters must be initialized
2149
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2150
{
2151
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2152
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
2153
2154
//
Set the parameters values
2155
AssignParameterValues(commandParameters, dataRow);
2156
2157
return
SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);
2158
}
2159
else
2160
{
2161
return
SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName);
2162
}
2163
}
2164
2165
2166
///
<summary>
2167
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
2168
///
using the dataRow column values as the stored procedure's parameters values.
2169
///
This method will query the database to discover the parameters for the
2170
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2171
///
</summary>
2172
///
<param name="connection">
A valid SqlConnection object
</param>
2173
///
<param name="spName">
The name of the stored procedure
</param>
2174
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2175
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
2176
public
static
SqlDataReader ExecuteReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow)
2177
{
2178
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2179
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2180
2181
//
If the row has values, the store procedure parameters must be initialized
2182
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2183
{
2184
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2185
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
2186
2187
//
Set the parameters values
2188
AssignParameterValues(commandParameters, dataRow);
2189
2190
return
SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);
2191
}
2192
else
2193
{
2194
return
SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName);
2195
}
2196
}
2197
2198
///
<summary>
2199
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlTransaction
2200
///
using the dataRow column values as the stored procedure's parameters values.
2201
///
This method will query the database to discover the parameters for the
2202
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2203
///
</summary>
2204
///
<param name="transaction">
A valid SqlTransaction object
</param>
2205
///
<param name="spName">
The name of the stored procedure
</param>
2206
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2207
///
<returns>
A SqlDataReader containing the resultset generated by the command
</returns>
2208
public
static
SqlDataReader ExecuteReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
2209
{
2210
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
2211
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
2212
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2213
2214
//
If the row has values, the store procedure parameters must be initialized
2215
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2216
{
2217
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2218
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2219
2220
//
Set the parameters values
2221
AssignParameterValues(commandParameters, dataRow);
2222
2223
return
SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
2224
}
2225
else
2226
{
2227
return
SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName);
2228
}
2229
}
2230
#endregion
2231
2232
#region
ExecuteScalarTypedParams
2233
///
<summary>
2234
///
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the database specified in
2235
///
the connection string using the dataRow column values as the stored procedure's parameters values.
2236
///
This method will query the database to discover the parameters for the
2237
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2238
///
</summary>
2239
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2240
///
<param name="spName">
The name of the stored procedure
</param>
2241
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2242
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
2243
public
static
object
ExecuteScalarTypedParams(String connectionString, String spName, DataRow dataRow)
2244
{
2245
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
2246
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2247
2248
//
If the row has values, the store procedure parameters must be initialized
2249
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2250
{
2251
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2252
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
2253
2254
//
Set the parameters values
2255
AssignParameterValues(commandParameters, dataRow);
2256
2257
return
SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);
2258
}
2259
else
2260
{
2261
return
SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);
2262
}
2263
}
2264
2265
///
<summary>
2266
///
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
2267
///
using the dataRow column values as the stored procedure's parameters values.
2268
///
This method will query the database to discover the parameters for the
2269
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2270
///
</summary>
2271
///
<param name="connection">
A valid SqlConnection object
</param>
2272
///
<param name="spName">
The name of the stored procedure
</param>
2273
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2274
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
2275
public
static
object
ExecuteScalarTypedParams(SqlConnection connection, String spName, DataRow dataRow)
2276
{
2277
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2278
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2279
2280
//
If the row has values, the store procedure parameters must be initialized
2281
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2282
{
2283
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2284
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
2285
2286
//
Set the parameters values
2287
AssignParameterValues(commandParameters, dataRow);
2288
2289
return
SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);
2290
}
2291
else
2292
{
2293
return
SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName);
2294
}
2295
}
2296
2297
///
<summary>
2298
///
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the specified SqlTransaction
2299
///
using the dataRow column values as the stored procedure's parameters values.
2300
///
This method will query the database to discover the parameters for the
2301
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2302
///
</summary>
2303
///
<param name="transaction">
A valid SqlTransaction object
</param>
2304
///
<param name="spName">
The name of the stored procedure
</param>
2305
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2306
///
<returns>
An object containing the value in the 1x1 resultset generated by the command
</returns>
2307
public
static
object
ExecuteScalarTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
2308
{
2309
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
2310
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
2311
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2312
2313
//
If the row has values, the store procedure parameters must be initialized
2314
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2315
{
2316
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2317
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2318
2319
//
Set the parameters values
2320
AssignParameterValues(commandParameters, dataRow);
2321
2322
return
SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);
2323
}
2324
else
2325
{
2326
return
SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName);
2327
}
2328
}
2329
#endregion
2330
2331
#region
ExecuteXmlReaderTypedParams
2332
///
<summary>
2333
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlConnection
2334
///
using the dataRow column values as the stored procedure's parameters values.
2335
///
This method will query the database to discover the parameters for the
2336
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2337
///
</summary>
2338
///
<param name="connection">
A valid SqlConnection object
</param>
2339
///
<param name="spName">
The name of the stored procedure
</param>
2340
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2341
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
2342
public
static
XmlReader ExecuteXmlReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow)
2343
{
2344
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2345
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2346
2347
//
If the row has values, the store procedure parameters must be initialized
2348
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2349
{
2350
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2351
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(connection, spName);
2352
2353
//
Set the parameters values
2354
AssignParameterValues(commandParameters, dataRow);
2355
2356
return
SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);
2357
}
2358
else
2359
{
2360
return
SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);
2361
}
2362
}
2363
2364
///
<summary>
2365
///
Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified SqlTransaction
2366
///
using the dataRow column values as the stored procedure's parameters values.
2367
///
This method will query the database to discover the parameters for the
2368
///
stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
2369
///
</summary>
2370
///
<param name="transaction">
A valid SqlTransaction object
</param>
2371
///
<param name="spName">
The name of the stored procedure
</param>
2372
///
<param name="dataRow">
The dataRow used to hold the stored procedure's parameter values.
</param>
2373
///
<returns>
An XmlReader containing the resultset generated by the command
</returns>
2374
public
static
XmlReader ExecuteXmlReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
2375
{
2376
if
( transaction
==
null
)
throw
new
ArgumentNullException(
"
transaction
"
);
2377
if
( transaction
!=
null
&&
transaction.Connection
==
null
)
throw
new
ArgumentException(
"
The transaction was rollbacked or commited, please provide an open transaction.
"
,
"
transaction
"
);
2378
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2379
2380
//
If the row has values, the store procedure parameters must be initialized
2381
if
( dataRow
!=
null
&&
dataRow.ItemArray.Length
>
0
)
2382
{
2383
//
Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
2384
SqlParameter[] commandParameters
=
SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2385
2386
//
Set the parameters values
2387
AssignParameterValues(commandParameters, dataRow);
2388
2389
return
SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
2390
}
2391
else
2392
{
2393
return
SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName);
2394
}
2395
}
2396
#endregion
2397
2398
}
2399
2400
///
<summary>
2401
///
SqlHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the
2402
///
ability to discover parameters for stored procedures at run-time.
2403
///
</summary>
2404
public
sealed
class
SqlHelperParameterCache
2405
{
2406
#region
private methods, variables, and constructors
2407
2408
//
Since this class provides only static methods, make the default constructor private to prevent
2409
//
instances from being created with "new SqlHelperParameterCache()"
2410
private
SqlHelperParameterCache() {}
2411
2412
private
static
Hashtable paramCache
=
Hashtable.Synchronized(
new
Hashtable());
2413
2414
///
<summary>
2415
///
Resolve at run time the appropriate set of SqlParameters for a stored procedure
2416
///
</summary>
2417
///
<param name="connection">
A valid SqlConnection object
</param>
2418
///
<param name="spName">
The name of the stored procedure
</param>
2419
///
<param name="includeReturnValueParameter">
Whether or not to include their return value parameter
</param>
2420
///
<returns>
The parameter array discovered.
</returns>
2421
private
static
SqlParameter[] DiscoverSpParameterSet(SqlConnection connection,
string
spName,
bool
includeReturnValueParameter)
2422
{
2423
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2424
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2425
2426
SqlCommand cmd
=
new
SqlCommand(spName, connection);
2427
cmd.CommandType
=
CommandType.StoredProcedure;
2428
2429
connection.Open();
2430
SqlCommandBuilder.DeriveParameters(cmd);
2431
connection.Close();
2432
2433
if
(
!
includeReturnValueParameter)
2434
{
2435
cmd.Parameters.RemoveAt(
0
);
2436
}
2437
2438
SqlParameter[] discoveredParameters
=
new
SqlParameter[cmd.Parameters.Count];
2439
2440
cmd.Parameters.CopyTo(discoveredParameters,
0
);
2441
2442
//
Init the parameters with a DBNull value
2443
foreach
(SqlParameter discoveredParameter
in
discoveredParameters)
2444
{
2445
discoveredParameter.Value
=
DBNull.Value;
2446
}
2447
return
discoveredParameters;
2448
}
2449
2450
///
<summary>
2451
///
Deep copy of cached SqlParameter array
2452
///
</summary>
2453
///
<param name="originalParameters"></param>
2454
///
<returns></returns>
2455
private
static
SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
2456
{
2457
SqlParameter[] clonedParameters
=
new
SqlParameter[originalParameters.Length];
2458
2459
for
(
int
i
=
0
, j
=
originalParameters.Length; i
<
j; i
++
)
2460
{
2461
clonedParameters[i]
=
(SqlParameter)((ICloneable)originalParameters[i]).Clone();
2462
}
2463
2464
return
clonedParameters;
2465
}
2466
2467
#endregion
private methods, variables, and constructors
2468
2469
#region
caching functions
2470
2471
///
<summary>
2472
///
Add parameter array to the cache
2473
///
</summary>
2474
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2475
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
2476
///
<param name="commandParameters">
An array of SqlParamters to be cached
</param>
2477
public
static
void
CacheParameterSet(
string
connectionString,
string
commandText,
params
SqlParameter[] commandParameters)
2478
{
2479
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
2480
if
( commandText
==
null
||
commandText.Length
==
0
)
throw
new
ArgumentNullException(
"
commandText
"
);
2481
2482
string
hashKey
=
connectionString
+
"
:
"
+
commandText;
2483
2484
paramCache[hashKey]
=
commandParameters;
2485
}
2486
2487
///
<summary>
2488
///
Retrieve a parameter array from the cache
2489
///
</summary>
2490
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2491
///
<param name="commandText">
The stored procedure name or T-SQL command
</param>
2492
///
<returns>
An array of SqlParamters
</returns>
2493
public
static
SqlParameter[] GetCachedParameterSet(
string
connectionString,
string
commandText)
2494
{
2495
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
2496
if
( commandText
==
null
||
commandText.Length
==
0
)
throw
new
ArgumentNullException(
"
commandText
"
);
2497
2498
string
hashKey
=
connectionString
+
"
:
"
+
commandText;
2499
2500
SqlParameter[] cachedParameters
=
paramCache[hashKey]
as
SqlParameter[];
2501
if
(cachedParameters
==
null
)
2502
{
2503
return
null
;
2504
}
2505
else
2506
{
2507
return
CloneParameters(cachedParameters);
2508
}
2509
}
2510
2511
#endregion
caching functions
2512
2513
#region
Parameter Discovery Functions
2514
2515
///
<summary>
2516
///
Retrieves the set of SqlParameters appropriate for the stored procedure
2517
///
</summary>
2518
///
<remarks>
2519
///
This method will query the database for this information, and then store it in a cache for future requests.
2520
///
</remarks>
2521
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2522
///
<param name="spName">
The name of the stored procedure
</param>
2523
///
<returns>
An array of SqlParameters
</returns>
2524
public
static
SqlParameter[] GetSpParameterSet(
string
connectionString,
string
spName)
2525
{
2526
return
GetSpParameterSet(connectionString, spName,
false
);
2527
}
2528
2529
///
<summary>
2530
///
Retrieves the set of SqlParameters appropriate for the stored procedure
2531
///
</summary>
2532
///
<remarks>
2533
///
This method will query the database for this information, and then store it in a cache for future requests.
2534
///
</remarks>
2535
///
<param name="connectionString">
A valid connection string for a SqlConnection
</param>
2536
///
<param name="spName">
The name of the stored procedure
</param>
2537
///
<param name="includeReturnValueParameter">
A bool value indicating whether the return value parameter should be included in the results
</param>
2538
///
<returns>
An array of SqlParameters
</returns>
2539
public
static
SqlParameter[] GetSpParameterSet(
string
connectionString,
string
spName,
bool
includeReturnValueParameter)
2540
{
2541
if
( connectionString
==
null
||
connectionString.Length
==
0
)
throw
new
ArgumentNullException(
"
connectionString
"
);
2542
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2543
2544
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
2545
{
2546
return
GetSpParameterSetInternal(connection, spName, includeReturnValueParameter);
2547
}
2548
}
2549
2550
///
<summary>
2551
///
Retrieves the set of SqlParameters appropriate for the stored procedure
2552
///
</summary>
2553
///
<remarks>
2554
///
This method will query the database for this information, and then store it in a cache for future requests.
2555
///
</remarks>
2556
///
<param name="connection">
A valid SqlConnection object
</param>
2557
///
<param name="spName">
The name of the stored procedure
</param>
2558
///
<returns>
An array of SqlParameters
</returns>
2559
internal
static
SqlParameter[] GetSpParameterSet(SqlConnection connection,
string
spName)
2560
{
2561
return
GetSpParameterSet(connection, spName,
false
);
2562
}
2563
2564
///
<summary>
2565
///
Retrieves the set of SqlParameters appropriate for the stored procedure
2566
///
</summary>
2567
///
<remarks>
2568
///
This method will query the database for this information, and then store it in a cache for future requests.
2569
///
</remarks>
2570
///
<param name="connection">
A valid SqlConnection object
</param>
2571
///
<param name="spName">
The name of the stored procedure
</param>
2572
///
<param name="includeReturnValueParameter">
A bool value indicating whether the return value parameter should be included in the results
</param>
2573
///
<returns>
An array of SqlParameters
</returns>
2574
internal
static
SqlParameter[] GetSpParameterSet(SqlConnection connection,
string
spName,
bool
includeReturnValueParameter)
2575
{
2576
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2577
using
(SqlConnection clonedConnection
=
(SqlConnection)((ICloneable)connection).Clone())
2578
{
2579
return
GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter);
2580
}
2581
}
2582
2583
///
<summary>
2584
///
Retrieves the set of SqlParameters appropriate for the stored procedure
2585
///
</summary>
2586
///
<param name="connection">
A valid SqlConnection object
</param>
2587
///
<param name="spName">
The name of the stored procedure
</param>
2588
///
<param name="includeReturnValueParameter">
A bool value indicating whether the return value parameter should be included in the results
</param>
2589
///
<returns>
An array of SqlParameters
</returns>
2590
private
static
SqlParameter[] GetSpParameterSetInternal(SqlConnection connection,
string
spName,
bool
includeReturnValueParameter)
2591
{
2592
if
( connection
==
null
)
throw
new
ArgumentNullException(
"
connection
"
);
2593
if
( spName
==
null
||
spName.Length
==
0
)
throw
new
ArgumentNullException(
"
spName
"
);
2594
2595
string
hashKey
=
connection.ConnectionString
+
"
:
"
+
spName
+
(includeReturnValueParameter
?
"
:include ReturnValue Parameter
"
:
""
);
2596
2597
SqlParameter[] cachedParameters;
2598
2599
cachedParameters
=
paramCache[hashKey]
as
SqlParameter[];
2600
if
(cachedParameters
==
null
)
2601
{
2602
SqlParameter[] spParameters
=
DiscoverSpParameterSet(connection, spName, includeReturnValueParameter);
2603
paramCache[hashKey]
=
spParameters;
2604
cachedParameters
=
spParameters;
2605
}
2606
2607
return
CloneParameters(cachedParameters);
2608
}
2609
2610
#endregion
Parameter Discovery Functions
2611
2612
}
2613
}
2614