微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

微软SQLHelper.cs类 中文版

using System
using System.Data; 
using System.Xml; 
using System.Data.sqlClient; 
using System.Collections; 
using System.Configuration;


namespace BookDAL 

    /// <summary> 
    /// sqlServer数据访问帮助类 
    /// </summary> 
    public sealed class sqlHelper 
    { 
        #region 私有构造函数方法


        private sqlHelper() { }


        /// <summary> 
        /// 将sqlParameter参数数组(参数值)分配给sqlCommand命令. 
        /// 这个方法将给任何一个参数分配dbnull.Value; 
        /// 该操作将阻止认值的使用. 
        /// </summary> 
        /// <param name="command">命令名</param> 
        /// <param name="commandParameters">sqlParameters数组</param> 
        private static void AttachParameters(sqlCommand command,sqlParameter[] commandParameters) 
        { 
            if (command == null) throw new ArgumentNullException("command"); 
            if (commandParameters != null) 
            { 
                foreach (sqlParameter p in commandParameters) 
                { 
                    if (p != null) 
                    { 
                        // 检查未分配值的输出参数,将其分配以dbnull.Value. 
                        if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) && 
                            (p.Value == null)) 
                        { 
                            p.Value = dbnull.Value; 
                        } 
                        command.Parameters.Add(p); 
                    } 
                } 
            } 
        }


        /// <summary> 
        /// 将DaTarow类型的列值分配到sqlParameter参数数组. 
        /// </summary> 
        /// <param name="commandParameters">要分配值的sqlParameter参数数组</param> 
        /// <param name="daTarow">将要分配给存储过程参数的DaTarow</param> 
        private static void AssignParameterValues(sqlParameter[] commandParameters,DaTarow daTarow) 
        { 
            if ((commandParameters == null) || (daTarow == null)) 
            { 
                return; 
            }


            int i = 0; 
            // 设置参数值 
            foreach (sqlParameter commandParameter in commandParameters) 
            { 
                // 创建参数名称,如果不存在,只抛出一个异常. 
                if (commandParameter.ParameterName == null || 
                    commandParameter.ParameterName.Length <= 1) 
                    throw new Exception( 
                        string.Format("请提供参数{0}一个有效的名称{1}.",i,commandParameter.ParameterName)); 
                // 从daTarow的表中获取为参数数组中数组名称的列的索引. 
                // 如果存在和参数名称相同的列,则将列值赋给当前名称的参数. 
                if (daTarow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1) 
                    commandParameter.Value = daTarow[commandParameter.ParameterName.Substring(1)]; 
                i++; 
            } 
        }


        /// <summary> 
        /// 将一个对象数组分配给sqlParameter参数数组. 
        /// </summary> 
        /// <param name="commandParameters">要分配值的sqlParameter参数数组</param> 
        /// <param name="parameterValues">将要分配给存储过程参数的对象数组</param> 
        private static void AssignParameterValues(sqlParameter[] commandParameters,object[] parameterValues) 
        { 
            if ((commandParameters == null) || (parameterValues == null)) 
            { 
                return; 
            }


            // 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常. 
            if (commandParameters.Length != parameterValues.Length) 
            { 
                throw new ArgumentException("参数值个数与参数不匹配."); 
            }


            // 给参数赋值 
            for (int i = 0,j = commandParameters.Length; i < j; i++) 
            { 
                // If the current array value derives from IDbDataParameter,then assign its Value property 
                if (parameterValues[i] is IDbDataParameter) 
                { 
                    IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i]; 
                    if (paramInstance.Value == null) 
                    { 
                        commandParameters[i].Value = dbnull.Value; 
                    } 
                    else 
                    { 
                        commandParameters[i].Value = paramInstance.Value; 
                    } 
                } 
                else if (parameterValues[i] == null) 
                { 
                    commandParameters[i].Value = dbnull.Value; 
                } 
                else 
                { 
                    commandParameters[i].Value = parameterValues[i]; 
                } 
            } 
        }


        /// <summary> 
        /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数 
        /// </summary> 
        /// <param name="command">要处理的sqlCommand</param> 
        /// <param name="connection">数据库连接</param> 
        /// <param name="transaction">一个有效的事务或者是null值</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本,其它.)</param> 
        /// <param name="commandText">存储过程名或都T-sql命令文本</param> 
        /// <param name="commandParameters">和命令相关联的sqlParameter参数数组,如果没有参数为'null'</param> 
        /// <param name="mustCloseConnection"><c>true</c> 如果连接是打开的,则为true,其它情况下为false.</param> 
        private static void PrepareCommand(sqlCommand command,sqlConnection connection,sqlTransaction transaction,CommandType commandType,string commandText,sqlParameter[] commandParameters,out bool mustCloseConnection) 
        { 
            if (command == null) throw new ArgumentNullException("command"); 
            if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");


            // If the provided connection is not open,we will open it 
            if (connection.State != ConnectionState.Open) 
            { 
                mustCloseConnection = true; 
                connection.open()
            } 
            else 
            { 
                mustCloseConnection = false; 
            }


            // 给命令分配一个数据库连接. 
            command.Connection = connection;


            // 设置命令文本(存储过程名或sql语句) 
            command.CommandText = commandText;


            // 分配事务 
            if (transaction != null) 
            { 
                if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,please provide an open transaction.","transaction"); 
                command.Transaction = transaction; 
            }


            // 设置命令类型. 
            command.CommandType = commandType;


            // 分配命令参数 
            if (commandParameters != null) 
            { 
                AttachParameters(command,commandParameters); 
            } 
            return; 
        }


        #endregion 私有构造函数方法结束


        #region 数据库连接 
        /// <summary> 
        /// 一个有效的数据库连接字符串 
        /// </summary> 
        /// <returns></returns> 
        public static string GetConnSting() 
        { 
            return ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString; 
        } 
        /// <summary> 
        /// 一个有效的数据库连接对象 
        /// </summary> 
        /// <returns></returns> 
        public static sqlConnection GetConnection() 
        { 
            sqlConnection Connection = new sqlConnection(sqlHelper.GetConnSting()); 
            return Connection; 
        } 
        #endregion


        #region ExecuteNonQuery命令


        /// <summary> 
        /// 执行指定连接字符串,类型的sqlCommand. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int result = ExecuteNonQuery(connString,CommandType.StoredProcedure,"PublishOrders"); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="commandType">命令类型 (存储过程,其它.)</param> 
        /// <param name="commandText">存储过程名称sql语句</param> 
        /// <returns>返回命令影响的行数</returns> 
        public static int ExecuteNonQuery(string connectionString,string commandText) 
        { 
            return ExecuteNonQuery(connectionString,commandType,commandText,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定连接字符串,类型的sqlCommand.如果没有提供参数,不返回结果. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int result = ExecuteNonQuery(connString,"PublishOrders",new sqlParameter("@prodid",24)); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="commandType">命令类型 (存储过程,其它.)</param> 
        /// <param name="commandText">存储过程名称sql语句</param> 
        /// <param name="commandParameters">sqlParameter参数数组</param> 
        /// <returns>返回命令影响的行数</returns> 
        public static int ExecuteNonQuery(string connectionString,params sqlParameter[] commandParameters) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");


            using (sqlConnection connection = new sqlConnection(connectionString)) 
            { 
                connection.open();


                return ExecuteNonQuery(connection,commandParameters); 
            } 
        }


        /// <summary> 
        /// 执行指定连接字符串的存储过程,将对象数组的值赋给存储过程参数, 
        /// 此方法需要在参数缓存方法中探索参数并生成参数. 
        /// </summary> 
        /// <remarks> 
        /// 这个方法没有提供访问输出参数和返回值. 
        /// 示例:  
        ///  int result = ExecuteNonQuery(connString,24,36); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串/param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="parameterValues">分配到存储过程输入参数的对象数组</param> 
        /// <returns>返回受影响的行数</returns> 
        public static int ExecuteNonQuery(string connectionString,string spName,params object[] parameterValues) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果存在参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从探索存储过程参数(加载到缓存)并分配给存储过程参数数组. 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,spName);


                // 给存储过程参数赋值 
                AssignParameterValues(commandParameters,parameterValues);


                return ExecuteNonQuery(connectionString,spName,commandParameters); 
            } 
            else 
            { 
                // 没有参数情况下 
                return ExecuteNonQuery(connectionString,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int result = ExecuteNonQuery(conn,"PublishOrders"); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQuery(sqlConnection connection,string commandText) 
        { 
            return ExecuteNonQuery(connection,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int result = ExecuteNonQuery(conn,24)); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 
        /// <param name="commandText">T存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">sqlParamter参数数组</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQuery(sqlConnection connection,params sqlParameter[] commandParameters) 
        { 
            if (connection == null) throw new ArgumentNullException("connection");


            // 创建sqlCommand命令,并进行预处理 
            sqlCommand cmd = new sqlCommand(); 
            bool mustCloseConnection = false; 
            PrepareCommand(cmd,connection,(sqlTransaction)null,commandParameters,out mustCloseConnection);


            // Finally,execute the command 
            int retval = cmd.ExecuteNonQuery();


            // 清除参数,以便再次使用. 
            cmd.Parameters.Clear(); 
            if (mustCloseConnection) 
                connection.Close(); 
            return retval; 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值 
        /// 示例:  
        ///  int result = ExecuteNonQuery(conn,36); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQuery(sqlConnection connection,params object[] parameterValues) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,spName);


                // 给存储过程分配参数值 
                AssignParameterValues(commandParameters,parameterValues);


                return ExecuteNonQuery(connection,commandParameters); 
            } 
            else 
            { 
                return ExecuteNonQuery(connection,spName); 
            } 
        }


        /// <summary> 
        /// 执行带事务的sqlCommand. 
        /// </summary> 
        /// <remarks> 
        /// 示例.:  
        ///  int result = ExecuteNonQuery(trans,"PublishOrders"); 
        /// </remarks> 
        /// <param name="transaction">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回影响的行数/returns> 
        public static int ExecuteNonQuery(sqlTransaction transaction,string commandText) 
        { 
            return ExecuteNonQuery(transaction,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行带事务的sqlCommand(指定参数). 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int result = ExecuteNonQuery(trans,"Getorders",24)); 
        /// </remarks> 
        /// <param name="transaction">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">sqlParamter参数数组</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQuery(sqlTransaction transaction,params sqlParameter[] commandParameters) 
        { 
            if (transaction == null) throw new ArgumentNullException("transaction"); 
            if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction");


            // 预处理 
            sqlCommand cmd = new sqlCommand(); 
            bool mustCloseConnection = false; 
            PrepareCommand(cmd,transaction.Connection,transaction,out mustCloseConnection);


            // 执行 
            int retval = cmd.ExecuteNonQuery();


            // 清除参数集,以便再次使用. 
            cmd.Parameters.Clear(); 
            return retval; 
        }


        /// <summary> 
        /// 执行带事务的sqlCommand(指定参数值). 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值 
        /// 示例:  
        ///  int result = ExecuteNonQuery(conn,trans,36); 
        /// </remarks> 
        /// <param name="transaction">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回受影响的行数</returns> 
        public static int ExecuteNonQuery(sqlTransaction transaction,params object[] parameterValues) 
        { 
            if (transaction == null) throw new ArgumentNullException("transaction"); 
            if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);


                // 调用重载方法 
                return ExecuteNonQuery(transaction,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteNonQuery(transaction,spName); 
            } 
        }


        #endregion ExecuteNonQuery方法结束


        #region ExecuteDataset方法


        /// <summary> 
        /// 执行指定数据库连接字符串的命令,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  DataSet ds = ExecuteDataset(connString,"Getorders"); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(string connectionString,string commandText) 
        { 
            return ExecuteDataset(connectionString,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库连接字符串的命令,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 示例: 
        ///  DataSet ds = ExecuteDataset(connString,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">sqlParamters参数数组</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(string connectionString,params sqlParameter[] commandParameters) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");


            // 创建并打开数据库连接对象,操作完成释放对象. 
            using (sqlConnection connection = new sqlConnection(connectionString)) 
            { 
                connection.open();


                // 调用指定数据库连接字符串重载方法
                return ExecuteDataset(connection,commandParameters); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接字符串的命令,直接提供参数值,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值. 
        /// 示例: 
        ///  DataSet ds = ExecuteDataset(connString,36); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(string connectionString,params object[] parameterValues) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中检索存储过程参数 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,spName);


                // 给存储过程参数分配值 
                AssignParameterValues(commandParameters,parameterValues);


                return ExecuteDataset(connectionString,commandParameters); 
            } 
            else 
            { 
                return ExecuteDataset(connectionString,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  DataSet ds = ExecuteDataset(conn,"Getorders"); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(sqlConnection connection,string commandText) 
        { 
            return ExecuteDataset(connection,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,指定存储过程参数,24)); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <param name="commandParameters">sqlParamter参数数组</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(sqlConnection connection,params sqlParameter[] commandParameters) 
        { 
            if (connection == null) throw new ArgumentNullException("connection");


            // 预处理 
            sqlCommand cmd = new sqlCommand(); 
            bool mustCloseConnection = false; 
            PrepareCommand(cmd,out mustCloseConnection);


            // 创建sqlDataAdapter和DataSet. 
            using (sqlDataAdapter da = new sqlDataAdapter(cmd)) 
            { 
                DataSet ds = new DataSet();


                // 填充DataSet. 
                da.Fill(ds);


                cmd.Parameters.Clear();


                if (mustCloseConnection) 
                    connection.Close();


                return ds; 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输入参数和返回值. 
        /// 示例.:  
        ///  DataSet ds = ExecuteDataset(conn,36); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(sqlConnection connection,params object[] parameterValues) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 比缓存中加载存储过程参数 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,parameterValues);


                return ExecuteDataset(connection,commandParameters); 
            } 
            else 
            { 
                return ExecuteDataset(connection,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定事务的命令,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  DataSet ds = ExecuteDataset(trans,"Getorders"); 
        /// </remarks> 
        /// <param name="transaction">事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(sqlTransaction transaction,string commandText) 
        { 
            return ExecuteDataset(transaction,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定事务的命令,指定参数,24)); 
        /// </remarks> 
        /// <param name="transaction">事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <param name="commandParameters">sqlParamter参数数组</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(sqlTransaction transaction,out mustCloseConnection);


            // 创建 DataAdapter & DataSet 
            using (sqlDataAdapter da = new sqlDataAdapter(cmd)) 
            { 
                DataSet ds = new DataSet(); 
                da.Fill(ds); 
                cmd.Parameters.Clear(); 
                return ds; 
            } 
        }


        /// <summary> 
        /// 执行指定事务的命令,返回DataSet. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输入参数和返回值. 
        /// 示例.:  
        ///  DataSet ds = ExecuteDataset(trans,36); 
        /// </remarks> 
        /// <param name="transaction">事务</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回一个包含结果集的DataSet</returns> 
        public static DataSet ExecuteDataset(sqlTransaction transaction,"transaction"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);


                return ExecuteDataset(transaction,commandParameters); 
            } 
            else 
            { 
                return ExecuteDataset(transaction,spName); 
            } 
        }


        #endregion ExecuteDataset数据集命令结束


        #region ExecuteReader 数据阅读器


        /// <summary> 
        /// 枚举,标识数据库连接是由sqlHelper提供还是由调用者提供 
        /// </summary> 
        private enum sqlConnectioNownership 
        { 
            /// <summary>由sqlHelper提供连接</summary> 
            Internal, 
            /// <summary>由调用者提供连接</summary> 
            External 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的数据阅读器. 
        /// </summary> 
        /// <remarks> 
        /// 如果是sqlHelper打开连接,当连接关闭DataReader也将关闭
        /// 如果是调用都打开连接,DataReader由调用都管理. 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="transaction">一个有效的事务,或者为 'null'</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <param name="commandParameters">sqlParameters参数数组,如果没有参数则为'null'</param> 
        /// <param name="connectioNownership">标识数据库连接对象是由调用者提供还是由sqlHelper提供</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        private static sqlDataReader ExecuteReader(sqlConnection connection,sqlConnectioNownership connectioNownership) 
        { 
            if (connection == null) throw new ArgumentNullException("connection");


            bool mustCloseConnection = false; 
            // 创建命令 
            sqlCommand cmd = new sqlCommand(); 
            try 
            { 
                PrepareCommand(cmd,out mustCloseConnection);


                // 创建数据阅读器 
                sqlDataReader dataReader;


                if (connectioNownership == sqlConnectioNownership.External) 
                { 
                    dataReader = cmd.ExecuteReader(); 
                } 
                else 
                { 
                    dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
                }


                // 清除参数,以便再次使用.. 
                // HACK: There is a problem here,the output parameter values are fletched 
                // when the reader is closed,so if the parameters are detached from the command 
                // then the sqlReader can磘 set its values. 
                // When this happen,the parameters can磘 be used again in other command. 
                bool canClear = true; 
                foreach (sqlParameter commandParameter in cmd.Parameters) 
                { 
                    if (commandParameter.Direction != ParameterDirection.Input) 
                        canClear = false; 
                }


                if (canClear) 
                { 
                    cmd.Parameters.Clear(); 
                }


                return dataReader; 
            } 
            catch 
            { 
                if (mustCloseConnection) 
                    connection.Close(); 
                throw; 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接字符串的数据阅读器. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(connString,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(string connectionString,string commandText) 
        { 
            return ExecuteReader(connectionString,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库连接字符串的数据阅读器,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(connString,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <param name="commandParameters">sqlParamter参数数组(new sqlParameter("@prodid",24))</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(string connectionString,params sqlParameter[] commandParameters) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            sqlConnection connection = null; 
            try 
            { 
                connection = new sqlConnection(connectionString); 
                connection.open();


                return ExecuteReader(connection,null,sqlConnectioNownership.Internal); 
            } 
            catch 
            { 
                // If we fail to return the sqlDatReader,we need to close the connection ourselves 
                if (connection != null) connection.Close(); 
                throw; 
            }


        }


        /// <summary> 
        /// 执行指定数据库连接字符串的数据阅读器,指定参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(connString,36); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(string connectionString,params object[] parameterValues) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,spName);


                AssignParameterValues(commandParameters,parameterValues);


                return ExecuteReader(connectionString,commandParameters); 
            } 
            else 
            { 
                return ExecuteReader(connectionString,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的数据阅读器. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(conn,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名或T-sql语句</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(sqlConnection connection,string commandText) 
        { 
            return ExecuteReader(connection,(sqlParameter[])null); 
        }


        /// <summary> 
        /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(conn,命令文本或其它)</param> 
        /// <param name="commandText">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandParameters">sqlParamter参数数组</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(sqlConnection connection,params sqlParameter[] commandParameters) 
        { 
            return ExecuteReader(connection,sqlConnectioNownership.External); 
        }


        /// <summary> 
        /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(conn,36); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">T存储过程名</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(sqlConnection connection,params object[] parameterValues) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,parameterValues);


                return ExecuteReader(connection,commandParameters); 
            } 
            else 
            { 
                return ExecuteReader(connection,spName); 
            } 
        }


        /// <summary> 
        /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(trans,"Getorders"); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(sqlTransaction transaction,string commandText) 
        { 
            return ExecuteReader(transaction,(sqlParameter[])null); 
        }


        /// <summary> 
        /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///   sqlDataReader dr = ExecuteReader(trans,24)); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(sqlTransaction transaction,"transaction");


            return ExecuteReader(transaction.Connection,sqlConnectioNownership.External); 
        }


        /// <summary> 
        /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  sqlDataReader dr = ExecuteReader(trans,36); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReader(sqlTransaction transaction,"transaction"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);


                return ExecuteReader(transaction,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteReader(transaction,spName); 
            } 
        }


        #endregion ExecuteReader数据阅读器


        #region ExecuteScalar 返回结果集中的第一行第一列


        /// <summary> 
        /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int orderCount = (int)ExecuteScalar(connString,"GetorderCount"); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(string connectionString,string commandText) 
        { 
            // 执行参数为空的方法 
            return ExecuteScalar(connectionString,"GetorderCount",命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(string connectionString,params sqlParameter[] commandParameters) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            // 创建并打开数据库连接对象,操作完成释放对象. 
            using (sqlConnection connection = new sqlConnection(connectionString)) 
            { 
                connection.open();


                // 调用指定数据库连接字符串重载方法
                return ExecuteScalar(connection,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  int orderCount = (int)ExecuteScalar(connString,36); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(string connectionString,params object[] parameterValues) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,parameterValues);


                // 调用重载方法 
                return ExecuteScalar(connectionString,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteScalar(connectionString,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int orderCount = (int)ExecuteScalar(conn,"GetorderCount"); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(sqlConnection connection,string commandText) 
        { 
            // 执行参数为空的方法 
            return ExecuteScalar(connection,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(sqlConnection connection,并进行预处理 
            sqlCommand cmd = new sqlCommand();


            bool mustCloseConnection = false; 
            PrepareCommand(cmd,out mustCloseConnection);


            // 执行sqlCommand命令,并返回结果. 
            object retval = cmd.ExecuteScalar();


            // 清除参数,以便再次使用. 
            cmd.Parameters.Clear();


            if (mustCloseConnection) 
                connection.Close();


            return retval; 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  int orderCount = (int)ExecuteScalar(conn,36); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(sqlConnection connection,params object[] parameterValues) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,parameterValues);


                // 调用重载方法 
                return ExecuteScalar(connection,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteScalar(connection,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库事务的命令,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  int orderCount = (int)ExecuteScalar(trans,"GetorderCount"); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(sqlTransaction transaction,string commandText) 
        { 
            // 执行参数为空的方法 
            return ExecuteScalar(transaction,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库事务的命令,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(sqlTransaction transaction,"transaction");


            // 创建sqlCommand命令,以便再次使用. 
            cmd.Parameters.Clear(); 
            return retval; 
        }


        /// <summary> 
        /// 执行指定数据库事务的命令,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  int orderCount = (int)ExecuteScalar(trans,36); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalar(sqlTransaction transaction,"transaction"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // PPull the parameters for this stored procedure from the parameter cache () 
                sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);


                // 调用重载方法 
                return ExecuteScalar(transaction,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteScalar(transaction,spName); 
            } 
        }


        #endregion ExecuteScalar


        #region ExecuteXmlReader XML阅读器 
        /// <summary> 
        /// 执行指定数据库连接对象的sqlCommand命令,并产生一个XmlReader对象做为结果集返回. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  XmlReader r = ExecuteXmlReader(conn,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReader(sqlConnection connection,string commandText) 
        { 
            // 执行参数为空的方法 
            return ExecuteXmlReader(connection,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的sqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  XmlReader r = ExecuteXmlReader(conn,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReader(sqlConnection connection,params sqlParameter[] commandParameters) 
        { 
            if (connection == null) throw new ArgumentNullException("connection");


            bool mustCloseConnection = false; 
            // 创建sqlCommand命令,并进行预处理 
            sqlCommand cmd = new sqlCommand(); 
            try 
            { 
                PrepareCommand(cmd,out mustCloseConnection);


                // 执行命令 
                XmlReader retval = cmd.ExecuteXmlReader();


                // 清除参数,以便再次使用. 
                cmd.Parameters.Clear();


                return retval; 
            } 
            catch 
            { 
                if (mustCloseConnection) 
                    connection.Close(); 
                throw; 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的sqlCommand命令,指定参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  XmlReader r = ExecuteXmlReader(conn,36); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称 using "FOR XML AUTO"</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReader(sqlConnection connection,parameterValues);


                // 调用重载方法 
                return ExecuteXmlReader(connection,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteXmlReader(connection,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库事务的sqlCommand命令,并产生一个XmlReader对象做为结果集返回. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  XmlReader r = ExecuteXmlReader(trans,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReader(sqlTransaction transaction,string commandText) 
        { 
            // 执行参数为空的方法 
            return ExecuteXmlReader(transaction,(sqlParameter[])null); 
        }


        /// <summary> 
        /// 执行指定数据库事务的sqlCommand命令,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  XmlReader r = ExecuteXmlReader(trans,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReader(sqlTransaction transaction,out mustCloseConnection);


            // 执行命令 
            XmlReader retval = cmd.ExecuteXmlReader();


            // 清除参数,以便再次使用. 
            cmd.Parameters.Clear(); 
            return retval; 
        }


        /// <summary> 
        /// 执行指定数据库事务的sqlCommand命令,指定参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  XmlReader r = ExecuteXmlReader(trans,36); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        /// <returns>返回一个包含结果集的DataSet.</returns> 
        public static XmlReader ExecuteXmlReader(sqlTransaction transaction,parameterValues);


                // 调用重载方法 
                return ExecuteXmlReader(transaction,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                return ExecuteXmlReader(transaction,spName); 
            } 
        }


        #endregion ExecuteXmlReader 阅读器结束


        #region FillDataset 填充数据集 
        /// <summary> 
        /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(connString,ds,new string[] {"orders"}); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.)</param> 
        public static void FillDataset(string connectionString,DataSet dataSet,string[] tableNames) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (dataSet == null) throw new ArgumentNullException("dataSet");


            // 创建并打开数据库连接对象,操作完成释放对象. 
            using (sqlConnection connection = new sqlConnection(connectionString)) 
            { 
                connection.open();


                // 调用指定数据库连接字符串重载方法
                FillDataset(connection,dataSet,tableNames); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(connString,new string[] {"orders"},命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        public static void FillDataset(string connectionString, 
            string commandText,string[] tableNames, 
            params sqlParameter[] commandParameters) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (dataSet == null) throw new ArgumentNullException("dataSet"); 
            // 创建并打开数据库连接对象,tableNames,映射数据表并填充数据集,指定存储过程参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  FillDataset(connString,24); 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param>    
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        public static void FillDataset(string connectionString, 
            DataSet dataSet, 
            params object[] parameterValues) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (dataSet == null) throw new ArgumentNullException("dataSet"); 
            // 创建并打开数据库连接对象,parameterValues); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,映射数据表并填充数据集. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(conn,new string[] {"orders"}); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param>    
        public static void FillDataset(sqlConnection connection,string[] tableNames) 
        { 
            FillDataset(connection,null); 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(conn,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        public static void FillDataset(sqlConnection connection, 
            params sqlParameter[] commandParameters) 
        { 
            FillDataset(connection,commandParameters); 
        }


        /// <summary> 
        /// 执行指定数据库连接对象的命令,指定存储过程参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  FillDataset(conn,36); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        public static void FillDataset(sqlConnection connection, 
            params object[] parameterValues) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (dataSet == null) throw new ArgumentNullException("dataSet"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数,parameterValues);


                // 调用重载方法 
                FillDataset(connection,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                FillDataset(connection,tableNames); 
            } 
        }


        /// <summary> 
        /// 执行指定数据库事务的命令,映射数据表并填充数据集. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(trans,new string[] {"orders"}); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        public static void FillDataset(sqlTransaction transaction,string[] tableNames) 
        { 
            FillDataset(transaction,null); 
        }


        /// <summary> 
        /// 执行指定数据库事务的命令,指定参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(trans,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        public static void FillDataset(sqlTransaction transaction, 
            params sqlParameter[] commandParameters) 
        { 
            FillDataset(transaction.Connection,commandParameters); 
        }


        /// <summary> 
        /// 执行指定数据库事务的命令,指定存储过程参数值. 
        /// </summary> 
        /// <remarks> 
        /// 此方法不提供访问存储过程输出参数和返回值参数. 
        /// 
        /// 示例:  
        ///  FillDataset(trans,new string[]{"orders"},36); 
        /// </remarks> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 
        public static void FillDataset(sqlTransaction transaction, 
            params object[] parameterValues) 
        { 
            if (transaction == null) throw new ArgumentNullException("transaction"); 
            if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction"); 
            if (dataSet == null) throw new ArgumentNullException("dataSet"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果有参数值 
            if ((parameterValues != null) && (parameterValues.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数,parameterValues);


                // 调用重载方法 
                FillDataset(transaction,commandParameters); 
            } 
            else 
            { 
                // 没有参数值 
                FillDataset(transaction,tableNames); 
            } 
        }


        /// <summary> 
        /// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,DataSet/TableNames/sqlParameters. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  FillDataset(conn,24)); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="transaction">一个有效的连接事务</param> 
        /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 
        /// <param name="commandText">存储过程名称或T-sql语句</param> 
        /// <param name="dataSet">要填充结果集的DataSet实例</param> 
        /// <param name="tableNames">表映射的数据表数组 
        /// 用户定义的表名 (可有是实际的表名.) 
        /// </param> 
        /// <param name="commandParameters">分配给命令的sqlParamter参数数组</param> 
        private static void FillDataset(sqlConnection connection, 
            params sqlParameter[] commandParameters) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (dataSet == null) throw new ArgumentNullException("dataSet");


            // 创建sqlCommand命令,并进行预处理 
            sqlCommand command = new sqlCommand(); 
            bool mustCloseConnection = false; 
            PrepareCommand(command,out mustCloseConnection);


            // 执行命令 
            using (sqlDataAdapter dataAdapter = new sqlDataAdapter(command)) 
            {


                // 追加表映射 
                if (tableNames != null && tableNames.Length > 0) 
                { 
                    string tableName = "Table"; 
                    for (int index = 0; index < tableNames.Length; index++) 
                    { 
                        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"); 
                        dataAdapter.TableMappings.Add(tableName,tableNames[index]); 
                        tableName += (index + 1).ToString(); 
                    } 
                }


                // 填充数据集使用认表名称 
                dataAdapter.Fill(dataSet);


                // 清除参数,以便再次使用. 
                command.Parameters.Clear(); 
            }


            if (mustCloseConnection) 
                connection.Close(); 
        } 
        #endregion


        #region UpdateDataset 更新数据集 
        /// <summary> 
        /// 执行数据集更新到数据库,指定inserted,updated,or deleted命令. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  UpdateDataset(conn,insertCommand,deleteCommand,updateCommand,"Order"); 
        /// </remarks> 
        /// <param name="insertCommand">[追加记录]一个有效的T-sql语句或存储过程</param> 
        /// <param name="deleteCommand">[删除记录]一个有效的T-sql语句或存储过程</param> 
        /// <param name="updateCommand">[更新记录]一个有效的T-sql语句或存储过程</param> 
        /// <param name="dataSet">要更新到数据库的DataSet</param> 
        /// <param name="tableName">要更新到数据库的DataTable</param> 
        public static void UpdateDataset(sqlCommand insertCommand,sqlCommand deleteCommand,sqlCommand updateCommand,string tableName) 
        { 
            if (insertCommand == null) throw new ArgumentNullException("insertCommand"); 
            if (deleteCommand == null) throw new ArgumentNullException("deleteCommand"); 
            if (updateCommand == null) throw new ArgumentNullException("updateCommand"); 
            if (tableName == null || tableName.Length == 0) throw new ArgumentNullException("tableName");


            // 创建sqlDataAdapter,当操作完成后释放. 
            using (sqlDataAdapter dataAdapter = new sqlDataAdapter()) 
            { 
                // 设置数据适配器命令 
                dataAdapter.UpdateCommand = updateCommand; 
                dataAdapter.InsertCommand = insertCommand; 
                dataAdapter.DeleteCommand = deleteCommand;


                // 更新数据集改变到数据库 
                dataAdapter.Update(dataSet,tableName);


                // 提交所有改变到数据集. 
                dataSet.AcceptChanges(); 
            } 
        } 
        #endregion


        #region CreateCommand 创建一条sqlCommand命令 
        /// <summary> 
        /// 创建sqlCommand命令,指定数据库连接对象,存储过程名和参数. 
        /// </summary> 
        /// <remarks> 
        /// 示例:  
        ///  sqlCommand command = CreateCommand(conn,"AddCustomer","CustomerID","CustomerName"); 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="sourceColumns">源表的列名称数组</param> 
        /// <returns>返回sqlCommand命令</returns> 
        public static sqlCommand CreateCommand(sqlConnection connection,params string[] sourceColumns) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 创建命令 
            sqlCommand cmd = new sqlCommand(spName,connection); 
            cmd.CommandType = CommandType.StoredProcedure;


            // 如果有参数值 
            if ((sourceColumns != null) && (sourceColumns.Length > 0)) 
            { 
                // 从缓存中加载存储过程参数,spName);


                // 将源表的列到映射到DataSet命令中. 
                for (int index = 0; index < sourceColumns.Length; index++) 
                    commandParameters[index].sourceColumn = sourceColumns[index];


                // Attach the discovered parameters to the sqlCommand object 
                AttachParameters(cmd,commandParameters); 
            }


            return cmd; 
        } 
        #endregion


        #region ExecuteNonQueryTypedParams 类型化参数(DaTarow) 
        /// <summary> 
        /// 执行指定连接数据库连接字符串的存储过程,使用DaTarow做为参数值,返回受影响的行数. 
        /// </summary> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQueryTypedParams(String connectionString,String spName,DaTarow daTarow) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果row有值,存储过程必须初始化. 
            if (daTarow != null && daTarow.ItemArray.Length > 0) 
            { 
                // 从缓存中加载存储过程参数,spName);


                // 分配参数值 
                AssignParameterValues(commandParameters,daTarow);


                return sqlHelper.ExecuteNonQuery(connectionString,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteNonQuery(connectionString,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定连接数据库连接对象的存储过程,返回受影响的行数. 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQueryTypedParams(sqlConnection connection,DaTarow daTarow) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果row有值,daTarow);


                return sqlHelper.ExecuteNonQuery(connection,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteNonQuery(connection,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定连接数据库事物的存储过程,返回受影响的行数. 
        /// </summary> 
        /// <param name="transaction">一个有效的连接事务 object</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回影响的行数</returns> 
        public static int ExecuteNonQueryTypedParams(sqlTransaction transaction,DaTarow daTarow) 
        { 
            if (transaction == null) throw new ArgumentNullException("transaction"); 
            if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // Sf the row has values,the store procedure parameters must be initialized 
            if (daTarow != null && daTarow.ItemArray.Length > 0) 
            { 
                // 从缓存中加载存储过程参数,daTarow);


                return sqlHelper.ExecuteNonQuery(transaction,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteNonQuery(transaction,spName); 
            } 
        } 
        #endregion


        #region ExecuteDatasetTypedParams 类型化参数(DaTarow) 
        /// <summary> 
        /// 执行指定连接数据库连接字符串的存储过程,返回DataSet. 
        /// </summary> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回一个包含结果集的DataSet.</returns> 
        public static DataSet ExecuteDatasetTypedParams(string connectionString,DaTarow daTarow) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            //如果row有值,daTarow);


                return sqlHelper.ExecuteDataset(connectionString,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteDataset(connectionString,返回DataSet. 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回一个包含结果集的DataSet.</returns> 
        /// 
        public static DataSet ExecuteDatasetTypedParams(sqlConnection connection,daTarow);


                return sqlHelper.ExecuteDataset(connection,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteDataset(connection,spName); 
            } 
        }


        /// <summary> 
        /// 执行指定连接数据库事务的存储过程,返回DataSet. 
        /// </summary> 
        /// <param name="transaction">一个有效的连接事务 object</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回一个包含结果集的DataSet.</returns> 
        public static DataSet ExecuteDatasetTypedParams(sqlTransaction transaction,"transaction"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            // 如果row有值,daTarow);


                return sqlHelper.ExecuteDataset(transaction,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteDataset(transaction,spName); 
            } 
        }


        #endregion


        #region ExecuteReaderTypedParams 类型化参数(DaTarow) 
        /// <summary> 
        /// 执行指定连接数据库连接字符串的存储过程,返回DataReader. 
        /// </summary> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReaderTypedParams(String connectionString,daTarow);


                return sqlHelper.ExecuteReader(connectionString,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteReader(connectionString,spName); 
            } 
        }




        /// <summary> 
        /// 执行指定连接数据库连接对象的存储过程,返回DataReader. 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReaderTypedParams(sqlConnection connection,daTarow);


                return sqlHelper.ExecuteReader(connection,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteReader(connection,返回DataReader. 
        /// </summary> 
        /// <param name="transaction">一个有效的连接事务 object</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回包含结果集的sqlDataReader</returns> 
        public static sqlDataReader ExecuteReaderTypedParams(sqlTransaction transaction,daTarow);


                return sqlHelper.ExecuteReader(transaction,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteReader(transaction,spName); 
            } 
        } 
        #endregion


        #region ExecuteScalarTypedParams 类型化参数(DaTarow) 
        /// <summary> 
        /// 执行指定连接数据库连接字符串的存储过程,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalarTypedParams(String connectionString,daTarow);


                return sqlHelper.ExecuteScalar(connectionString,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteScalar(connectionString,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalarTypedParams(sqlConnection connection,daTarow);


                return sqlHelper.ExecuteScalar(connection,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteScalar(connection,返回结果集中的第一行第一列. 
        /// </summary> 
        /// <param name="transaction">一个有效的连接事务 object</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回结果集中的第一行第一列</returns> 
        public static object ExecuteScalarTypedParams(sqlTransaction transaction,daTarow);


                return sqlHelper.ExecuteScalar(transaction,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteScalar(transaction,spName); 
            } 
        } 
        #endregion


        #region ExecuteXmlReaderTypedParams 类型化参数(DaTarow) 
        /// <summary> 
        /// 执行指定连接数据库连接对象的存储过程,返回XmlReader类型的结果集. 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReaderTypedParams(sqlConnection connection,daTarow);


                return sqlHelper.ExecuteXmlReader(connection,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteXmlReader(connection,返回XmlReader类型的结果集. 
        /// </summary> 
        /// <param name="transaction">一个有效的连接事务 object</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="daTarow">使用DaTarow作为参数值</param> 
        /// <returns>返回XmlReader结果集对象.</returns> 
        public static XmlReader ExecuteXmlReaderTypedParams(sqlTransaction transaction,daTarow);


                return sqlHelper.ExecuteXmlReader(transaction,commandParameters); 
            } 
            else 
            { 
                return sqlHelper.ExecuteXmlReader(transaction,spName); 
            } 
        } 
        #endregion


    }


    /// <summary> 
    /// sqlHelperParameterCache提供缓存存储过程参数,并能够在运行时从存储过程中探索参数. 
    /// </summary> 
    public sealed class sqlHelperParameterCache 
    { 
        #region 私有方法,字段,构造函数 
        // 私有构造函数,妨止类被实例化. 
        private sqlHelperParameterCache() { }


        // 这个方法要注意 
        private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());


        /// <summary> 
        /// 探索运行时的存储过程,返回sqlParameter参数数组. 
        /// 初始化参数值为 dbnull.Value. 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接</param> 
        /// <param name="spName">存储过程名称</param> 
        /// <param name="includeReturnValueParameter">是否包含返回值参数</param> 
        /// <returns>返回sqlParameter参数数组</returns> 
        private static sqlParameter[] discoverSpParameterSet(sqlConnection connection,bool includeReturnValueParameter) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            sqlCommand cmd = new sqlCommand(spName,connection); 
            cmd.CommandType = CommandType.StoredProcedure;


            connection.open()
            // 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中. 
            sqlCommandBuilder.DeriveParameters(cmd); 
            connection.Close(); 
            // 如果不包含返回值参数,将参数集中的每一个参数删除
            if (!includeReturnValueParameter) 
            { 
                cmd.Parameters.RemoveAt(0); 
            }


            // 创建参数数组 
            sqlParameter[] discoveredParameters = new sqlParameter[cmd.Parameters.Count]; 
            // 将cmd的Parameters参数集复制到discoveredParameters数组. 
            cmd.Parameters.copyTo(discoveredParameters,0);


            // 初始化参数值为 dbnull.Value. 
            foreach (sqlParameter discoveredParameter in discoveredParameters) 
            { 
                discoveredParameter.Value = dbnull.Value; 
            } 
            return discoveredParameters; 
        }


        /// <summary> 
        /// sqlParameter参数数组的深层拷贝. 
        /// </summary> 
        /// <param name="originalParameters">原始参数数组</param> 
        /// <returns>返回一个同样的参数数组</returns> 
        private static sqlParameter[] CloneParameters(sqlParameter[] originalParameters) 
        { 
            sqlParameter[] clonedParameters = new sqlParameter[originalParameters.Length];


            for (int i = 0,j = originalParameters.Length; i < j; i++) 
            { 
                clonedParameters[i] = (sqlParameter)((ICloneable)originalParameters[i]).Clone(); 
            }


            return clonedParameters; 
        }


        #endregion 私有方法,构造函数结束


        #region 缓存方法


        /// <summary> 
        /// 追加参数数组到缓存. 
        /// </summary> 
        /// <param name="connectionString">一个有效的数据库连接字符串</param> 
        /// <param name="commandText">存储过程名或sql语句</param> 
        /// <param name="commandParameters">要缓存的参数数组</param> 
        public static void CacheParameterSet(string connectionString,params sqlParameter[] commandParameters) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");


            string hashKey = connectionString + ":" + commandText;


            paramCache[hashKey] = commandParameters; 
        }


        /// <summary> 
        /// 从缓存中获取参数数组. 
        /// </summary> 
        /// <param name="connectionString">一个有效的数据库连接字符</param> 
        /// <param name="commandText">存储过程名或sql语句</param> 
        /// <returns>参数数组</returns> 
        public static sqlParameter[] GetCachedParameterSet(string connectionString,string commandText) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");


            string hashKey = connectionString + ":" + commandText;


            sqlParameter[] cachedParameters = paramCache[hashKey] as sqlParameter[]; 
            if (cachedParameters == null) 
            { 
                return null; 
            } 
            else 
            { 
                return CloneParameters(cachedParameters); 
            } 
        }


        #endregion 缓存方法结束


        #region 检索指定的存储过程的参数集


        /// <summary> 
        /// 返回指定的存储过程的参数集 
        /// </summary> 
        /// <remarks> 
        /// 这个方法查询数据库,并将信息存储到缓存. 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符</param> 
        /// <param name="spName">存储过程名</param> 
        /// <returns>返回sqlParameter参数数组</returns> 
        public static sqlParameter[] GetSpParameterSet(string connectionString,string spName) 
        { 
            return GetSpParameterSet(connectionString,false); 
        }


        /// <summary> 
        /// 返回指定的存储过程的参数集 
        /// </summary> 
        /// <remarks> 
        /// 这个方法查询数据库,并将信息存储到缓存. 
        /// </remarks> 
        /// <param name="connectionString">一个有效的数据库连接字符.</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="includeReturnValueParameter">是否包含返回值参数</param> 
        /// <returns>返回sqlParameter参数数组</returns> 
        public static sqlParameter[] GetSpParameterSet(string connectionString,bool includeReturnValueParameter) 
        { 
            if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            using (sqlConnection connection = new sqlConnection(connectionString)) 
            { 
                return GetSpParameterSetInternal(connection,includeReturnValueParameter); 
            } 
        }


        /// <summary> 
        /// [内部]返回指定的存储过程的参数集(使用连接对象). 
        /// </summary> 
        /// <remarks> 
        /// 这个方法查询数据库,并将信息存储到缓存. 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接字符</param> 
        /// <param name="spName">存储过程名</param> 
        /// <returns>返回sqlParameter参数数组</returns> 
        internal static sqlParameter[] GetSpParameterSet(sqlConnection connection,string spName) 
        { 
            return GetSpParameterSet(connection,false); 
        }


        /// <summary> 
        /// [内部]返回指定的存储过程的参数集(使用连接对象) 
        /// </summary> 
        /// <remarks> 
        /// 这个方法查询数据库,并将信息存储到缓存. 
        /// </remarks> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="includeReturnValueParameter"> 
        /// 是否包含返回值参数 
        /// </param> 
        /// <returns>返回sqlParameter参数数组</returns> 
        internal static sqlParameter[] GetSpParameterSet(sqlConnection connection,bool includeReturnValueParameter) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            using (sqlConnection clonedConnection = (sqlConnection)((ICloneable)connection).Clone()) 
            { 
                return GetSpParameterSetInternal(clonedConnection,includeReturnValueParameter); 
            } 
        }


        /// <summary> 
        /// [私有]返回指定的存储过程的参数集(使用连接对象) 
        /// </summary> 
        /// <param name="connection">一个有效的数据库连接对象</param> 
        /// <param name="spName">存储过程名</param> 
        /// <param name="includeReturnValueParameter">是否包含返回值参数</param> 
        /// <returns>返回sqlParameter参数数组</returns> 
        private static sqlParameter[] GetSpParameterSetInternal(sqlConnection connection,bool includeReturnValueParameter) 
        { 
            if (connection == null) throw new ArgumentNullException("connection"); 
            if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");


            string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : "");


            sqlParameter[] cachedParameters;


            cachedParameters = paramCache[hashKey] as sqlParameter[]; 
            if (cachedParameters == null) 
            { 
                sqlParameter[] spParameters = discoverSpParameterSet(connection,includeReturnValueParameter); 
                paramCache[hashKey] = spParameters; 
                cachedParameters = spParameters; 
            }


            return CloneParameters(cachedParameters); 
        }


        #endregion 参数集检索结束


    } 
}


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐