微软的SQLHelper类(含完整中文注释)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值