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