SqlHelperl帮助类


分享自己常用的SqlHelper,基本上囊括了所有的方法了:

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM