码迷,mamicode.com
首页 > 数据库 > 详细

SQLHelper

时间:2016-05-09 20:17:39      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:

   1 using System;
   2 
   3 using System.Data;
   4 
   5 using System.Xml;
   6 
   7 using System.Data.SqlClient;
   8 
   9 using System.Collections;
  10 
  11 namespace DRPHelper.Chu
  12 {
  13 
  14     /// <summary>
  15 
  16     /// SqlServer数据访问帮助类
  17 
  18     /// </summary>
  19 
  20     public sealed class SqlHelper
  21     {
  22 
  23         public static SqlConnection connection = new SqlConnection("SERVER=1.1.1.1,21433;DATABASE=Test;PWD=1;UID=sa;");
  24         #region 私有构造函数和方法
  25 
  26         private SqlHelper()
  27         {
  28 
  29         }
  30 
  31         /// <summary>
  32 
  33         /// 将SqlParameter参数数组(参数值)分配给SqlCommand命令.
  34 
  35         /// 这个方法将给任何一个参数分配DBNull.Value;
  36 
  37         /// 该操作将阻止默认值的使用.
  38 
  39         /// </summary>
  40 
  41         /// <param>命令名</param>
  42 
  43         /// <param>SqlParameters数组</param>
  44 
  45         private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
  46         {
  47 
  48             if (command == null) throw new ArgumentNullException("command");
  49 
  50             if (commandParameters != null)
  51             {
  52 
  53                 foreach (SqlParameter p in commandParameters)
  54                 {
  55 
  56                     if (p != null)
  57                     {
  58 
  59                         // 检查未分配值的输出参数,将其分配以DBNull.Value.
  60 
  61                         if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) &&
  62 
  63                             (p.Value == null))
  64                         {
  65 
  66                             p.Value = DBNull.Value;
  67 
  68                         }
  69 
  70                         command.Parameters.Add(p);
  71 
  72                     }
  73 
  74                 }
  75 
  76             }
  77 
  78         }
  79 
  80 
  81 
  82         /// <summary>
  83 
  84         /// 将DataRow类型的列值分配到SqlParameter参数数组.
  85 
  86         /// </summary>
  87 
  88         /// <param>要分配值的SqlParameter参数数组</param>
  89 
  90         /// <param>将要分配给存储过程参数的DataRow</param>
  91 
  92         private static void AssignParameterValues(SqlParameter[] commandParameters, DataRow dataRow)
  93         {
  94 
  95             if ((commandParameters == null) || (dataRow == null))
  96             {
  97 
  98                 return;
  99 
 100             }
 101 
 102             int i = 0;
 103 
 104             // 设置参数值
 105 
 106             foreach (SqlParameter commandParameter in commandParameters)
 107             {
 108 
 109                 // 创建参数名称,如果不存在,只抛出一个异常.
 110 
 111                 if (commandParameter.ParameterName == null ||
 112 
 113                     commandParameter.ParameterName.Length <= 1)
 114 
 115                     throw new Exception(
 116 
 117                         string.Format("请提供参数{0}一个有效的名称{1}.", i, commandParameter.ParameterName));
 118 
 119                 // 从dataRow的表中获取为参数数组中数组名称的列的索引.
 120 
 121                 // 如果存在和参数名称相同的列,则将列值赋给当前名称的参数.
 122 
 123                 if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1)
 124 
 125                     commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
 126 
 127                 i++;
 128 
 129             }
 130 
 131         }
 132 
 133 
 134 
 135         /// <summary>
 136 
 137         /// 将一个对象数组分配给SqlParameter参数数组.
 138 
 139         /// </summary>
 140 
 141         /// <param>要分配值的SqlParameter参数数组</param>
 142 
 143         /// <param>将要分配给存储过程参数的对象数组</param>
 144 
 145         private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
 146         {
 147 
 148             if ((commandParameters == null) || (parameterValues == null))
 149             {
 150 
 151                 return;
 152 
 153             }
 154 
 155             // 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常.
 156 
 157             if (commandParameters.Length != parameterValues.Length)
 158             {
 159 
 160                 throw new ArgumentException("参数值个数与参数不匹配.");
 161 
 162             }
 163 
 164             // 给参数赋值
 165 
 166             for (int i = 0, j = commandParameters.Length; i < j; i++)
 167             {
 168 
 169                 // If the current array value derives from IDbDataParameter, then assign its Value property
 170 
 171                 if (parameterValues[i] is IDbDataParameter)
 172                 {
 173 
 174                     IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i];
 175 
 176                     if (paramInstance.Value == null)
 177                     {
 178 
 179                         commandParameters[i].Value = DBNull.Value;
 180 
 181                     }
 182 
 183                     else
 184                     {
 185 
 186                         commandParameters[i].Value = paramInstance.Value;
 187 
 188                     }
 189 
 190                 }
 191 
 192                 else if (parameterValues[i] == null)
 193                 {
 194 
 195                     commandParameters[i].Value = DBNull.Value;
 196 
 197                 }
 198 
 199                 else
 200                 {
 201 
 202                     commandParameters[i].Value = parameterValues[i];
 203 
 204                 }
 205 
 206             }
 207 
 208         }
 209 
 210 
 211 
 212         /// <summary>
 213 
 214         /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数
 215 
 216         /// </summary>
 217 
 218         /// <param>要处理的SqlCommand</param>
 219 
 220         /// <param>数据库连接</param>
 221 
 222         /// <param>一个有效的事务或者是null值</param>
 223 
 224         /// <param>命令类型 (存储过程,命令文本, 其它.)</param>
 225 
 226         /// <param>存储过程名或都T-SQL命令文本</param>
 227 
 228         /// <param>和命令相关联的SqlParameter参数数组,如果没有参数为‘null‘</param>
 229 
 230         /// <param><c>true</c> 如果连接是打开的,则为true,其它情况下为false.</param>
 231 
 232         private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, out bool mustCloseConnection)
 233         {
 234 
 235             if (command == null) throw new ArgumentNullException("command");
 236 
 237             if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
 238 
 239             // If the provided connection is not open, we will open it
 240 
 241             if (connection.State != ConnectionState.Open)
 242             {
 243 
 244                 mustCloseConnection = true;
 245 
 246                 connection.Open();
 247 
 248             }
 249 
 250             else
 251             {
 252 
 253                 mustCloseConnection = false;
 254 
 255             }
 256 
 257             // 给命令分配一个数据库连接.
 258 
 259             command.Connection = connection;
 260 
 261             // 设置命令文本(存储过程名或SQL语句)
 262 
 263             command.CommandText = commandText;
 264 
 265             // 分配事务
 266 
 267             if (transaction != null)
 268             {
 269 
 270                 if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
 271 
 272                 command.Transaction = transaction;
 273 
 274             }
 275 
 276             // 设置命令类型.
 277 
 278             command.CommandType = commandType;
 279 
 280             // 分配命令参数
 281 
 282             if (commandParameters != null)
 283             {
 284 
 285                 AttachParameters(command, commandParameters);
 286 
 287             }
 288 
 289             return;
 290 
 291         }
 292 
 293         #endregion 私有构造函数和方法结束
 294 
 295 
 296 
 297         #region ExecuteNonQuery命令
 298 
 299         /// <summary>
 300 
 301         /// 执行指定连接字符串,类型的SqlCommand.
 302 
 303         /// </summary>
 304 
 305         /// <remarks>
 306 
 307         /// 示例:  
 308 
 309         ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
 310 
 311         /// </remarks>
 312 
 313         /// <param>一个有效的数据库连接字符串</param>
 314 
 315         /// <param>命令类型 (存储过程,命令文本, 其它.)</param>
 316 
 317         /// <param>存储过程名称或SQL语句</param>
 318 
 319         /// <returns>返回命令影响的行数</returns>
 320 
 321         public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText)
 322         {
 323 
 324             return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null);
 325 
 326         }
 327 
 328 
 329 
 330         /// <summary>
 331 
 332         /// 执行指定连接字符串,类型的SqlCommand.如果没有提供参数,不返回结果.
 333 
 334         /// </summary>
 335 
 336         /// <remarks>
 337 
 338         /// 示例:  
 339 
 340         ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
 341 
 342         /// </remarks>
 343 
 344         /// <param>一个有效的数据库连接字符串</param>
 345 
 346         /// <param>命令类型 (存储过程,命令文本, 其它.)</param>
 347 
 348         /// <param>存储过程名称或SQL语句</param>
 349 
 350         /// <param>SqlParameter参数数组</param>
 351 
 352         /// <returns>返回命令影响的行数</returns>
 353 
 354         public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
 355         {
 356 
 357             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
 358 
 359             using (SqlConnection connection = new SqlConnection(connectionString))
 360             {
 361 
 362                 connection.Open();
 363 
 364                 return ExecuteNonQuery(connection, commandType, commandText, commandParameters);
 365 
 366             }
 367 
 368         }
 369 
 370 
 371 
 372         /// <summary>
 373 
 374         /// 执行指定连接字符串的存储过程,将对象数组的值赋给存储过程参数,
 375 
 376         /// 此方法需要在参数缓存方法中探索参数并生成参数.
 377 
 378         /// </summary>
 379 
 380         /// <remarks>
 381 
 382         /// 这个方法没有提供访问输出参数和返回值.
 383 
 384         /// 示例:  
 385 
 386         ///  int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
 387 
 388         /// </remarks>
 389 
 390         /// <param>一个有效的数据库连接字符串/param>
 391 
 392         /// <param>存储过程名称</param>
 393 
 394         /// <param>分配到存储过程输入参数的对象数组</param>
 395 
 396         /// <returns>返回受影响的行数</returns>
 397 
 398         public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
 399         {
 400 
 401             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
 402 
 403             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
 404 
 405             // 如果存在参数值
 406 
 407             if ((parameterValues != null) && (parameterValues.Length > 0))
 408             {
 409 
 410                 // 从探索存储过程参数(加载到缓存)并分配给存储过程参数数组.
 411 
 412                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
 413 
 414                 // 给存储过程参数赋值
 415 
 416                 AssignParameterValues(commandParameters, parameterValues);
 417 
 418                 return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
 419 
 420             }
 421 
 422             else
 423             {
 424 
 425                 // 没有参数情况下
 426 
 427                 return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
 428 
 429             }
 430 
 431         }
 432 
 433 
 434 
 435         /// <summary>
 436 
 437         /// 执行指定数据库连接对象的命令 
 438 
 439         /// </summary>
 440 
 441         /// <remarks>
 442 
 443         /// 示例:  
 444 
 445         ///  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
 446 
 447         /// </remarks>
 448 
 449         /// <param>一个有效的数据库连接对象</param>
 450 
 451         /// <param>命令类型(存储过程,命令文本或其它.)</param>
 452 
 453         /// <param>存储过程名称或T-SQL语句</param>
 454 
 455         /// <returns>返回影响的行数</returns>
 456 
 457         public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText)
 458         {
 459 
 460             return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null);
 461 
 462         }
 463 
 464 
 465 
 466         /// <summary>
 467 
 468         /// 执行指定数据库连接对象的命令
 469 
 470         /// </summary>
 471 
 472         /// <remarks>
 473 
 474         /// 示例:  
 475 
 476         ///  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
 477 
 478         /// </remarks>
 479 
 480         /// <param>一个有效的数据库连接对象</param>
 481 
 482         /// <param>命令类型(存储过程,命令文本或其它.)</param>
 483 
 484         /// <param>T存储过程名称或T-SQL语句</param>
 485 
 486         /// <param>SqlParamter参数数组</param>
 487 
 488         /// <returns>返回影响的行数</returns>
 489 
 490         public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
 491         {
 492 
 493             if (connection == null) throw new ArgumentNullException("connection");
 494 
 495             // 创建SqlCommand命令,并进行预处理
 496 
 497             SqlCommand cmd = new SqlCommand();
 498 
 499             bool mustCloseConnection = false;
 500 
 501             PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
 502 
 503 
 504 
 505             // Finally, execute the command
 506 
 507             int retval = cmd.ExecuteNonQuery();
 508 
 509 
 510 
 511             // 清除参数,以便再次使用.
 512 
 513             cmd.Parameters.Clear();
 514 
 515             if (mustCloseConnection)
 516 
 517                 connection.Close();
 518 
 519             return retval;
 520 
 521         }
 522 
 523 
 524 
 525         /// <summary>
 526 
 527         /// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数.
 528 
 529         /// </summary>
 530 
 531         /// <remarks>
 532 
 533         /// 此方法不提供访问存储过程输出参数和返回值
 534 
 535         /// 示例:  
 536 
 537         ///  int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);
 538 
 539         /// </remarks>
 540 
 541         /// <param>一个有效的数据库连接对象</param>
 542 
 543         /// <param>存储过程名</param>
 544 
 545         /// <param>分配给存储过程输入参数的对象数组</param>
 546 
 547         /// <returns>返回影响的行数</returns>
 548 
 549         public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues)
 550         {
 551 
 552             if (connection == null) throw new ArgumentNullException("connection");
 553 
 554             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
 555 
 556             // 如果有参数值
 557 
 558             if ((parameterValues != null) && (parameterValues.Length > 0))
 559             {
 560 
 561                 // 从缓存中加载存储过程参数
 562 
 563                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
 564 
 565                 // 给存储过程分配参数值
 566 
 567                 AssignParameterValues(commandParameters, parameterValues);
 568 
 569                 return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
 570 
 571             }
 572 
 573             else
 574             {
 575 
 576                 return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
 577 
 578             }
 579 
 580         }
 581 
 582 
 583 
 584         /// <summary>
 585 
 586         /// 执行带事务的SqlCommand.
 587 
 588         /// </summary>
 589 
 590         /// <remarks>
 591 
 592         /// 示例.:  
 593 
 594         ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");
 595 
 596         /// </remarks>
 597 
 598         /// <param>一个有效的数据库连接对象</param>
 599 
 600         /// <param>命令类型(存储过程,命令文本或其它.)</param>
 601 
 602         /// <param>存储过程名称或T-SQL语句</param>
 603 
 604         /// <returns>返回影响的行数/returns>
 605 
 606         public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText)
 607         {
 608 
 609             return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null);
 610 
 611         }
 612 
 613 
 614 
 615         /// <summary>
 616 
 617         /// 执行带事务的SqlCommand(指定参数).
 618 
 619         /// </summary>
 620 
 621         /// <remarks>
 622 
 623         /// 示例:  
 624 
 625         ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
 626 
 627         /// </remarks>
 628 
 629         /// <param>一个有效的数据库连接对象</param>
 630 
 631         /// <param>命令类型(存储过程,命令文本或其它.)</param>
 632 
 633         /// <param>存储过程名称或T-SQL语句</param>
 634 
 635         /// <param>SqlParamter参数数组</param>
 636 
 637         /// <returns>返回影响的行数</returns>
 638 
 639         public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
 640         {
 641 
 642             if (transaction == null) throw new ArgumentNullException("transaction");
 643 
 644             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
 645 
 646             // 预处理
 647 
 648             SqlCommand cmd = new SqlCommand();
 649 
 650             bool mustCloseConnection = false;
 651 
 652             PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
 653 
 654 
 655 
 656             // 执行
 657 
 658             int retval = cmd.ExecuteNonQuery();
 659 
 660 
 661 
 662             // 清除参数集,以便再次使用.
 663 
 664             cmd.Parameters.Clear();
 665 
 666             return retval;
 667 
 668         }
 669 
 670 
 671 
 672         /// <summary>
 673 
 674         /// 执行带事务的SqlCommand(指定参数值).
 675 
 676         /// </summary>
 677 
 678         /// <remarks>
 679 
 680         /// 此方法不提供访问存储过程输出参数和返回值
 681 
 682         /// 示例:  
 683 
 684         ///  int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);
 685 
 686         /// </remarks>
 687 
 688         /// <param>一个有效的数据库连接对象</param>
 689 
 690         /// <param>存储过程名</param>
 691 
 692         /// <param>分配给存储过程输入参数的对象数组</param>
 693 
 694         /// <returns>返回受影响的行数</returns>
 695 
 696         public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues)
 697         {
 698 
 699             if (transaction == null) throw new ArgumentNullException("transaction");
 700 
 701             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
 702 
 703             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
 704 
 705             // 如果有参数值
 706 
 707             if ((parameterValues != null) && (parameterValues.Length > 0))
 708             {
 709 
 710                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
 711 
 712                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
 713 
 714                 // 给存储过程参数赋值
 715 
 716                 AssignParameterValues(commandParameters, parameterValues);
 717 
 718                 // 调用重载方法
 719 
 720                 return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
 721 
 722             }
 723 
 724             else
 725             {
 726 
 727                 // 没有参数值
 728 
 729                 return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
 730 
 731             }
 732 
 733         }
 734 
 735         #endregion ExecuteNonQuery方法结束
 736 
 737 
 738 
 739         #region ExecuteDataset方法
 740 
 741         /// <summary>
 742 
 743         /// 执行指定数据库连接字符串的命令,返回DataSet.
 744 
 745         /// </summary>
 746 
 747         /// <remarks>
 748 
 749         /// 示例:  
 750 
 751         ///  DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders");
 752 
 753         /// </remarks>
 754 
 755         /// <param>一个有效的数据库连接字符串</param>
 756 
 757         /// <param>命令类型 (存储过程,命令文本或其它)</param>
 758 
 759         /// <param>存储过程名称或T-SQL语句</param>
 760 
 761         /// <returns>返回一个包含结果集的DataSet</returns>
 762 
 763         public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText)
 764         {
 765 
 766             return ExecuteDataset(connectionString, commandType, commandText, (SqlParameter[])null);
 767 
 768         }
 769 
 770 
 771 
 772         /// <summary>
 773 
 774         /// 执行指定数据库连接字符串的命令,返回DataSet.
 775 
 776         /// </summary>
 777 
 778         /// <remarks>
 779 
 780         /// 示例: 
 781 
 782         ///  DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
 783 
 784         /// </remarks>
 785 
 786         /// <param>一个有效的数据库连接字符串</param>
 787 
 788         /// <param>命令类型 (存储过程,命令文本或其它)</param>
 789 
 790         /// <param>存储过程名称或T-SQL语句</param>
 791 
 792         /// <param>SqlParamters参数数组</param>
 793 
 794         /// <returns>返回一个包含结果集的DataSet</returns>
 795 
 796         public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
 797         {
 798 
 799             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
 800 
 801             // 创建并打开数据库连接对象,操作完成释放对象.
 802 
 803             using (SqlConnection connection = new SqlConnection(connectionString))
 804             {
 805 
 806                 connection.Open();
 807 
 808                 // 调用指定数据库连接字符串重载方法.
 809 
 810                 return ExecuteDataset(connection, commandType, commandText, commandParameters);
 811 
 812             }
 813 
 814         }
 815 
 816 
 817 
 818         /// <summary>
 819 
 820         /// 执行指定数据库连接字符串的命令,直接提供参数值,返回DataSet.
 821 
 822         /// </summary>
 823 
 824         /// <remarks>
 825 
 826         /// 此方法不提供访问存储过程输出参数和返回值.
 827 
 828         /// 示例: 
 829 
 830         ///  DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36);
 831 
 832         /// </remarks>
 833 
 834         /// <param>一个有效的数据库连接字符串</param>
 835 
 836         /// <param>存储过程名</param>
 837 
 838         /// <param>分配给存储过程输入参数的对象数组</param>
 839 
 840         /// <returns>返回一个包含结果集的DataSet</returns>
 841 
 842         public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues)
 843         {
 844 
 845             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
 846 
 847             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
 848 
 849 
 850 
 851             if ((parameterValues != null) && (parameterValues.Length > 0))
 852             {
 853 
 854                 // 从缓存中检索存储过程参数
 855 
 856                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
 857 
 858                 // 给存储过程参数分配值
 859 
 860                 AssignParameterValues(commandParameters, parameterValues);
 861 
 862                 return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);
 863 
 864             }
 865 
 866             else
 867             {
 868 
 869                 return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);
 870 
 871             }
 872 
 873         }
 874 
 875 
 876 
 877         /// <summary>
 878 
 879         /// 执行指定数据库连接对象的命令,返回DataSet.
 880 
 881         /// </summary>
 882 
 883         /// <remarks>
 884 
 885         /// 示例:  
 886 
 887         ///  DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders");
 888 
 889         /// </remarks>
 890 
 891         /// <param>一个有效的数据库连接对象</param>
 892 
 893         /// <param>命令类型 (存储过程,命令文本或其它)</param>
 894 
 895         /// <param>存储过程名或T-SQL语句</param>
 896 
 897         /// <returns>返回一个包含结果集的DataSet</returns>
 898 
 899         public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText)
 900         {
 901 
 902             return ExecuteDataset(connection, commandType, commandText, (SqlParameter[])null);
 903 
 904         }
 905 
 906 
 907 
 908         /// <summary>
 909 
 910         /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet.
 911 
 912         /// </summary>
 913 
 914         /// <remarks>
 915 
 916         /// 示例:  
 917 
 918         ///  DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
 919 
 920         /// </remarks>
 921 
 922         /// <param>一个有效的数据库连接对象</param>
 923 
 924         /// <param>命令类型 (存储过程,命令文本或其它)</param>
 925 
 926         /// <param>存储过程名或T-SQL语句</param>
 927 
 928         /// <param>SqlParamter参数数组</param>
 929 
 930         /// <returns>返回一个包含结果集的DataSet</returns>
 931 
 932         public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
 933         {
 934 
 935             if (connection == null) throw new ArgumentNullException("connection");
 936 
 937             // 预处理
 938 
 939             SqlCommand cmd = new SqlCommand();
 940 
 941             bool mustCloseConnection = false;
 942 
 943             PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
 944 
 945 
 946 
 947             // 创建SqlDataAdapter和DataSet.
 948 
 949             using (SqlDataAdapter da = new SqlDataAdapter(cmd))
 950             {
 951 
 952                 DataSet ds = new DataSet();
 953 
 954                 // 填充DataSet.
 955 
 956                 da.Fill(ds);
 957 
 958 
 959 
 960                 cmd.Parameters.Clear();
 961 
 962                 if (mustCloseConnection)
 963 
 964                     connection.Close();
 965 
 966                 return ds;
 967 
 968             }
 969 
 970         }
 971 
 972 
 973 
 974         /// <summary>
 975 
 976         /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet.
 977 
 978         /// </summary>
 979 
 980         /// <remarks>
 981 
 982         /// 此方法不提供访问存储过程输入参数和返回值.
 983 
 984         /// 示例.:  
 985 
 986         ///  DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);
 987 
 988         /// </remarks>
 989 
 990         /// <param>一个有效的数据库连接对象</param>
 991 
 992         /// <param>存储过程名</param>
 993 
 994         /// <param>分配给存储过程输入参数的对象数组</param>
 995 
 996         /// <returns>返回一个包含结果集的DataSet</returns>
 997 
 998         public static DataSet ExecuteDataset(SqlConnection connection, string spName, params object[] parameterValues)
 999         {
1000 
1001             if (connection == null) throw new ArgumentNullException("connection");
1002 
1003             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1004 
1005             if ((parameterValues != null) && (parameterValues.Length > 0))
1006             {
1007 
1008                 // 比缓存中加载存储过程参数
1009 
1010                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1011 
1012                 // 给存储过程参数分配值
1013 
1014                 AssignParameterValues(commandParameters, parameterValues);
1015 
1016                 return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);
1017 
1018             }
1019 
1020             else
1021             {
1022 
1023                 return ExecuteDataset(connection, CommandType.StoredProcedure, spName);
1024 
1025             }
1026 
1027         }
1028 
1029 
1030 
1031         /// <summary>
1032 
1033         /// 执行指定事务的命令,返回DataSet.
1034 
1035         /// </summary>
1036 
1037         /// <remarks>
1038 
1039         /// 示例:  
1040 
1041         ///  DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders");
1042 
1043         /// </remarks>
1044 
1045         /// <param>事务</param>
1046 
1047         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1048 
1049         /// <param>存储过程名或T-SQL语句</param>
1050 
1051         /// <returns>返回一个包含结果集的DataSet</returns>
1052 
1053         public static DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType, string commandText)
1054         {
1055 
1056             return ExecuteDataset(transaction, commandType, commandText, (SqlParameter[])null);
1057 
1058         }
1059 
1060 
1061 
1062         /// <summary>
1063 
1064         /// 执行指定事务的命令,指定参数,返回DataSet.
1065 
1066         /// </summary>
1067 
1068         /// <remarks>
1069 
1070         /// 示例:  
1071 
1072         ///  DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1073 
1074         /// </remarks>
1075 
1076         /// <param>事务</param>
1077 
1078         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1079 
1080         /// <param>存储过程名或T-SQL语句</param>
1081 
1082         /// <param>SqlParamter参数数组</param>
1083 
1084         /// <returns>返回一个包含结果集的DataSet</returns>
1085 
1086         public static DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1087         {
1088 
1089             if (transaction == null) throw new ArgumentNullException("transaction");
1090 
1091             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
1092 
1093             // 预处理
1094 
1095             SqlCommand cmd = new SqlCommand();
1096 
1097             bool mustCloseConnection = false;
1098 
1099             PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
1100 
1101 
1102 
1103             // 创建 DataAdapter & DataSet
1104 
1105             using (SqlDataAdapter da = new SqlDataAdapter(cmd))
1106             {
1107 
1108                 DataSet ds = new DataSet();
1109 
1110                 da.Fill(ds);
1111 
1112                 cmd.Parameters.Clear();
1113 
1114                 return ds;
1115 
1116             }
1117 
1118         }
1119 
1120 
1121 
1122         /// <summary>
1123 
1124         /// 执行指定事务的命令,指定参数值,返回DataSet.
1125 
1126         /// </summary>
1127 
1128         /// <remarks>
1129 
1130         /// 此方法不提供访问存储过程输入参数和返回值.
1131 
1132         /// 示例.:  
1133 
1134         ///  DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36);
1135 
1136         /// </remarks>
1137 
1138         /// <param>事务</param>
1139 
1140         /// <param>存储过程名</param>
1141 
1142         /// <param>分配给存储过程输入参数的对象数组</param>
1143 
1144         /// <returns>返回一个包含结果集的DataSet</returns>
1145 
1146         public static DataSet ExecuteDataset(SqlTransaction transaction, string spName, params object[] parameterValues)
1147         {
1148 
1149             if (transaction == null) throw new ArgumentNullException("transaction");
1150 
1151             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
1152 
1153             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1154 
1155 
1156 
1157             if ((parameterValues != null) && (parameterValues.Length > 0))
1158             {
1159 
1160                 // 从缓存中加载存储过程参数
1161 
1162                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
1163 
1164                 // 给存储过程参数分配值
1165 
1166                 AssignParameterValues(commandParameters, parameterValues);
1167 
1168                 return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);
1169 
1170             }
1171 
1172             else
1173             {
1174 
1175                 return ExecuteDataset(transaction, CommandType.StoredProcedure, spName);
1176 
1177             }
1178 
1179         }
1180 
1181         #endregion ExecuteDataset数据集命令结束
1182 
1183 
1184 
1185         #region ExecuteReader 数据阅读器
1186 
1187         /// <summary>
1188 
1189         /// 枚举,标识数据库连接是由SqlHelper提供还是由调用者提供
1190 
1191         /// </summary>
1192 
1193         private enum SqlConnectionOwnership
1194         {
1195 
1196             /// <summary>由SqlHelper提供连接</summary>
1197 
1198             Internal,
1199 
1200             /// <summary>由调用者提供连接</summary>
1201 
1202             External
1203 
1204         }
1205 
1206 
1207 
1208         /// <summary>
1209 
1210         /// 执行指定数据库连接对象的数据阅读器.
1211 
1212         /// </summary>
1213 
1214         /// <remarks>
1215 
1216         /// 如果是SqlHelper打开连接,当连接关闭DataReader也将关闭.
1217 
1218         /// 如果是调用都打开连接,DataReader由调用都管理.
1219 
1220         /// </remarks>
1221 
1222         /// <param>一个有效的数据库连接对象</param>
1223 
1224         /// <param>一个有效的事务,或者为 ‘null‘</param>
1225 
1226         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1227 
1228         /// <param>存储过程名或T-SQL语句</param>
1229 
1230         /// <param>SqlParameters参数数组,如果没有参数则为‘null‘</param>
1231 
1232         /// <param>标识数据库连接对象是由调用者提供还是由SqlHelper提供</param>
1233 
1234         /// <returns>返回包含结果集的SqlDataReader</returns>
1235 
1236         private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership)
1237         {
1238 
1239             if (connection == null) throw new ArgumentNullException("connection");
1240 
1241             bool mustCloseConnection = false;
1242 
1243             // 创建命令
1244 
1245             SqlCommand cmd = new SqlCommand();
1246 
1247             try
1248             {
1249 
1250                 PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
1251 
1252 
1253 
1254                 // 创建数据阅读器
1255 
1256                 SqlDataReader dataReader;
1257 
1258                 if (connectionOwnership == SqlConnectionOwnership.External)
1259                 {
1260 
1261                     dataReader = cmd.ExecuteReader();
1262 
1263                 }
1264 
1265                 else
1266                 {
1267 
1268                     dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
1269 
1270                 }
1271 
1272 
1273 
1274                 // 清除参数,以便再次使用..
1275 
1276                 // HACK: There is a problem here, the output parameter values are fletched 
1277 
1278                 // when the reader is closed, so if the parameters are detached from the command
1279 
1280                 // then the SqlReader can磘 set its values. 
1281 
1282                 // When this happen, the parameters can磘 be used again in other command.
1283 
1284                 bool canClear = true;
1285 
1286                 foreach (SqlParameter commandParameter in cmd.Parameters)
1287                 {
1288 
1289                     if (commandParameter.Direction != ParameterDirection.Input)
1290 
1291                         canClear = false;
1292 
1293                 }
1294 
1295 
1296 
1297                 if (canClear)
1298                 {
1299 
1300                     cmd.Parameters.Clear();
1301 
1302                 }
1303 
1304                 return dataReader;
1305 
1306             }
1307 
1308             catch
1309             {
1310 
1311                 if (mustCloseConnection)
1312 
1313                     connection.Close();
1314 
1315                 throw;
1316 
1317             }
1318 
1319         }
1320 
1321 
1322 
1323         /// <summary>
1324 
1325         /// 执行指定数据库连接字符串的数据阅读器.
1326 
1327         /// </summary>
1328 
1329         /// <remarks>
1330 
1331         /// 示例:  
1332 
1333         ///  SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders");
1334 
1335         /// </remarks>
1336 
1337         /// <param>一个有效的数据库连接字符串</param>
1338 
1339         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1340 
1341         /// <param>存储过程名或T-SQL语句</param>
1342 
1343         /// <returns>返回包含结果集的SqlDataReader</returns>
1344 
1345         public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText)
1346         {
1347 
1348             return ExecuteReader(connectionString, commandType, commandText, (SqlParameter[])null);
1349 
1350         }
1351 
1352 
1353 
1354         /// <summary>
1355 
1356         /// 执行指定数据库连接字符串的数据阅读器,指定参数.
1357 
1358         /// </summary>
1359 
1360         /// <remarks>
1361 
1362         /// 示例:  
1363 
1364         ///  SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1365 
1366         /// </remarks>
1367 
1368         /// <param>一个有效的数据库连接字符串</param>
1369 
1370         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1371 
1372         /// <param>存储过程名或T-SQL语句</param>
1373 
1374         /// <param>SqlParamter参数数组(new SqlParameter("@prodid", 24))</param>
1375 
1376         /// <returns>返回包含结果集的SqlDataReader</returns>
1377 
1378         public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1379         {
1380 
1381             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
1382 
1383             SqlConnection connection = null;
1384 
1385             try
1386             {
1387 
1388                 connection = new SqlConnection(connectionString);
1389 
1390                 connection.Open();
1391 
1392                 return ExecuteReader(connection, null, commandType, commandText, commandParameters, SqlConnectionOwnership.Internal);
1393 
1394             }
1395 
1396             catch
1397             {
1398 
1399                 // If we fail to return the SqlDatReader, we need to close the connection ourselves
1400 
1401                 if (connection != null) connection.Close();
1402 
1403                 throw;
1404 
1405             }
1406 
1407 
1408 
1409         }
1410 
1411 
1412 
1413         /// <summary>
1414 
1415         /// 执行指定数据库连接字符串的数据阅读器,指定参数值.
1416 
1417         /// </summary>
1418 
1419         /// <remarks>
1420 
1421         /// 此方法不提供访问存储过程输出参数和返回值参数.
1422 
1423         /// 示例:  
1424 
1425         ///  SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36);
1426 
1427         /// </remarks>
1428 
1429         /// <param>一个有效的数据库连接字符串</param>
1430 
1431         /// <param>存储过程名</param>
1432 
1433         /// <param>分配给存储过程输入参数的对象数组</param>
1434 
1435         /// <returns>返回包含结果集的SqlDataReader</returns>
1436 
1437         public static SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues)
1438         {
1439 
1440             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
1441 
1442             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1443 
1444 
1445 
1446             if ((parameterValues != null) && (parameterValues.Length > 0))
1447             {
1448 
1449                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
1450 
1451                 AssignParameterValues(commandParameters, parameterValues);
1452 
1453                 return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);
1454 
1455             }
1456 
1457             else
1458             {
1459 
1460                 return ExecuteReader(connectionString, CommandType.StoredProcedure, spName);
1461 
1462             }
1463 
1464         }
1465 
1466 
1467 
1468         /// <summary>
1469 
1470         /// 执行指定数据库连接对象的数据阅读器.
1471 
1472         /// </summary>
1473 
1474         /// <remarks>
1475 
1476         /// 示例:  
1477 
1478         ///  SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders");
1479 
1480         /// </remarks>
1481 
1482         /// <param>一个有效的数据库连接对象</param>
1483 
1484         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1485 
1486         /// <param>存储过程名或T-SQL语句</param>
1487 
1488         /// <returns>返回包含结果集的SqlDataReader</returns>
1489 
1490         public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText)
1491         {
1492 
1493             return ExecuteReader(connection, commandType, commandText, (SqlParameter[])null);
1494 
1495         }
1496 
1497 
1498 
1499         /// <summary>
1500 
1501         /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数.
1502 
1503         /// </summary>
1504 
1505         /// <remarks>
1506 
1507         /// 示例:  
1508 
1509         ///  SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1510 
1511         /// </remarks>
1512 
1513         /// <param>一个有效的数据库连接对象</param>
1514 
1515         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1516 
1517         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1518 
1519         /// <param>SqlParamter参数数组</param>
1520 
1521         /// <returns>返回包含结果集的SqlDataReader</returns>
1522 
1523         public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1524         {
1525 
1526             return ExecuteReader(connection, (SqlTransaction)null, commandType, commandText, commandParameters, SqlConnectionOwnership.External);
1527 
1528         }
1529 
1530 
1531 
1532         /// <summary>
1533 
1534         /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值.
1535 
1536         /// </summary>
1537 
1538         /// <remarks>
1539 
1540         /// 此方法不提供访问存储过程输出参数和返回值参数.
1541 
1542         /// 示例:  
1543 
1544         ///  SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36);
1545 
1546         /// </remarks>
1547 
1548         /// <param>一个有效的数据库连接对象</param>
1549 
1550         /// <param>T存储过程名</param>
1551 
1552         /// <param>分配给存储过程输入参数的对象数组</param>
1553 
1554         /// <returns>返回包含结果集的SqlDataReader</returns>
1555 
1556         public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, params object[] parameterValues)
1557         {
1558 
1559             if (connection == null) throw new ArgumentNullException("connection");
1560 
1561             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1562 
1563             if ((parameterValues != null) && (parameterValues.Length > 0))
1564             {
1565 
1566                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1567 
1568                 AssignParameterValues(commandParameters, parameterValues);
1569 
1570                 return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);
1571 
1572             }
1573 
1574             else
1575             {
1576 
1577                 return ExecuteReader(connection, CommandType.StoredProcedure, spName);
1578 
1579             }
1580 
1581         }
1582 
1583 
1584 
1585         /// <summary>
1586 
1587         /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值.
1588 
1589         /// </summary>
1590 
1591         /// <remarks>
1592 
1593         /// 示例:  
1594 
1595         ///  SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders");
1596 
1597         /// </remarks>
1598 
1599         /// <param>一个有效的连接事务</param>
1600 
1601         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1602 
1603         /// <param>存储过程名称或T-SQL语句</param>
1604 
1605         /// <returns>返回包含结果集的SqlDataReader</returns>
1606 
1607         public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText)
1608         {
1609 
1610             return ExecuteReader(transaction, commandType, commandText, (SqlParameter[])null);
1611 
1612         }
1613 
1614 
1615 
1616         /// <summary>
1617 
1618         /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数.
1619 
1620         /// </summary>
1621 
1622         /// <remarks>
1623 
1624         /// 示例:  
1625 
1626         ///   SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
1627 
1628         /// </remarks>
1629 
1630         /// <param>一个有效的连接事务</param>
1631 
1632         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1633 
1634         /// <param>存储过程名称或T-SQL语句</param>
1635 
1636         /// <param>分配给命令的SqlParamter参数数组</param>
1637 
1638         /// <returns>返回包含结果集的SqlDataReader</returns>
1639 
1640         public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1641         {
1642 
1643             if (transaction == null) throw new ArgumentNullException("transaction");
1644 
1645             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
1646 
1647             return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External);
1648 
1649         }
1650 
1651 
1652 
1653         /// <summary>
1654 
1655         /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值.
1656 
1657         /// </summary>
1658 
1659         /// <remarks>
1660 
1661         /// 此方法不提供访问存储过程输出参数和返回值参数.
1662 
1663         /// 
1664 
1665         /// 示例:  
1666 
1667         ///  SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36);
1668 
1669         /// </remarks>
1670 
1671         /// <param>一个有效的连接事务</param>
1672 
1673         /// <param>存储过程名称</param>
1674 
1675         /// <param>分配给存储过程输入参数的对象数组</param>
1676 
1677         /// <returns>返回包含结果集的SqlDataReader</returns>
1678 
1679         public static SqlDataReader ExecuteReader(SqlTransaction transaction, string spName, params object[] parameterValues)
1680         {
1681 
1682             if (transaction == null) throw new ArgumentNullException("transaction");
1683 
1684             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
1685 
1686             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1687 
1688             // 如果有参数值
1689 
1690             if ((parameterValues != null) && (parameterValues.Length > 0))
1691             {
1692 
1693                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
1694 
1695                 AssignParameterValues(commandParameters, parameterValues);
1696 
1697                 return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
1698 
1699             }
1700 
1701             else
1702             {
1703 
1704                 // 没有参数值
1705 
1706                 return ExecuteReader(transaction, CommandType.StoredProcedure, spName);
1707 
1708             }
1709 
1710         }
1711 
1712         #endregion ExecuteReader数据阅读器
1713 
1714 
1715 
1716         #region ExecuteScalar 返回结果集中的第一行第一列
1717 
1718         /// <summary>
1719 
1720         /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列.
1721 
1722         /// </summary>
1723 
1724         /// <remarks>
1725 
1726         /// 示例:  
1727 
1728         ///  int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount");
1729 
1730         /// </remarks>
1731 
1732         /// <param>一个有效的数据库连接字符串</param>
1733 
1734         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1735 
1736         /// <param>存储过程名称或T-SQL语句</param>
1737 
1738         /// <returns>返回结果集中的第一行第一列</returns>
1739 
1740         public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText)
1741         {
1742 
1743             // 执行参数为空的方法
1744 
1745             return ExecuteScalar(connectionString, commandType, commandText, (SqlParameter[])null);
1746 
1747         }
1748 
1749 
1750 
1751         /// <summary>
1752 
1753         /// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列.
1754 
1755         /// </summary>
1756 
1757         /// <remarks>
1758 
1759         /// 示例:  
1760 
1761         ///  int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
1762 
1763         /// </remarks>
1764 
1765         /// <param>一个有效的数据库连接字符串</param>
1766 
1767         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1768 
1769         /// <param>存储过程名称或T-SQL语句</param>
1770 
1771         /// <param>分配给命令的SqlParamter参数数组</param>
1772 
1773         /// <returns>返回结果集中的第一行第一列</returns>
1774 
1775         public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1776         {
1777 
1778             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
1779 
1780             // 创建并打开数据库连接对象,操作完成释放对象.
1781 
1782             using (SqlConnection connection = new SqlConnection(connectionString))
1783             {
1784 
1785                 connection.Open();
1786 
1787                 // 调用指定数据库连接字符串重载方法.
1788 
1789                 return ExecuteScalar(connection, commandType, commandText, commandParameters);
1790 
1791             }
1792 
1793         }
1794 
1795 
1796 
1797         /// <summary>
1798 
1799         /// 执行指定数据库连接字符串的命令,指定参数值,返回结果集中的第一行第一列.
1800 
1801         /// </summary>
1802 
1803         /// <remarks>
1804 
1805         /// 此方法不提供访问存储过程输出参数和返回值参数.
1806 
1807         /// 
1808 
1809         /// 示例:  
1810 
1811         ///  int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36);
1812 
1813         /// </remarks>
1814 
1815         /// <param>一个有效的数据库连接字符串</param>
1816 
1817         /// <param>存储过程名称</param>
1818 
1819         /// <param>分配给存储过程输入参数的对象数组</param>
1820 
1821         /// <returns>返回结果集中的第一行第一列</returns>
1822 
1823         public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues)
1824         {
1825 
1826             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
1827 
1828             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1829 
1830 
1831 
1832             // 如果有参数值
1833 
1834             if ((parameterValues != null) && (parameterValues.Length > 0))
1835             {
1836 
1837                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
1838 
1839                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
1840 
1841                 // 给存储过程参数赋值
1842 
1843                 AssignParameterValues(commandParameters, parameterValues);
1844 
1845                 // 调用重载方法
1846 
1847                 return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);
1848 
1849             }
1850 
1851             else
1852             {
1853 
1854                 // 没有参数值
1855 
1856                 return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);
1857 
1858             }
1859 
1860         }
1861 
1862 
1863 
1864         /// <summary>
1865 
1866         /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列.
1867 
1868         /// </summary>
1869 
1870         /// <remarks>
1871 
1872         /// 示例:  
1873 
1874         ///  int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount");
1875 
1876         /// </remarks>
1877 
1878         /// <param>一个有效的数据库连接对象</param>
1879 
1880         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1881 
1882         /// <param>存储过程名称或T-SQL语句</param>
1883 
1884         /// <returns>返回结果集中的第一行第一列</returns>
1885 
1886         public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText)
1887         {
1888 
1889             // 执行参数为空的方法
1890 
1891             return ExecuteScalar(connection, commandType, commandText, (SqlParameter[])null);
1892 
1893         }
1894 
1895 
1896 
1897         /// <summary>
1898 
1899         /// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列.
1900 
1901         /// </summary>
1902 
1903         /// <remarks>
1904 
1905         /// 示例:  
1906 
1907         ///  int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
1908 
1909         /// </remarks>
1910 
1911         /// <param>一个有效的数据库连接对象</param>
1912 
1913         /// <param>命令类型 (存储过程,命令文本或其它)</param>
1914 
1915         /// <param>存储过程名称或T-SQL语句</param>
1916 
1917         /// <param>分配给命令的SqlParamter参数数组</param>
1918 
1919         /// <returns>返回结果集中的第一行第一列</returns>
1920 
1921         public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
1922         {
1923 
1924             if (connection == null) throw new ArgumentNullException("connection");
1925 
1926             // 创建SqlCommand命令,并进行预处理
1927 
1928             SqlCommand cmd = new SqlCommand();
1929 
1930             bool mustCloseConnection = false;
1931 
1932             PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
1933 
1934 
1935 
1936             // 执行SqlCommand命令,并返回结果.
1937 
1938             object retval = cmd.ExecuteScalar();
1939 
1940 
1941 
1942             // 清除参数,以便再次使用.
1943 
1944             cmd.Parameters.Clear();
1945 
1946             if (mustCloseConnection)
1947 
1948                 connection.Close();
1949 
1950             return retval;
1951 
1952         }
1953 
1954 
1955 
1956         /// <summary>
1957 
1958         /// 执行指定数据库连接对象的命令,指定参数值,返回结果集中的第一行第一列.
1959 
1960         /// </summary>
1961 
1962         /// <remarks>
1963 
1964         /// 此方法不提供访问存储过程输出参数和返回值参数.
1965 
1966         /// 
1967 
1968         /// 示例:  
1969 
1970         ///  int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36);
1971 
1972         /// </remarks>
1973 
1974         /// <param>一个有效的数据库连接对象</param>
1975 
1976         /// <param>存储过程名称</param>
1977 
1978         /// <param>分配给存储过程输入参数的对象数组</param>
1979 
1980         /// <returns>返回结果集中的第一行第一列</returns>
1981 
1982         public static object ExecuteScalar(SqlConnection connection, string spName, params object[] parameterValues)
1983         {
1984 
1985             if (connection == null) throw new ArgumentNullException("connection");
1986 
1987             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
1988 
1989             // 如果有参数值
1990 
1991             if ((parameterValues != null) && (parameterValues.Length > 0))
1992             {
1993 
1994                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
1995 
1996                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
1997 
1998                 // 给存储过程参数赋值
1999 
2000                 AssignParameterValues(commandParameters, parameterValues);
2001 
2002                 // 调用重载方法
2003 
2004                 return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);
2005 
2006             }
2007 
2008             else
2009             {
2010 
2011                 // 没有参数值
2012 
2013                 return ExecuteScalar(connection, CommandType.StoredProcedure, spName);
2014 
2015             }
2016 
2017         }
2018 
2019 
2020 
2021         /// <summary>
2022 
2023         /// 执行指定数据库事务的命令,返回结果集中的第一行第一列.
2024 
2025         /// </summary>
2026 
2027         /// <remarks>
2028 
2029         /// 示例:  
2030 
2031         ///  int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount");
2032 
2033         /// </remarks>
2034 
2035         /// <param>一个有效的连接事务</param>
2036 
2037         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2038 
2039         /// <param>存储过程名称或T-SQL语句</param>
2040 
2041         /// <returns>返回结果集中的第一行第一列</returns>
2042 
2043         public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText)
2044         {
2045 
2046             // 执行参数为空的方法
2047 
2048             return ExecuteScalar(transaction, commandType, commandText, (SqlParameter[])null);
2049 
2050         }
2051 
2052 
2053 
2054         /// <summary>
2055 
2056         /// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列.
2057 
2058         /// </summary>
2059 
2060         /// <remarks>
2061 
2062         /// 示例:  
2063 
2064         ///  int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
2065 
2066         /// </remarks>
2067 
2068         /// <param>一个有效的连接事务</param>
2069 
2070         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2071 
2072         /// <param>存储过程名称或T-SQL语句</param>
2073 
2074         /// <param>分配给命令的SqlParamter参数数组</param>
2075 
2076         /// <returns>返回结果集中的第一行第一列</returns>
2077 
2078         public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
2079         {
2080 
2081             if (transaction == null) throw new ArgumentNullException("transaction");
2082 
2083             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
2084 
2085             // 创建SqlCommand命令,并进行预处理
2086 
2087             SqlCommand cmd = new SqlCommand();
2088 
2089             bool mustCloseConnection = false;
2090 
2091             PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
2092 
2093 
2094 
2095             // 执行SqlCommand命令,并返回结果.
2096 
2097             object retval = cmd.ExecuteScalar();
2098 
2099 
2100 
2101             // 清除参数,以便再次使用.
2102 
2103             cmd.Parameters.Clear();
2104 
2105             return retval;
2106 
2107         }
2108 
2109 
2110 
2111         /// <summary>
2112 
2113         /// 执行指定数据库事务的命令,指定参数值,返回结果集中的第一行第一列.
2114 
2115         /// </summary>
2116 
2117         /// <remarks>
2118 
2119         /// 此方法不提供访问存储过程输出参数和返回值参数.
2120 
2121         /// 
2122 
2123         /// 示例:  
2124 
2125         ///  int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36);
2126 
2127         /// </remarks>
2128 
2129         /// <param>一个有效的连接事务</param>
2130 
2131         /// <param>存储过程名称</param>
2132 
2133         /// <param>分配给存储过程输入参数的对象数组</param>
2134 
2135         /// <returns>返回结果集中的第一行第一列</returns>
2136 
2137         public static object ExecuteScalar(SqlTransaction transaction, string spName, params object[] parameterValues)
2138         {
2139 
2140             if (transaction == null) throw new ArgumentNullException("transaction");
2141 
2142             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
2143 
2144             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
2145 
2146             // 如果有参数值
2147 
2148             if ((parameterValues != null) && (parameterValues.Length > 0))
2149             {
2150 
2151                 // PPull the parameters for this stored procedure from the parameter cache ()
2152 
2153                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2154 
2155                 // 给存储过程参数赋值
2156 
2157                 AssignParameterValues(commandParameters, parameterValues);
2158 
2159                 // 调用重载方法
2160 
2161                 return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);
2162 
2163             }
2164 
2165             else
2166             {
2167 
2168                 // 没有参数值
2169 
2170                 return ExecuteScalar(transaction, CommandType.StoredProcedure, spName);
2171 
2172             }
2173 
2174         }
2175 
2176         #endregion ExecuteScalar
2177 
2178 
2179 
2180         #region ExecuteXmlReader XML阅读器
2181 
2182         /// <summary>
2183 
2184         /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回.
2185 
2186         /// </summary>
2187 
2188         /// <remarks>
2189 
2190         /// 示例:  
2191 
2192         ///  XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders");
2193 
2194         /// </remarks>
2195 
2196         /// <param>一个有效的数据库连接对象</param>
2197 
2198         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2199 
2200         /// <param>存储过程名称或T-SQL语句 using "FOR XML AUTO"</param>
2201 
2202         /// <returns>返回XmlReader结果集对象.</returns>
2203 
2204         public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText)
2205         {
2206 
2207             // 执行参数为空的方法
2208 
2209             return ExecuteXmlReader(connection, commandType, commandText, (SqlParameter[])null);
2210 
2211         }
2212 
2213 
2214 
2215         /// <summary>
2216 
2217         /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数.
2218 
2219         /// </summary>
2220 
2221         /// <remarks>
2222 
2223         /// 示例:  
2224 
2225         ///  XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
2226 
2227         /// </remarks>
2228 
2229         /// <param>一个有效的数据库连接对象</param>
2230 
2231         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2232 
2233         /// <param>存储过程名称或T-SQL语句 using "FOR XML AUTO"</param>
2234 
2235         /// <param>分配给命令的SqlParamter参数数组</param>
2236 
2237         /// <returns>返回XmlReader结果集对象.</returns>
2238 
2239         public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
2240         {
2241 
2242             if (connection == null) throw new ArgumentNullException("connection");
2243 
2244             bool mustCloseConnection = false;
2245 
2246             // 创建SqlCommand命令,并进行预处理
2247 
2248             SqlCommand cmd = new SqlCommand();
2249 
2250             try
2251             {
2252 
2253                 PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
2254 
2255 
2256 
2257                 // 执行命令
2258 
2259                 XmlReader retval = cmd.ExecuteXmlReader();
2260 
2261 
2262 
2263                 // 清除参数,以便再次使用.
2264 
2265                 cmd.Parameters.Clear();
2266 
2267                 return retval;
2268 
2269             }
2270 
2271             catch
2272             {
2273 
2274                 if (mustCloseConnection)
2275 
2276                     connection.Close();
2277 
2278                 throw;
2279 
2280             }
2281 
2282         }
2283 
2284 
2285 
2286         /// <summary>
2287 
2288         /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值.
2289 
2290         /// </summary>
2291 
2292         /// <remarks>
2293 
2294         /// 此方法不提供访问存储过程输出参数和返回值参数.
2295 
2296         /// 
2297 
2298         /// 示例:  
2299 
2300         ///  XmlReader r = ExecuteXmlReader(conn, "GetOrders", 24, 36);
2301 
2302         /// </remarks>
2303 
2304         /// <param>一个有效的数据库连接对象</param>
2305 
2306         /// <param>存储过程名称 using "FOR XML AUTO"</param>
2307 
2308         /// <param>分配给存储过程输入参数的对象数组</param>
2309 
2310         /// <returns>返回XmlReader结果集对象.</returns>
2311 
2312         public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues)
2313         {
2314 
2315             if (connection == null) throw new ArgumentNullException("connection");
2316 
2317             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
2318 
2319             // 如果有参数值
2320 
2321             if ((parameterValues != null) && (parameterValues.Length > 0))
2322             {
2323 
2324                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
2325 
2326                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
2327 
2328                 // 给存储过程参数赋值
2329 
2330                 AssignParameterValues(commandParameters, parameterValues);
2331 
2332                 // 调用重载方法
2333 
2334                 return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);
2335 
2336             }
2337 
2338             else
2339             {
2340 
2341                 // 没有参数值
2342 
2343                 return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);
2344 
2345             }
2346 
2347         }
2348 
2349 
2350 
2351         /// <summary>
2352 
2353         /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回.
2354 
2355         /// </summary>
2356 
2357         /// <remarks>
2358 
2359         /// 示例:  
2360 
2361         ///  XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders");
2362 
2363         /// </remarks>
2364 
2365         /// <param>一个有效的连接事务</param>
2366 
2367         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2368 
2369         /// <param>存储过程名称或T-SQL语句 using "FOR XML AUTO"</param>
2370 
2371         /// <returns>返回XmlReader结果集对象.</returns>
2372 
2373         public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText)
2374         {
2375 
2376             // 执行参数为空的方法
2377 
2378             return ExecuteXmlReader(transaction, commandType, commandText, (SqlParameter[])null);
2379 
2380         }
2381 
2382 
2383 
2384         /// <summary>
2385 
2386         /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数.
2387 
2388         /// </summary>
2389 
2390         /// <remarks>
2391 
2392         /// 示例:  
2393 
2394         ///  XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
2395 
2396         /// </remarks>
2397 
2398         /// <param>一个有效的连接事务</param>
2399 
2400         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2401 
2402         /// <param>存储过程名称或T-SQL语句 using "FOR XML AUTO"</param>
2403 
2404         /// <param>分配给命令的SqlParamter参数数组</param>
2405 
2406         /// <returns>返回XmlReader结果集对象.</returns>
2407 
2408         public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
2409         {
2410 
2411             if (transaction == null) throw new ArgumentNullException("transaction");
2412 
2413             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
2414 
2415             // 创建SqlCommand命令,并进行预处理
2416 
2417             SqlCommand cmd = new SqlCommand();
2418 
2419             bool mustCloseConnection = false;
2420 
2421             PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
2422 
2423 
2424 
2425             // 执行命令
2426 
2427             XmlReader retval = cmd.ExecuteXmlReader();
2428 
2429 
2430 
2431             // 清除参数,以便再次使用.
2432 
2433             cmd.Parameters.Clear();
2434 
2435             return retval;
2436 
2437         }
2438 
2439 
2440 
2441         /// <summary>
2442 
2443         /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值.
2444 
2445         /// </summary>
2446 
2447         /// <remarks>
2448 
2449         /// 此方法不提供访问存储过程输出参数和返回值参数.
2450 
2451         /// 
2452 
2453         /// 示例:  
2454 
2455         ///  XmlReader r = ExecuteXmlReader(trans, "GetOrders", 24, 36);
2456 
2457         /// </remarks>
2458 
2459         /// <param>一个有效的连接事务</param>
2460 
2461         /// <param>存储过程名称</param>
2462 
2463         /// <param>分配给存储过程输入参数的对象数组</param>
2464 
2465         /// <returns>返回一个包含结果集的DataSet.</returns>
2466 
2467         public static XmlReader ExecuteXmlReader(SqlTransaction transaction, string spName, params object[] parameterValues)
2468         {
2469 
2470             if (transaction == null) throw new ArgumentNullException("transaction");
2471 
2472             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
2473 
2474             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
2475 
2476             // 如果有参数值
2477 
2478             if ((parameterValues != null) && (parameterValues.Length > 0))
2479             {
2480 
2481                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
2482 
2483                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2484 
2485                 // 给存储过程参数赋值
2486 
2487                 AssignParameterValues(commandParameters, parameterValues);
2488 
2489                 // 调用重载方法
2490 
2491                 return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
2492 
2493             }
2494 
2495             else
2496             {
2497 
2498                 // 没有参数值
2499 
2500                 return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName);
2501 
2502             }
2503 
2504         }
2505 
2506         #endregion ExecuteXmlReader 阅读器结束
2507 
2508 
2509 
2510         #region FillDataset 填充数据集
2511 
2512         /// <summary>
2513 
2514         /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.
2515 
2516         /// </summary>
2517 
2518         /// <remarks>
2519 
2520         /// 示例:  
2521 
2522         ///  FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
2523 
2524         /// </remarks>
2525 
2526         /// <param>一个有效的数据库连接字符串</param>
2527 
2528         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2529 
2530         /// <param>存储过程名称或T-SQL语句</param>
2531 
2532         /// <param>要填充结果集的DataSet实例</param>
2533 
2534         /// <param>表映射的数据表数组
2535 
2536         /// 用户定义的表名 (可有是实际的表名.)</param>
2537 
2538         public static void FillDataset(string connectionString, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames)
2539         {
2540 
2541             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
2542 
2543             if (dataSet == null) throw new ArgumentNullException("dataSet");
2544 
2545 
2546 
2547             // 创建并打开数据库连接对象,操作完成释放对象.
2548 
2549             using (SqlConnection connection = new SqlConnection(connectionString))
2550             {
2551 
2552                 connection.Open();
2553 
2554                 // 调用指定数据库连接字符串重载方法.
2555 
2556                 FillDataset(connection, commandType, commandText, dataSet, tableNames);
2557 
2558             }
2559 
2560         }
2561 
2562 
2563 
2564         /// <summary>
2565 
2566         /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数.
2567 
2568         /// </summary>
2569 
2570         /// <remarks>
2571 
2572         /// 示例:  
2573 
2574         ///  FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
2575 
2576         /// </remarks>
2577 
2578         /// <param>一个有效的数据库连接字符串</param>
2579 
2580         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2581 
2582         /// <param>存储过程名称或T-SQL语句</param>
2583 
2584         /// <param>分配给命令的SqlParamter参数数组</param>
2585 
2586         /// <param>要填充结果集的DataSet实例</param>
2587 
2588         /// <param>表映射的数据表数组
2589 
2590         /// 用户定义的表名 (可有是实际的表名.)
2591 
2592         /// </param>
2593 
2594         public static void FillDataset(string connectionString, CommandType commandType,
2595 
2596             string commandText, DataSet dataSet, string[] tableNames,
2597 
2598             params SqlParameter[] commandParameters)
2599         {
2600 
2601             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
2602 
2603             if (dataSet == null) throw new ArgumentNullException("dataSet");
2604 
2605             // 创建并打开数据库连接对象,操作完成释放对象.
2606 
2607             using (SqlConnection connection = new SqlConnection(connectionString))
2608             {
2609 
2610                 connection.Open();
2611 
2612                 // 调用指定数据库连接字符串重载方法.
2613 
2614                 FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters);
2615 
2616             }
2617 
2618         }
2619 
2620 
2621 
2622         /// <summary>
2623 
2624         /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集,指定存储过程参数值.
2625 
2626         /// </summary>
2627 
2628         /// <remarks>
2629 
2630         /// 此方法不提供访问存储过程输出参数和返回值参数.
2631 
2632         /// 
2633 
2634         /// 示例:  
2635 
2636         ///  FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24);
2637 
2638         /// </remarks>
2639 
2640         /// <param>一个有效的数据库连接字符串</param>
2641 
2642         /// <param>存储过程名称</param>
2643 
2644         /// <param>要填充结果集的DataSet实例</param>
2645 
2646         /// <param>表映射的数据表数组
2647 
2648         /// 用户定义的表名 (可有是实际的表名.)
2649 
2650         /// </param>    
2651 
2652         /// <param>分配给存储过程输入参数的对象数组</param>
2653 
2654         public static void FillDataset(string connectionString, string spName,
2655 
2656             DataSet dataSet, string[] tableNames,
2657 
2658             params object[] parameterValues)
2659         {
2660 
2661             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
2662 
2663             if (dataSet == null) throw new ArgumentNullException("dataSet");
2664 
2665             // 创建并打开数据库连接对象,操作完成释放对象.
2666 
2667             using (SqlConnection connection = new SqlConnection(connectionString))
2668             {
2669 
2670                 connection.Open();
2671 
2672                 // 调用指定数据库连接字符串重载方法.
2673 
2674                 FillDataset(connection, spName, dataSet, tableNames, parameterValues);
2675 
2676             }
2677 
2678         }
2679 
2680 
2681 
2682         /// <summary>
2683 
2684         /// 执行指定数据库连接对象的命令,映射数据表并填充数据集.
2685 
2686         /// </summary>
2687 
2688         /// <remarks>
2689 
2690         /// 示例:  
2691 
2692         ///  FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
2693 
2694         /// </remarks>
2695 
2696         /// <param>一个有效的数据库连接对象</param>
2697 
2698         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2699 
2700         /// <param>存储过程名称或T-SQL语句</param>
2701 
2702         /// <param>要填充结果集的DataSet实例</param>
2703 
2704         /// <param>表映射的数据表数组
2705 
2706         /// 用户定义的表名 (可有是实际的表名.)
2707 
2708         /// </param>    
2709 
2710         public static void FillDataset(SqlConnection connection, CommandType commandType,
2711 
2712             string commandText, DataSet dataSet, string[] tableNames)
2713         {
2714 
2715             FillDataset(connection, commandType, commandText, dataSet, tableNames, null);
2716 
2717         }
2718 
2719 
2720 
2721         /// <summary>
2722 
2723         /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定参数.
2724 
2725         /// </summary>
2726 
2727         /// <remarks>
2728 
2729         /// 示例:  
2730 
2731         ///  FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
2732 
2733         /// </remarks>
2734 
2735         /// <param>一个有效的数据库连接对象</param>
2736 
2737         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2738 
2739         /// <param>存储过程名称或T-SQL语句</param>
2740 
2741         /// <param>要填充结果集的DataSet实例</param>
2742 
2743         /// <param>表映射的数据表数组
2744 
2745         /// 用户定义的表名 (可有是实际的表名.)
2746 
2747         /// </param>
2748 
2749         /// <param>分配给命令的SqlParamter参数数组</param>
2750 
2751         public static void FillDataset(SqlConnection connection, CommandType commandType,
2752 
2753             string commandText, DataSet dataSet, string[] tableNames,
2754 
2755             params SqlParameter[] commandParameters)
2756         {
2757 
2758             FillDataset(connection, null, commandType, commandText, dataSet, tableNames, commandParameters);
2759 
2760         }
2761 
2762 
2763 
2764         /// <summary>
2765 
2766         /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定存储过程参数值.
2767 
2768         /// </summary>
2769 
2770         /// <remarks>
2771 
2772         /// 此方法不提供访问存储过程输出参数和返回值参数.
2773 
2774         /// 
2775 
2776         /// 示例:  
2777 
2778         ///  FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36);
2779 
2780         /// </remarks>
2781 
2782         /// <param>一个有效的数据库连接对象</param>
2783 
2784         /// <param>存储过程名称</param>
2785 
2786         /// <param>要填充结果集的DataSet实例</param>
2787 
2788         /// <param>表映射的数据表数组
2789 
2790         /// 用户定义的表名 (可有是实际的表名.)
2791 
2792         /// </param>
2793 
2794         /// <param>分配给存储过程输入参数的对象数组</param>
2795 
2796         public static void FillDataset(SqlConnection connection, string spName,
2797 
2798             DataSet dataSet, string[] tableNames,
2799 
2800             params object[] parameterValues)
2801         {
2802 
2803             if (connection == null) throw new ArgumentNullException("connection");
2804 
2805             if (dataSet == null) throw new ArgumentNullException("dataSet");
2806 
2807             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
2808 
2809             // 如果有参数值
2810 
2811             if ((parameterValues != null) && (parameterValues.Length > 0))
2812             {
2813 
2814                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
2815 
2816                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
2817 
2818                 // 给存储过程参数赋值
2819 
2820                 AssignParameterValues(commandParameters, parameterValues);
2821 
2822                 // 调用重载方法
2823 
2824                 FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);
2825 
2826             }
2827 
2828             else
2829             {
2830 
2831                 // 没有参数值
2832 
2833                 FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames);
2834 
2835             }
2836 
2837         }
2838 
2839 
2840 
2841         /// <summary>
2842 
2843         /// 执行指定数据库事务的命令,映射数据表并填充数据集.
2844 
2845         /// </summary>
2846 
2847         /// <remarks>
2848 
2849         /// 示例:  
2850 
2851         ///  FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
2852 
2853         /// </remarks>
2854 
2855         /// <param>一个有效的连接事务</param>
2856 
2857         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2858 
2859         /// <param>存储过程名称或T-SQL语句</param>
2860 
2861         /// <param>要填充结果集的DataSet实例</param>
2862 
2863         /// <param>表映射的数据表数组
2864 
2865         /// 用户定义的表名 (可有是实际的表名.)
2866 
2867         /// </param>
2868 
2869         public static void FillDataset(SqlTransaction transaction, CommandType commandType,
2870 
2871             string commandText,
2872 
2873             DataSet dataSet, string[] tableNames)
2874         {
2875 
2876             FillDataset(transaction, commandType, commandText, dataSet, tableNames, null);
2877 
2878         }
2879 
2880 
2881 
2882         /// <summary>
2883 
2884         /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定参数.
2885 
2886         /// </summary>
2887 
2888         /// <remarks>
2889 
2890         /// 示例:  
2891 
2892         ///  FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
2893 
2894         /// </remarks>
2895 
2896         /// <param>一个有效的连接事务</param>
2897 
2898         /// <param>命令类型 (存储过程,命令文本或其它)</param>
2899 
2900         /// <param>存储过程名称或T-SQL语句</param>
2901 
2902         /// <param>要填充结果集的DataSet实例</param>
2903 
2904         /// <param>表映射的数据表数组
2905 
2906         /// 用户定义的表名 (可有是实际的表名.)
2907 
2908         /// </param>
2909 
2910         /// <param>分配给命令的SqlParamter参数数组</param>
2911 
2912         public static void FillDataset(SqlTransaction transaction, CommandType commandType,
2913 
2914             string commandText, DataSet dataSet, string[] tableNames,
2915 
2916             params SqlParameter[] commandParameters)
2917         {
2918 
2919             FillDataset(transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters);
2920 
2921         }
2922 
2923 
2924 
2925         /// <summary>
2926 
2927         /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定存储过程参数值.
2928 
2929         /// </summary>
2930 
2931         /// <remarks>
2932 
2933         /// 此方法不提供访问存储过程输出参数和返回值参数.
2934 
2935         /// 
2936 
2937         /// 示例:  
2938 
2939         ///  FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36);
2940 
2941         /// </remarks>
2942 
2943         /// <param>一个有效的连接事务</param>
2944 
2945         /// <param>存储过程名称</param>
2946 
2947         /// <param>要填充结果集的DataSet实例</param>
2948 
2949         /// <param>表映射的数据表数组
2950 
2951         /// 用户定义的表名 (可有是实际的表名.)
2952 
2953         /// </param>
2954 
2955         /// <param>分配给存储过程输入参数的对象数组</param>
2956 
2957         public static void FillDataset(SqlTransaction transaction, string spName,
2958 
2959             DataSet dataSet, string[] tableNames,
2960 
2961             params object[] parameterValues)
2962         {
2963 
2964             if (transaction == null) throw new ArgumentNullException("transaction");
2965 
2966             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
2967 
2968             if (dataSet == null) throw new ArgumentNullException("dataSet");
2969 
2970             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
2971 
2972             // 如果有参数值
2973 
2974             if ((parameterValues != null) && (parameterValues.Length > 0))
2975             {
2976 
2977                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
2978 
2979                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
2980 
2981                 // 给存储过程参数赋值
2982 
2983                 AssignParameterValues(commandParameters, parameterValues);
2984 
2985                 // 调用重载方法
2986 
2987                 FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);
2988 
2989             }
2990 
2991             else
2992             {
2993 
2994                 // 没有参数值
2995 
2996                 FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames);
2997 
2998             }
2999 
3000         }
3001 
3002 
3003 
3004         /// <summary>
3005 
3006         /// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,映射数据表并填充数据集,DataSet/TableNames/SqlParameters.
3007 
3008         /// </summary>
3009 
3010         /// <remarks>
3011 
3012         /// 示例:  
3013 
3014         ///  FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));
3015 
3016         /// </remarks>
3017 
3018         /// <param>一个有效的数据库连接对象</param>
3019 
3020         /// <param>一个有效的连接事务</param>
3021 
3022         /// <param>命令类型 (存储过程,命令文本或其它)</param>
3023 
3024         /// <param>存储过程名称或T-SQL语句</param>
3025 
3026         /// <param>要填充结果集的DataSet实例</param>
3027 
3028         /// <param>表映射的数据表数组
3029 
3030         /// 用户定义的表名 (可有是实际的表名.)
3031 
3032         /// </param>
3033 
3034         /// <param>分配给命令的SqlParamter参数数组</param>
3035 
3036         private static void FillDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType,
3037 
3038             string commandText, DataSet dataSet, string[] tableNames,
3039 
3040             params SqlParameter[] commandParameters)
3041         {
3042 
3043             if (connection == null) throw new ArgumentNullException("connection");
3044 
3045             if (dataSet == null) throw new ArgumentNullException("dataSet");
3046 
3047             // 创建SqlCommand命令,并进行预处理
3048 
3049             SqlCommand command = new SqlCommand();
3050 
3051             bool mustCloseConnection = false;
3052 
3053             PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
3054 
3055 
3056 
3057             // 执行命令
3058 
3059             using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
3060             {
3061 
3062 
3063 
3064                 // 追加表映射
3065 
3066                 if (tableNames != null && tableNames.Length > 0)
3067                 {
3068 
3069                     string tableName = "Table";
3070 
3071                     for (int index = 0; index < tableNames.Length; index++)
3072                     {
3073 
3074                         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");
3075 
3076                         dataAdapter.TableMappings.Add(tableName, tableNames[index]);
3077 
3078                         tableName += (index + 1).ToString();
3079 
3080                     }
3081 
3082                 }
3083 
3084 
3085 
3086                 // 填充数据集使用默认表名称
3087 
3088                 dataAdapter.Fill(dataSet);
3089 
3090                 // 清除参数,以便再次使用.
3091 
3092                 command.Parameters.Clear();
3093 
3094             }
3095 
3096             if (mustCloseConnection)
3097 
3098                 connection.Close();
3099 
3100         }
3101 
3102         #endregion
3103 
3104 
3105 
3106         #region UpdateDataset 更新数据集
3107 
3108         /// <summary>
3109 
3110         /// 执行数据集更新到数据库,指定inserted, updated, or deleted命令.
3111 
3112         /// </summary>
3113 
3114         /// <remarks>
3115 
3116         /// 示例:  
3117 
3118         ///  UpdateDataset(conn, insertCommand, deleteCommand, updateCommand, dataSet, "Order");
3119 
3120         /// </remarks>
3121 
3122         /// <param>[追加记录]一个有效的T-SQL语句或存储过程</param>
3123 
3124         /// <param>[删除记录]一个有效的T-SQL语句或存储过程</param>
3125 
3126         /// <param>[更新记录]一个有效的T-SQL语句或存储过程</param>
3127 
3128         /// <param>要更新到数据库的DataSet</param>
3129 
3130         /// <param>要更新到数据库的DataTable</param>
3131 
3132         public static void UpdateDataset(SqlCommand insertCommand, SqlCommand deleteCommand, SqlCommand updateCommand, DataSet dataSet, string tableName)
3133         {
3134 
3135             if (insertCommand == null) throw new ArgumentNullException("insertCommand");
3136 
3137             if (deleteCommand == null) throw new ArgumentNullException("deleteCommand");
3138 
3139             if (updateCommand == null) throw new ArgumentNullException("updateCommand");
3140 
3141             if (tableName == null || tableName.Length == 0) throw new ArgumentNullException("tableName");
3142 
3143             // 创建SqlDataAdapter,当操作完成后释放.
3144 
3145             using (SqlDataAdapter dataAdapter = new SqlDataAdapter())
3146             {
3147 
3148                 // 设置数据适配器命令
3149 
3150                 dataAdapter.UpdateCommand = updateCommand;
3151 
3152                 dataAdapter.InsertCommand = insertCommand;
3153 
3154                 dataAdapter.DeleteCommand = deleteCommand;
3155 
3156                 // 更新数据集改变到数据库
3157 
3158                 dataAdapter.Update(dataSet, tableName);
3159 
3160                 // 提交所有改变到数据集.
3161 
3162                 dataSet.AcceptChanges();
3163 
3164             }
3165 
3166         }
3167 
3168         #endregion
3169 
3170 
3171 
3172         #region CreateCommand 创建一条SqlCommand命令
3173 
3174         /// <summary>
3175 
3176         /// 创建SqlCommand命令,指定数据库连接对象,存储过程名和参数.
3177 
3178         /// </summary>
3179 
3180         /// <remarks>
3181 
3182         /// 示例:  
3183 
3184         ///  SqlCommand command = CreateCommand(conn, "AddCustomer", "CustomerID", "CustomerName");
3185 
3186         /// </remarks>
3187 
3188         /// <param>一个有效的数据库连接对象</param>
3189 
3190         /// <param>存储过程名称</param>
3191 
3192         /// <param>源表的列名称数组</param>
3193 
3194         /// <returns>返回SqlCommand命令</returns>
3195 
3196         public static SqlCommand CreateCommand(SqlConnection connection, string spName, params string[] sourceColumns)
3197         {
3198 
3199             if (connection == null) throw new ArgumentNullException("connection");
3200 
3201             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3202 
3203             // 创建命令
3204 
3205             SqlCommand cmd = new SqlCommand(spName, connection);
3206 
3207             cmd.CommandType = CommandType.StoredProcedure;
3208 
3209             // 如果有参数值
3210 
3211             if ((sourceColumns != null) && (sourceColumns.Length > 0))
3212             {
3213 
3214                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3215 
3216                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
3217 
3218                 // 将源表的列到映射到DataSet命令中.
3219 
3220                 for (int index = 0; index < sourceColumns.Length; index++)
3221 
3222                     commandParameters[index].SourceColumn = sourceColumns[index];
3223 
3224                 // Attach the discovered parameters to the SqlCommand object
3225 
3226                 AttachParameters(cmd, commandParameters);
3227 
3228             }
3229 
3230             return cmd;
3231 
3232         }
3233 
3234         #endregion
3235 
3236 
3237 
3238         #region ExecuteNonQueryTypedParams 类型化参数(DataRow)
3239 
3240         /// <summary>
3241 
3242         /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回受影响的行数.
3243 
3244         /// </summary>
3245 
3246         /// <param>一个有效的数据库连接字符串</param>
3247 
3248         /// <param>存储过程名称</param>
3249 
3250         /// <param>使用DataRow作为参数值</param>
3251 
3252         /// <returns>返回影响的行数</returns>
3253 
3254         public static int ExecuteNonQueryTypedParams(String connectionString, String spName, DataRow dataRow)
3255         {
3256 
3257             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
3258 
3259             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3260 
3261 
3262 
3263             // 如果row有值,存储过程必须初始化.
3264 
3265             if (dataRow != null && dataRow.ItemArray.Length > 0)
3266             {
3267 
3268                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3269 
3270                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
3271 
3272 
3273 
3274                 // 分配参数值
3275 
3276                 AssignParameterValues(commandParameters, dataRow);
3277 
3278 
3279 
3280                 return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
3281 
3282             }
3283 
3284             else
3285             {
3286 
3287                 return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
3288 
3289             }
3290 
3291         }
3292 
3293 
3294 
3295         /// <summary>
3296 
3297         /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回受影响的行数.
3298 
3299         /// </summary>
3300 
3301         /// <param>一个有效的数据库连接对象</param>
3302 
3303         /// <param>存储过程名称</param>
3304 
3305         /// <param>使用DataRow作为参数值</param>
3306 
3307         /// <returns>返回影响的行数</returns>
3308 
3309         public static int ExecuteNonQueryTypedParams(SqlConnection connection, String spName, DataRow dataRow)
3310         {
3311 
3312             if (connection == null) throw new ArgumentNullException("connection");
3313 
3314             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3315 
3316             // 如果row有值,存储过程必须初始化.
3317 
3318             if (dataRow != null && dataRow.ItemArray.Length > 0)
3319             {
3320 
3321                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3322 
3323                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
3324 
3325 
3326 
3327                 // 分配参数值
3328 
3329                 AssignParameterValues(commandParameters, dataRow);
3330 
3331 
3332 
3333                 return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
3334 
3335             }
3336 
3337             else
3338             {
3339 
3340                 return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
3341 
3342             }
3343 
3344         }
3345 
3346 
3347 
3348         /// <summary>
3349 
3350         /// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回受影响的行数.
3351 
3352         /// </summary>
3353 
3354         /// <param>一个有效的连接事务 object</param>
3355 
3356         /// <param>存储过程名称</param>
3357 
3358         /// <param>使用DataRow作为参数值</param>
3359 
3360         /// <returns>返回影响的行数</returns>
3361 
3362         public static int ExecuteNonQueryTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
3363         {
3364 
3365             if (transaction == null) throw new ArgumentNullException("transaction");
3366 
3367             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
3368 
3369             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3370 
3371             // Sf the row has values, the store procedure parameters must be initialized
3372 
3373             if (dataRow != null && dataRow.ItemArray.Length > 0)
3374             {
3375 
3376                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3377 
3378                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
3379 
3380 
3381 
3382                 // 分配参数值
3383 
3384                 AssignParameterValues(commandParameters, dataRow);
3385 
3386 
3387 
3388                 return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
3389 
3390             }
3391 
3392             else
3393             {
3394 
3395                 return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
3396 
3397             }
3398 
3399         }
3400 
3401         #endregion
3402 
3403 
3404 
3405         #region ExecuteDatasetTypedParams 类型化参数(DataRow)
3406 
3407         /// <summary>
3408 
3409         /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataSet.
3410 
3411         /// </summary>
3412 
3413         /// <param>一个有效的数据库连接字符串</param>
3414 
3415         /// <param>存储过程名称</param>
3416 
3417         /// <param>使用DataRow作为参数值</param>
3418 
3419         /// <returns>返回一个包含结果集的DataSet.</returns>
3420 
3421         public static DataSet ExecuteDatasetTypedParams(string connectionString, String spName, DataRow dataRow)
3422         {
3423 
3424             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
3425 
3426             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3427 
3428             //如果row有值,存储过程必须初始化.
3429 
3430             if (dataRow != null && dataRow.ItemArray.Length > 0)
3431             {
3432 
3433                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3434 
3435                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
3436 
3437 
3438 
3439                 // 分配参数值
3440 
3441                 AssignParameterValues(commandParameters, dataRow);
3442 
3443 
3444 
3445                 return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);
3446 
3447             }
3448 
3449             else
3450             {
3451 
3452                 return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);
3453 
3454             }
3455 
3456         }
3457 
3458 
3459 
3460         /// <summary>
3461 
3462         /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataSet.
3463 
3464         /// </summary>
3465 
3466         /// <param>一个有效的数据库连接对象</param>
3467 
3468         /// <param>存储过程名称</param>
3469 
3470         /// <param>使用DataRow作为参数值</param>
3471 
3472         /// <returns>返回一个包含结果集的DataSet.</returns>
3473 
3474         /// 
3475 
3476         public static DataSet ExecuteDatasetTypedParams(SqlConnection connection, String spName, DataRow dataRow)
3477         {
3478 
3479             if (connection == null) throw new ArgumentNullException("connection");
3480 
3481             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3482 
3483             // 如果row有值,存储过程必须初始化.
3484 
3485             if (dataRow != null && dataRow.ItemArray.Length > 0)
3486             {
3487 
3488                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3489 
3490                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
3491 
3492 
3493 
3494                 // 分配参数值
3495 
3496                 AssignParameterValues(commandParameters, dataRow);
3497 
3498 
3499 
3500                 return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);
3501 
3502             }
3503 
3504             else
3505             {
3506 
3507                 return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName);
3508 
3509             }
3510 
3511         }
3512 
3513 
3514 
3515         /// <summary>
3516 
3517         /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回DataSet.
3518 
3519         /// </summary>
3520 
3521         /// <param>一个有效的连接事务 object</param>
3522 
3523         /// <param>存储过程名称</param>
3524 
3525         /// <param>使用DataRow作为参数值</param>
3526 
3527         /// <returns>返回一个包含结果集的DataSet.</returns>
3528 
3529         public static DataSet ExecuteDatasetTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
3530         {
3531 
3532             if (transaction == null) throw new ArgumentNullException("transaction");
3533 
3534             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
3535 
3536             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3537 
3538             // 如果row有值,存储过程必须初始化.
3539 
3540             if (dataRow != null && dataRow.ItemArray.Length > 0)
3541             {
3542 
3543                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3544 
3545                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
3546 
3547 
3548 
3549                 // 分配参数值
3550 
3551                 AssignParameterValues(commandParameters, dataRow);
3552 
3553 
3554 
3555                 return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);
3556 
3557             }
3558 
3559             else
3560             {
3561 
3562                 return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName);
3563 
3564             }
3565 
3566         }
3567 
3568         #endregion
3569 
3570 
3571 
3572         #region ExecuteReaderTypedParams 类型化参数(DataRow)
3573 
3574         /// <summary>
3575 
3576         /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataReader.
3577 
3578         /// </summary>
3579 
3580         /// <param>一个有效的数据库连接字符串</param>
3581 
3582         /// <param>存储过程名称</param>
3583 
3584         /// <param>使用DataRow作为参数值</param>
3585 
3586         /// <returns>返回包含结果集的SqlDataReader</returns>
3587 
3588         public static SqlDataReader ExecuteReaderTypedParams(String connectionString, String spName, DataRow dataRow)
3589         {
3590 
3591             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
3592 
3593             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3594 
3595 
3596 
3597             // 如果row有值,存储过程必须初始化.
3598 
3599             if (dataRow != null && dataRow.ItemArray.Length > 0)
3600             {
3601 
3602                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3603 
3604                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
3605 
3606 
3607 
3608                 // 分配参数值
3609 
3610                 AssignParameterValues(commandParameters, dataRow);
3611 
3612 
3613 
3614                 return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);
3615 
3616             }
3617 
3618             else
3619             {
3620 
3621                 return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName);
3622 
3623             }
3624 
3625         }
3626 
3627 
3628 
3629         /// <summary>
3630 
3631         /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataReader.
3632 
3633         /// </summary>
3634 
3635         /// <param>一个有效的数据库连接对象</param>
3636 
3637         /// <param>存储过程名称</param>
3638 
3639         /// <param>使用DataRow作为参数值</param>
3640 
3641         /// <returns>返回包含结果集的SqlDataReader</returns>
3642 
3643         public static SqlDataReader ExecuteReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow)
3644         {
3645 
3646             if (connection == null) throw new ArgumentNullException("connection");
3647 
3648             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3649 
3650             // 如果row有值,存储过程必须初始化.
3651 
3652             if (dataRow != null && dataRow.ItemArray.Length > 0)
3653             {
3654 
3655                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3656 
3657                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
3658 
3659 
3660 
3661                 // 分配参数值
3662 
3663                 AssignParameterValues(commandParameters, dataRow);
3664 
3665 
3666 
3667                 return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);
3668 
3669             }
3670 
3671             else
3672             {
3673 
3674                 return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName);
3675 
3676             }
3677 
3678         }
3679 
3680 
3681 
3682         /// <summary>
3683 
3684         /// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回DataReader.
3685 
3686         /// </summary>
3687 
3688         /// <param>一个有效的连接事务 object</param>
3689 
3690         /// <param>存储过程名称</param>
3691 
3692         /// <param>使用DataRow作为参数值</param>
3693 
3694         /// <returns>返回包含结果集的SqlDataReader</returns>
3695 
3696         public static SqlDataReader ExecuteReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
3697         {
3698 
3699             if (transaction == null) throw new ArgumentNullException("transaction");
3700 
3701             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
3702 
3703             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3704 
3705             // 如果row有值,存储过程必须初始化.
3706 
3707             if (dataRow != null && dataRow.ItemArray.Length > 0)
3708             {
3709 
3710                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3711 
3712                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
3713 
3714 
3715 
3716                 // 分配参数值
3717 
3718                 AssignParameterValues(commandParameters, dataRow);
3719 
3720 
3721 
3722                 return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
3723 
3724             }
3725 
3726             else
3727             {
3728 
3729                 return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName);
3730 
3731             }
3732 
3733         }
3734 
3735         #endregion
3736 
3737 
3738 
3739         #region ExecuteScalarTypedParams 类型化参数(DataRow)
3740 
3741         /// <summary>
3742 
3743         /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列.
3744 
3745         /// </summary>
3746 
3747         /// <param>一个有效的数据库连接字符串</param>
3748 
3749         /// <param>存储过程名称</param>
3750 
3751         /// <param>使用DataRow作为参数值</param>
3752 
3753         /// <returns>返回结果集中的第一行第一列</returns>
3754 
3755         public static object ExecuteScalarTypedParams(String connectionString, String spName, DataRow dataRow)
3756         {
3757 
3758             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
3759 
3760             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3761 
3762 
3763 
3764             // 如果row有值,存储过程必须初始化.
3765 
3766             if (dataRow != null && dataRow.ItemArray.Length > 0)
3767             {
3768 
3769                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3770 
3771                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
3772 
3773 
3774 
3775                 // 分配参数值
3776 
3777                 AssignParameterValues(commandParameters, dataRow);
3778 
3779 
3780 
3781                 return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);
3782 
3783             }
3784 
3785             else
3786             {
3787 
3788                 return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);
3789 
3790             }
3791 
3792         }
3793 
3794 
3795 
3796         /// <summary>
3797 
3798         /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列.
3799 
3800         /// </summary>
3801 
3802         /// <param>一个有效的数据库连接对象</param>
3803 
3804         /// <param>存储过程名称</param>
3805 
3806         /// <param>使用DataRow作为参数值</param>
3807 
3808         /// <returns>返回结果集中的第一行第一列</returns>
3809 
3810         public static object ExecuteScalarTypedParams(SqlConnection connection, String spName, DataRow dataRow)
3811         {
3812 
3813             if (connection == null) throw new ArgumentNullException("connection");
3814 
3815             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3816 
3817             // 如果row有值,存储过程必须初始化.
3818 
3819             if (dataRow != null && dataRow.ItemArray.Length > 0)
3820             {
3821 
3822                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3823 
3824                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
3825 
3826 
3827 
3828                 // 分配参数值
3829 
3830                 AssignParameterValues(commandParameters, dataRow);
3831 
3832 
3833 
3834                 return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);
3835 
3836             }
3837 
3838             else
3839             {
3840 
3841                 return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName);
3842 
3843             }
3844 
3845         }
3846 
3847 
3848 
3849         /// <summary>
3850 
3851         /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列.
3852 
3853         /// </summary>
3854 
3855         /// <param>一个有效的连接事务 object</param>
3856 
3857         /// <param>存储过程名称</param>
3858 
3859         /// <param>使用DataRow作为参数值</param>
3860 
3861         /// <returns>返回结果集中的第一行第一列</returns>
3862 
3863         public static object ExecuteScalarTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
3864         {
3865 
3866             if (transaction == null) throw new ArgumentNullException("transaction");
3867 
3868             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
3869 
3870             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3871 
3872             // 如果row有值,存储过程必须初始化.
3873 
3874             if (dataRow != null && dataRow.ItemArray.Length > 0)
3875             {
3876 
3877                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3878 
3879                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
3880 
3881 
3882 
3883                 // 分配参数值
3884 
3885                 AssignParameterValues(commandParameters, dataRow);
3886 
3887 
3888 
3889                 return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);
3890 
3891             }
3892 
3893             else
3894             {
3895 
3896                 return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName);
3897 
3898             }
3899 
3900         }
3901 
3902         #endregion
3903 
3904 
3905 
3906         #region ExecuteXmlReaderTypedParams 类型化参数(DataRow)
3907 
3908         /// <summary>
3909 
3910         /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集.
3911 
3912         /// </summary>
3913 
3914         /// <param>一个有效的数据库连接对象</param>
3915 
3916         /// <param>存储过程名称</param>
3917 
3918         /// <param>使用DataRow作为参数值</param>
3919 
3920         /// <returns>返回XmlReader结果集对象.</returns>
3921 
3922         public static XmlReader ExecuteXmlReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow)
3923         {
3924 
3925             if (connection == null) throw new ArgumentNullException("connection");
3926 
3927             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3928 
3929             // 如果row有值,存储过程必须初始化.
3930 
3931             if (dataRow != null && dataRow.ItemArray.Length > 0)
3932             {
3933 
3934                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3935 
3936                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
3937 
3938 
3939 
3940                 // 分配参数值
3941 
3942                 AssignParameterValues(commandParameters, dataRow);
3943 
3944 
3945 
3946                 return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);
3947 
3948             }
3949 
3950             else
3951             {
3952 
3953                 return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);
3954 
3955             }
3956 
3957         }
3958 
3959 
3960 
3961         /// <summary>
3962 
3963         /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集.
3964 
3965         /// </summary>
3966 
3967         /// <param>一个有效的连接事务 object</param>
3968 
3969         /// <param>存储过程名称</param>
3970 
3971         /// <param>使用DataRow作为参数值</param>
3972 
3973         /// <returns>返回XmlReader结果集对象.</returns>
3974 
3975         public static XmlReader ExecuteXmlReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow)
3976         {
3977 
3978             if (transaction == null) throw new ArgumentNullException("transaction");
3979 
3980             if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
3981 
3982             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
3983 
3984             // 如果row有值,存储过程必须初始化.
3985 
3986             if (dataRow != null && dataRow.ItemArray.Length > 0)
3987             {
3988 
3989                 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
3990 
3991                 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);
3992 
3993 
3994 
3995                 // 分配参数值
3996 
3997                 AssignParameterValues(commandParameters, dataRow);
3998 
3999 
4000 
4001                 return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters);
4002 
4003             }
4004 
4005             else
4006             {
4007 
4008                 return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName);
4009 
4010             }
4011 
4012         }
4013 
4014         #endregion
4015 
4016     }
4017 
4018 
4019 
4020     /// <summary>
4021 
4022     /// SqlHelperParameterCache提供缓存存储过程参数,并能够在运行时从存储过程中探索参数.
4023 
4024     /// </summary>
4025 
4026     public sealed class SqlHelperParameterCache
4027     {
4028 
4029         #region 私有方法,字段,构造函数
4030 
4031         // 私有构造函数,妨止类被实例化.
4032 
4033         private SqlHelperParameterCache() { }
4034 
4035         // 这个方法要注意
4036 
4037         private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
4038 
4039         /// <summary>
4040 
4041         /// 探索运行时的存储过程,返回SqlParameter参数数组.
4042 
4043         /// 初始化参数值为 DBNull.Value.
4044 
4045         /// </summary>
4046 
4047         /// <param>一个有效的数据库连接</param>
4048 
4049         /// <param>存储过程名称</param>
4050 
4051         /// <param>是否包含返回值参数</param>
4052 
4053         /// <returns>返回SqlParameter参数数组</returns>
4054 
4055         private static SqlParameter[] DiscoverSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter)
4056         {
4057 
4058             if (connection == null) throw new ArgumentNullException("connection");
4059 
4060             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
4061 
4062             SqlCommand cmd = new SqlCommand(spName, connection);
4063 
4064             cmd.CommandType = CommandType.StoredProcedure;
4065 
4066             connection.Open();
4067 
4068             // 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中.
4069 
4070             SqlCommandBuilder.DeriveParameters(cmd);
4071 
4072             connection.Close();
4073 
4074             // 如果不包含返回值参数,将参数集中的每一个参数删除.
4075 
4076             if (!includeReturnValueParameter)
4077             {
4078 
4079                 cmd.Parameters.RemoveAt(0);
4080 
4081             }
4082 
4083 
4084 
4085             // 创建参数数组
4086 
4087             SqlParameter[] discoveredParameters = new SqlParameter[cmd.Parameters.Count];
4088 
4089             // 将cmd的Parameters参数集复制到discoveredParameters数组.
4090 
4091             cmd.Parameters.CopyTo(discoveredParameters, 0);
4092 
4093             // 初始化参数值为 DBNull.Value.
4094 
4095             foreach (SqlParameter discoveredParameter in discoveredParameters)
4096             {
4097 
4098                 discoveredParameter.Value = DBNull.Value;
4099 
4100             }
4101 
4102             return discoveredParameters;
4103 
4104         }
4105 
4106 
4107 
4108         /// <summary>
4109 
4110         /// SqlParameter参数数组的深层拷贝.
4111 
4112         /// </summary>
4113 
4114         /// <param>原始参数数组</param>
4115 
4116         /// <returns>返回一个同样的参数数组</returns>
4117 
4118         private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
4119         {
4120 
4121             SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length];
4122 
4123             for (int i = 0, j = originalParameters.Length; i < j; i++)
4124             {
4125 
4126                 clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone();
4127 
4128             }
4129 
4130             return clonedParameters;
4131 
4132         }
4133 
4134         #endregion 私有方法,字段,构造函数结束
4135 
4136 
4137 
4138         #region 缓存方法
4139 
4140         /// <summary>
4141 
4142         /// 追加参数数组到缓存.
4143 
4144         /// </summary>
4145 
4146         /// <param>一个有效的数据库连接字符串</param>
4147 
4148         /// <param>存储过程名或SQL语句</param>
4149 
4150         /// <param>要缓存的参数数组</param>
4151 
4152         public static void CacheParameterSet(string connectionString, string commandText, params SqlParameter[] commandParameters)
4153         {
4154 
4155             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
4156 
4157             if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
4158 
4159             string hashKey = connectionString + ":" + commandText;
4160 
4161             paramCache[hashKey] = commandParameters;
4162 
4163         }
4164 
4165 
4166 
4167         /// <summary>
4168 
4169         /// 从缓存中获取参数数组.
4170 
4171         /// </summary>
4172 
4173         /// <param>一个有效的数据库连接字符</param>
4174 
4175         /// <param>存储过程名或SQL语句</param>
4176 
4177         /// <returns>参数数组</returns>
4178 
4179         public static SqlParameter[] GetCachedParameterSet(string connectionString, string commandText)
4180         {
4181 
4182             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
4183 
4184             if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
4185 
4186             string hashKey = connectionString + ":" + commandText;
4187 
4188             SqlParameter[] cachedParameters = paramCache[hashKey] as SqlParameter[];
4189 
4190             if (cachedParameters == null)
4191             {
4192 
4193                 return null;
4194 
4195             }
4196 
4197             else
4198             {
4199 
4200                 return CloneParameters(cachedParameters);
4201 
4202             }
4203 
4204         }
4205 
4206         #endregion 缓存方法结束
4207 
4208 
4209 
4210         #region 检索指定的存储过程的参数集
4211 
4212         /// <summary>
4213 
4214         /// 返回指定的存储过程的参数集
4215 
4216         /// </summary>
4217 
4218         /// <remarks>
4219 
4220         /// 这个方法将查询数据库,并将信息存储到缓存.
4221 
4222         /// </remarks>
4223 
4224         /// <param>一个有效的数据库连接字符</param>
4225 
4226         /// <param>存储过程名</param>
4227 
4228         /// <returns>返回SqlParameter参数数组</returns>
4229 
4230         public static SqlParameter[] GetSpParameterSet(string connectionString, string spName)
4231         {
4232 
4233             return GetSpParameterSet(connectionString, spName, false);
4234 
4235         }
4236 
4237 
4238 
4239         /// <summary>
4240 
4241         /// 返回指定的存储过程的参数集
4242 
4243         /// </summary>
4244 
4245         /// <remarks>
4246 
4247         /// 这个方法将查询数据库,并将信息存储到缓存.
4248 
4249         /// </remarks>
4250 
4251         /// <param>一个有效的数据库连接字符.</param>
4252 
4253         /// <param>存储过程名</param>
4254 
4255         /// <param>是否包含返回值参数</param>
4256 
4257         /// <returns>返回SqlParameter参数数组</returns>
4258 
4259         public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
4260         {
4261 
4262             if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
4263 
4264             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
4265 
4266             using (SqlConnection connection = new SqlConnection(connectionString))
4267             {
4268 
4269                 return GetSpParameterSetInternal(connection, spName, includeReturnValueParameter);
4270 
4271             }
4272 
4273         }
4274 
4275 
4276 
4277         /// <summary>
4278 
4279         /// [内部]返回指定的存储过程的参数集(使用连接对象).
4280 
4281         /// </summary>
4282 
4283         /// <remarks>
4284 
4285         /// 这个方法将查询数据库,并将信息存储到缓存.
4286 
4287         /// </remarks>
4288 
4289         /// <param>一个有效的数据库连接字符</param>
4290 
4291         /// <param>存储过程名</param>
4292 
4293         /// <returns>返回SqlParameter参数数组</returns>
4294 
4295         internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName)
4296         {
4297 
4298             return GetSpParameterSet(connection, spName, false);
4299 
4300         }
4301 
4302 
4303 
4304         /// <summary>
4305 
4306         /// [内部]返回指定的存储过程的参数集(使用连接对象)
4307 
4308         /// </summary>
4309 
4310         /// <remarks>
4311 
4312         /// 这个方法将查询数据库,并将信息存储到缓存.
4313 
4314         /// </remarks>
4315 
4316         /// <param>一个有效的数据库连接对象</param>
4317 
4318         /// <param>存储过程名</param>
4319 
4320         /// <param>
4321 
4322         /// 是否包含返回值参数
4323 
4324         /// </param>
4325 
4326         /// <returns>返回SqlParameter参数数组</returns>
4327 
4328         internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter)
4329         {
4330 
4331             if (connection == null) throw new ArgumentNullException("connection");
4332 
4333             using (SqlConnection clonedConnection = (SqlConnection)((ICloneable)connection).Clone())
4334             {
4335 
4336                 return GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter);
4337 
4338             }
4339 
4340         }
4341 
4342 
4343 
4344         /// <summary>
4345 
4346         /// [私有]返回指定的存储过程的参数集(使用连接对象)
4347 
4348         /// </summary>
4349 
4350         /// <param>一个有效的数据库连接对象</param>
4351 
4352         /// <param>存储过程名</param>
4353 
4354         /// <param>是否包含返回值参数</param>
4355 
4356         /// <returns>返回SqlParameter参数数组</returns>
4357 
4358         private static SqlParameter[] GetSpParameterSetInternal(SqlConnection connection, string spName, bool includeReturnValueParameter)
4359         {
4360 
4361             if (connection == null) throw new ArgumentNullException("connection");
4362 
4363             if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
4364 
4365             string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : "");
4366 
4367             SqlParameter[] cachedParameters;
4368 
4369 
4370 
4371             cachedParameters = paramCache[hashKey] as SqlParameter[];
4372 
4373             if (cachedParameters == null)
4374             {
4375 
4376                 SqlParameter[] spParameters = DiscoverSpParameterSet(connection, spName, includeReturnValueParameter);
4377 
4378                 paramCache[hashKey] = spParameters;
4379 
4380                 cachedParameters = spParameters;
4381 
4382             }
4383 
4384 
4385 
4386             return CloneParameters(cachedParameters);
4387 
4388         }
4389 
4390 
4391 
4392         #endregion 参数集检索结束
4393 
4394     }
4395 
4396 }

 

SQLHelper

标签:

原文地址:http://www.cnblogs.com/zhutiehan/p/5475186.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!