微软原版SQLHelper类
SQLHelper类:
代码
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
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