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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值