• C#版SQLHelper.cs类


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

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

  • 相关阅读:
    欧拉法求乘率
    利用连分数求乘率
    反乘率
    乘率
    别害怕暂时的迷茫
    别害怕心中的理想
    HDU6072 Logical Chain
    P3345 [ZJOI2015]幻想乡战略游戏
    P4449 于神之怒加强版
    [笔记] 拉格朗日插值法
  • 原文地址:https://www.cnblogs.com/FLWL/p/5115436.html
Copyright © 2020-2023  润新知