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