微软SQLHelper.cs类 中文版

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

 

posted @ 2012-05-16 21:59  Liwuyi  阅读(72829)  评论(15编辑  收藏  举报