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

 共2447行,查看请展开

猜你喜欢

转载自www.cnblogs.com/bcd589/p/9348902.html