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 F.Studio.Data.Util 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 /// <summary> 2610 /// 清空缓存参数 2611 /// </summary> 2612 public static void ClearCache() 2613 { 2614 paramCache.Clear(); 2615 } 2616 #endregion Parameter Discovery Functions 2617 2618 } 2619 }