C#版SQLHelper.cs类

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

     

 

如果要获取连接数据连接对象或字符串的话,先要修改SQLHelper类中GetConnSting() 方法中的ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;才能调用。

转载于:https://www.cnblogs.com/FLWL/p/5115436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值