• 微软C#版SQLHelper.cs类


    转载自:http://blog.csdn.net/fengqingtao2008/article/details/17399247

       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 }
    View Code
  • 相关阅读:
    029- 位运算符
    028- 三目运算符
    027- 字符串链接运算符
    026- 布尔运算符
    lucene 结合数据库做搜索
    JDK 1.8判断集合种的元素是否存在相同
    Springboot 集成jpa使用
    json 的使用 Java对象转json
    Java 短信发送
    1 eclipse 离线安装activiti插件
  • 原文地址:https://www.cnblogs.com/KTblog/p/4638540.html
Copyright © 2020-2023  润新知