当前位置: 首页 > 编程日记 > 正文

SQLserver数据库操作帮助类SqlHelper

1 SqlHelper源码

 using System;
using System.Data;
using System.Xml;
using System.Data.SqlClient;
using System.Collections;
namespace SQL.Access
{/// <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 propertyif (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 itif (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 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, CommandType commandType, string commandText){return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定连接字符串,类型的SqlCommand.如果没有提供参数,不返回结果./// </summary>/// <remarks>/// 示例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "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, CommandType commandType, string commandText, params SqlParameter[] commandParameters){if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();return ExecuteNonQuery(connection, commandType, commandText, commandParameters);}}/// <summary>/// 执行指定连接字符串的存储过程,将对象数组的值赋给存储过程参数,/// 此方法需要在参数缓存方法中探索参数并生成参数./// </summary>/// <remarks>/// 这个方法没有提供访问输出参数和返回值./// 示例: /// int result = ExecuteNonQuery(connString, "PublishOrders", 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, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数情况下return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定数据库连接对象的命令 /// </summary>/// <remarks>/// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <returns>返回影响的行数</returns>public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText){return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接对象的命令/// </summary>/// <remarks>/// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 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, CommandType commandType, string commandText, params SqlParameter[] commandParameters){ if( connection == null ) throw new ArgumentNullException( "connection" );// 创建SqlCommand命令,并进行预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection );// Finally, execute the commandint retval = cmd.ExecuteNonQuery();// 清除参数,以便再次使用.cmd.Parameters.Clear();if( mustCloseConnection )connection.Close();return retval;}/// <summary>/// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值/// 示例: /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回影响的行数</returns>public static int ExecuteNonQuery(SqlConnection connection, string spName, 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, CommandType.StoredProcedure, spName, commandParameters);}else {return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行带事务的SqlCommand./// </summary>/// <remarks>/// 示例.: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");/// </remarks>/// <param name="transaction">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <returns>返回影响的行数/returns>public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText){return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行带事务的SqlCommand(指定参数)./// </summary>/// <remarks>/// 示例: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 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, CommandType commandType, string commandText, 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, please provide an open transaction.", "transaction" );// 预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );// 执行int retval = cmd.ExecuteNonQuery();// 清除参数集,以便再次使用.cmd.Parameters.Clear();return retval;}/// <summary>/// 执行带事务的SqlCommand(指定参数值)./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值/// 示例: /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);/// </remarks>/// <param name="transaction">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回受影响的行数</returns>public static int ExecuteNonQuery(SqlTransaction transaction, string spName, 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, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果有参数值if ((parameterValues != null) && (parameterValues.Length > 0)) {// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 给存储过程参数赋值AssignParameterValues(commandParameters, parameterValues);// 调用重载方法return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);}}#endregion ExecuteNonQuery方法结束#region ExecuteDataset方法/// <summary>/// 执行指定数据库连接字符串的命令,返回DataSet./// </summary>/// <remarks>/// 示例: /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "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, CommandType commandType, string commandText){return ExecuteDataset(connectionString, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接字符串的命令,返回DataSet./// </summary>/// <remarks>/// 示例: /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <param name="commandParameters">SqlParamters参数数组</param>/// <returns>返回一个包含结果集的DataSet</returns>public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters){if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );// 创建并打开数据库连接对象,操作完成释放对象.using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();// 调用指定数据库连接字符串重载方法.return ExecuteDataset(connection, commandType, commandText, commandParameters);}}/// <summary>/// 执行指定数据库连接字符串的命令,直接提供参数值,返回DataSet./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值./// 示例: /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36);/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="spName">存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回一个包含结果集的DataSet</returns>public static DataSet ExecuteDataset(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 ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else {return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定数据库连接对象的命令,返回DataSet./// </summary>/// <remarks>/// 示例: /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "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, CommandType commandType, string commandText){return ExecuteDataset(connection, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet./// </summary>/// <remarks>/// 示例: /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 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, CommandType commandType, string commandText, params SqlParameter[] commandParameters){if( connection == null ) throw new ArgumentNullException( "connection" );// 预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, 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;} }public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, int pageIndex, int pageSize, params SqlParameter[] commandParameters){using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();if (connection == null) throw new ArgumentNullException("connection");// 预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);// 创建SqlDataAdapter和DataSet.using (SqlDataAdapter da = new SqlDataAdapter(cmd)){DataSet ds = new DataSet();// 填充DataSet.da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "pageTable");cmd.Parameters.Clear();if (mustCloseConnection)connection.Close();return ds;}}}//自己增加用与分页的public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, int pageIndex, int pageSize){using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();if (connection == null) throw new ArgumentNullException("connection");// 预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;SqlParameter[] commandParameters = null;PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);// 创建SqlDataAdapter和DataSet.using (SqlDataAdapter da = new SqlDataAdapter(cmd)){DataSet ds = new DataSet();// 填充DataSet.da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "pageTable");cmd.Parameters.Clear();if (mustCloseConnection)connection.Close();return ds;}}}/// <summary>/// 执行指定数据库连接对象的命令,指定参数值,返回DataSet./// </summary>/// <remarks>/// 此方法不提供访问存储过程输入参数和返回值./// 示例.: /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回一个包含结果集的DataSet</returns>public static DataSet ExecuteDataset(SqlConnection connection, string spName, 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 ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);}else {return ExecuteDataset(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定事务的命令,返回DataSet./// </summary>/// <remarks>/// 示例: /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "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, CommandType commandType, string commandText){return ExecuteDataset(transaction, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定事务的命令,指定参数,返回DataSet./// </summary>/// <remarks>/// 示例: /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 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, CommandType commandType, string commandText, 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, please provide an open transaction.", "transaction" );// 预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );// 创建 DataAdapter & DataSetusing( 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, "GetOrders", 24, 36);/// </remarks>/// <param name="transaction">事务</param>/// <param name="spName">存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回一个包含结果集的DataSet</returns>public static DataSet ExecuteDataset(SqlTransaction transaction, string spName, 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, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );if ((parameterValues != null) && (parameterValues.Length > 0)) {// 从缓存中加载存储过程参数SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 给存储过程参数分配值AssignParameterValues(commandParameters, parameterValues);return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);}else {return ExecuteDataset(transaction, CommandType.StoredProcedure, 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, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership){ if( connection == null ) throw new ArgumentNullException( "connection" );bool mustCloseConnection = false;// 创建命令SqlCommand cmd = new SqlCommand();try{PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, 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, CommandType.StoredProcedure, "GetOrders");/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名或T-SQL语句</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText){return ExecuteReader(connectionString, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接字符串的数据阅读器,指定参数./// </summary>/// <remarks>/// 示例: /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</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, CommandType commandType, string commandText, 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, commandType, commandText, commandParameters,SqlConnectionOwnership.Internal);}catch{// If we fail to return the SqlDatReader, we need to close the connection ourselvesif( connection != null ) connection.Close();throw;}}/// <summary>/// 执行指定数据库连接字符串的数据阅读器,指定参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// 示例: /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36);/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="spName">存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReader(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 ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else {return ExecuteReader(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定数据库连接对象的数据阅读器./// </summary>/// <remarks>/// 示例: /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders");/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名或T-SQL语句</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText){return ExecuteReader(connection, commandType, commandText, (SqlParameter[])null);}/// <summary>/// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数./// </summary>/// <remarks>/// 示例: /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandParameters">SqlParamter参数数组</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters){return ExecuteReader(connection, (SqlTransaction)null, commandType, commandText, commandParameters, SqlConnectionOwnership.External);}/// <summary>/// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// 示例: /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36);/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">T存储过程名</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, 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 ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);}else {return ExecuteReader(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值./// </summary>/// <remarks>/// 示例: /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "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, CommandType commandType, string commandText){return ExecuteReader(transaction, commandType, commandText, (SqlParameter[])null);}/// <summary>/// [调用者方式]执行指定数据库事务的数据阅读器,指定参数./// </summary>/// <remarks>/// 示例: /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 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, CommandType commandType, string commandText, 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, please provide an open transaction.", "transaction" );return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External);}/// <summary>/// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36);/// </remarks>/// <param name="transaction">一个有效的连接事务</param>/// <param name="spName">存储过程名称</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReader(SqlTransaction transaction, string spName, 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, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果有参数值if ((parameterValues != null) && (parameterValues.Length > 0)) {SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);AssignParameterValues(commandParameters, parameterValues);return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteReader(transaction, CommandType.StoredProcedure, spName);}}#endregion ExecuteReader数据阅读器#region ExecuteScalar 返回结果集中的第一行第一列/// <summary>/// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 示例: /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount");/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText){// 执行参数为空的方法return ExecuteScalar(connectionString, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 示例: /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters){if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );// 创建并打开数据库连接对象,操作完成释放对象.using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();// 调用指定数据库连接字符串重载方法.return ExecuteScalar(connection, commandType, commandText, commandParameters);}}/// <summary>/// 执行指定数据库连接字符串的命令,指定参数值,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36);/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="spName">存储过程名称</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(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 ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 示例: /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount");/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText){// 执行参数为空的方法return ExecuteScalar(connection, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 示例: /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters){if( connection == null ) throw new ArgumentNullException( "connection" );// 创建SqlCommand命令,并进行预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection );// 执行SqlCommand命令,并返回结果.object retval = cmd.ExecuteScalar();// 清除参数,以便再次使用.cmd.Parameters.Clear();if( mustCloseConnection )connection.Close();return retval;}/// <summary>/// 执行指定数据库连接对象的命令,指定参数值,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36);/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名称</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(SqlConnection connection, string spName, 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 ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteScalar(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定数据库事务的命令,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 示例: /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount");/// </remarks>/// <param name="transaction">一个有效的连接事务</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText){// 执行参数为空的方法return ExecuteScalar(transaction, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 示例: /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 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 object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText, 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, please provide an open transaction.", "transaction" );// 创建SqlCommand命令,并进行预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );// 执行SqlCommand命令,并返回结果.object retval = cmd.ExecuteScalar();// 清除参数,以便再次使用.cmd.Parameters.Clear();return retval;}/// <summary>/// 执行指定数据库事务的命令,指定参数值,返回结果集中的第一行第一列./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36);/// </remarks>/// <param name="transaction">一个有效的连接事务</param>/// <param name="spName">存储过程名称</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalar(SqlTransaction transaction, string spName, 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, please provide an open 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, spName);// 给存储过程参数赋值AssignParameterValues(commandParameters, parameterValues);// 调用重载方法return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteScalar(transaction, CommandType.StoredProcedure, spName);}}#endregion ExecuteScalar #region ExecuteXmlReader XML阅读器/// <summary>/// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回./// </summary>/// <remarks>/// 示例: /// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders");/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句 using "FOR XML AUTO"</param>/// <returns>返回XmlReader结果集对象.</returns>public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText){// 执行参数为空的方法return ExecuteXmlReader(connection, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数./// </summary>/// <remarks>/// 示例: /// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</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, CommandType commandType, string commandText, params SqlParameter[] commandParameters){if( connection == null ) throw new ArgumentNullException( "connection" );bool mustCloseConnection = false;// 创建SqlCommand命令,并进行预处理SqlCommand cmd = new SqlCommand();try{PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection );// 执行命令XmlReader retval = cmd.ExecuteXmlReader();// 清除参数,以便再次使用.cmd.Parameters.Clear();return retval;}catch{ if( mustCloseConnection )connection.Close();throw;}}/// <summary>/// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// XmlReader r = ExecuteXmlReader(conn, "GetOrders", 24, 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, string spName, 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 ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回./// </summary>/// <remarks>/// 示例: /// XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders");/// </remarks>/// <param name="transaction">一个有效的连接事务</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>/// <param name="commandText">存储过程名称或T-SQL语句 using "FOR XML AUTO"</param>/// <returns>返回XmlReader结果集对象.</returns>public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText){// 执行参数为空的方法return ExecuteXmlReader(transaction, commandType, commandText, (SqlParameter[])null);}/// <summary>/// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数./// </summary>/// <remarks>/// 示例: /// XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));/// </remarks>/// <param name="transaction">一个有效的连接事务</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</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, CommandType commandType, string commandText, 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, please provide an open transaction.", "transaction" );// 创建SqlCommand命令,并进行预处理SqlCommand cmd = new SqlCommand();bool mustCloseConnection = false;PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );// 执行命令XmlReader retval = cmd.ExecuteXmlReader();// 清除参数,以便再次使用.cmd.Parameters.Clear();return retval; }/// <summary>/// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// XmlReader r = ExecuteXmlReader(trans, "GetOrders", 24, 36);/// </remarks>/// <param name="transaction">一个有效的连接事务</param>/// <param name="spName">存储过程名称</param>/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>/// <returns>返回一个包含结果集的DataSet.</returns>public static XmlReader ExecuteXmlReader(SqlTransaction transaction, string spName, 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, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果有参数值if ((parameterValues != null) && (parameterValues.Length > 0)) {// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 给存储过程参数赋值AssignParameterValues(commandParameters, parameterValues);// 调用重载方法return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters);}else {// 没有参数值return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName);}}#endregion ExecuteXmlReader 阅读器结束#region FillDataset 填充数据集/// <summary>/// 执行指定数据库连接字符串的命令,映射数据表并填充数据集./// </summary>/// <remarks>/// 示例: /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", 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, CommandType commandType, string commandText, 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, commandType, commandText, dataSet, tableNames);}}/// <summary>/// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数./// </summary>/// <remarks>/// 示例: /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</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, CommandType commandType,string commandText, DataSet dataSet, string[] tableNames,params SqlParameter[] commandParameters){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, commandType, commandText, dataSet, tableNames, commandParameters);}}/// <summary>/// 执行指定数据库连接字符串的命令,映射数据表并填充数据集,指定存储过程参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 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, string spName,DataSet dataSet, string[] tableNames,params object[] parameterValues){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, spName, dataSet, tableNames, parameterValues);}}/// <summary>/// 执行指定数据库连接对象的命令,映射数据表并填充数据集./// </summary>/// <remarks>/// 示例: /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, 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, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames){FillDataset(connection, commandType, commandText, dataSet, tableNames, null);}/// <summary>/// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定参数./// </summary>/// <remarks>/// 示例: /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));/// </remarks>/// <param name="connection">一个有效的数据库连接对象</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>public static void FillDataset(SqlConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames,params SqlParameter[] commandParameters){FillDataset(connection, null, commandType, commandText, dataSet, tableNames, commandParameters);}/// <summary>/// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定存储过程参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 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, string spName, DataSet dataSet, string[] tableNames,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)) {// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 给存储过程参数赋值AssignParameterValues(commandParameters, parameterValues);// 调用重载方法FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);}else {// 没有参数值FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames);} }/// <summary>/// 执行指定数据库事务的命令,映射数据表并填充数据集./// </summary>/// <remarks>/// 示例: /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, 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, CommandType commandType, string commandText,DataSet dataSet, string[] tableNames){FillDataset (transaction, commandType, commandText, dataSet, tableNames, null); }/// <summary>/// 执行指定数据库事务的命令,映射数据表并填充数据集,指定参数./// </summary>/// <remarks>/// 示例: /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24));/// </remarks>/// <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>public static void FillDataset(SqlTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames,params SqlParameter[] commandParameters){FillDataset(transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters);}/// <summary>/// 执行指定数据库事务的命令,映射数据表并填充数据集,指定存储过程参数值./// </summary>/// <remarks>/// 此方法不提供访问存储过程输出参数和返回值参数./// /// 示例: /// FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 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, string spName,DataSet dataSet, string[] tableNames,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, please provide an open transaction.", "transaction" );if( dataSet == null ) throw new ArgumentNullException( "dataSet" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果有参数值if ((parameterValues != null) && (parameterValues.Length > 0)) {// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 给存储过程参数赋值AssignParameterValues(commandParameters, parameterValues);// 调用重载方法FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);}else {// 没有参数值FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames);} }/// <summary>/// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,映射数据表并填充数据集,DataSet/TableNames/SqlParameters./// </summary>/// <remarks>/// 示例: /// FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 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, SqlTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames,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, connection, transaction, commandType, commandText, commandParameters, 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, dataSet, "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, DataSet dataSet, 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, string spName, 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)) {// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 将源表的列到映射到DataSet命令中.for (int index=0; index < sourceColumns.Length; index++)commandParameters[index].SourceColumn = sourceColumns[index];// Attach the discovered parameters to the SqlCommand objectAttachParameters (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){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回受影响的行数./// </summary>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回影响的行数</returns>public static int ExecuteNonQueryTypedParams(SqlConnection connection, String spName, DataRow dataRow){if( connection == null ) throw new ArgumentNullException( "connection" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if (dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回受影响的行数./// </summary>/// <param name="transaction">一个有效的连接事务 object</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回影响的行数</returns>public static int ExecuteNonQueryTypedParams(SqlTransaction transaction, String spName, DataRow dataRow){if( transaction == null ) throw new ArgumentNullException( "transaction" );if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// Sf the row has values, the store procedure parameters must be initializedif (dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);}}#endregion#region ExecuteDatasetTypedParams 类型化参数(DataRow)/// <summary>/// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataSet./// </summary>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回一个包含结果集的DataSet.</returns>public static DataSet ExecuteDatasetTypedParams(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){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataSet./// </summary>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回一个包含结果集的DataSet.</returns>/// public static DataSet ExecuteDatasetTypedParams(SqlConnection connection, String spName, DataRow dataRow){if( connection == null ) throw new ArgumentNullException( "connection" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回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, String spName, DataRow dataRow){if( transaction == null ) throw new ArgumentNullException( "transaction" );if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName);}}#endregion#region ExecuteReaderTypedParams 类型化参数(DataRow)/// <summary>/// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataReader./// </summary>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReaderTypedParams(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 ){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataReader./// </summary>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回包含结果集的SqlDataReader</returns>public static SqlDataReader ExecuteReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow){if( connection == null ) throw new ArgumentNullException( "connection" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回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, String spName, DataRow dataRow){if( transaction == null ) throw new ArgumentNullException( "transaction" );if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0 ){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName);}}#endregion#region ExecuteScalarTypedParams 类型化参数(DataRow)/// <summary>/// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列./// </summary>/// <param name="connectionString">一个有效的数据库连接字符串</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalarTypedParams(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){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列./// </summary>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalarTypedParams(SqlConnection connection, String spName, DataRow dataRow){if( connection == null ) throw new ArgumentNullException( "connection" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列./// </summary>/// <param name="transaction">一个有效的连接事务 object</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回结果集中的第一行第一列</returns>public static object ExecuteScalarTypedParams(SqlTransaction transaction, String spName, DataRow dataRow){if( transaction == null ) throw new ArgumentNullException( "transaction" );if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName);}}#endregion#region ExecuteXmlReaderTypedParams 类型化参数(DataRow)/// <summary>/// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集./// </summary>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名称</param>/// <param name="dataRow">使用DataRow作为参数值</param>/// <returns>返回XmlReader结果集对象.</returns>public static XmlReader ExecuteXmlReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow){if( connection == null ) throw new ArgumentNullException( "connection" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);}}/// <summary>/// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回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, String spName, DataRow dataRow){if( transaction == null ) throw new ArgumentNullException( "transaction" );if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );// 如果row有值,存储过程必须初始化.if( dataRow != null && dataRow.ItemArray.Length > 0){// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);// 分配参数值AssignParameterValues(commandParameters, dataRow);return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters);}else{return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, 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, string spName, 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, string commandText, 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, spName, 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, string spName, 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, spName, 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, spName, 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, string spName, bool includeReturnValueParameter){if( connection == null ) throw new ArgumentNullException( "connection" );using (SqlConnection clonedConnection = (SqlConnection)((ICloneable)connection).Clone()){return GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter);}}/// <summary>/// [私有]返回指定的存储过程的参数集(使用连接对象)/// </summary>/// <param name="connection">一个有效的数据库连接对象</param>/// <param name="spName">存储过程名</param>/// <param name="includeReturnValueParameter">是否包含返回值参数</param>/// <returns>返回SqlParameter参数数组</returns>private static SqlParameter[] GetSpParameterSetInternal(SqlConnection connection, string spName, 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, spName, includeReturnValueParameter);paramCache[hashKey] = spParameters;cachedParameters = spParameters;}return CloneParameters(cachedParameters);}#endregion 参数集检索结束} }

2 使用

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;namespace SQL.Access
{public class SqlService {public string ConnectionString { get; set; }public SqlService(){ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];//读取数据库连接的配置}//多表连接查询和传值以及分页查询public DataTable GetTableList(int pageIndex, int pageSize, int providerindex = 0, int businessindex = 0, int currentstatus = 0, string entityCode = null, DateTime? starttime = null, DateTime? stoptime = null){string sql = @"SELECT W.*, D.*, AH.*, A.Filed1, A.Filed2, A.Filed3, A.FiledFROM  Table1 A,Table2 W LEFT JOIN(SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.Filed DESC) N,H.* FROM Table3 H) MWHERE M.N=1)AH on W.Filed = AH.Filed  LEFT JOIN(SELECT * FROM Table4 C, Table5 B WHERE C.Filed1 = B.Filed1 AND C.Filed2 = 1)D ON W.Filed1 = D.Filed1WHERE A.Filed3= W.Filed3 AND ";if (businessindex == 0 && providerindex == 0 && currentstatus == 0 && starttime == null && stoptime == null){//sql = "select w.*, (select a.alarmdescription  from m_alarm a where a.alarmindex = w.alarmindex)  as alarmdescription from M_WORKORDER w";}else{if (!string.IsNullOrWhiteSpace(entityCode))sql += "entityCode = '" + entityCode + "' and ";if (providerindex != 0)sql += "w.providerindex = " + providerindex + " and ";if (businessindex != 0)sql += "w.businessindex = " + businessindex + " and ";if (currentstatus != 0)sql += "w.currentstatus = " + currentstatus + " and ";if (starttime != null)sql += "CONVERT(varchar(100),w.createtime, 20) >= '" + starttime.Value.ToString("yyyy-MM-dd HH:mm:ss") + "' and ";if (stoptime != null)sql += "CONVERT(varchar(100),w.createtime, 20) <= '" + stoptime.Value.ToString("yyyy-MM-dd HH:mm:ss") + "' and ";}sql = sql.Trim(new char[] { ' ', 'a', 'n', 'd', ' ' });//内含多个if执行之后可能多一个and,此处用于去除andsql += " order by d.Filed4 ";string connstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];DataTable dt = SqlHelper.ExecuteDataset(connstr, CommandType.Text, sql, pageIndex, pageSize).Tables[0];return dt;}//简单的执行sqlpublic int GetWorkOrderCount(int providerindex = 0, int businessindex = 0, int currentstatus = 0, DateTime? starttime = null, DateTime? stoptime = null){string sql = "select count(*) from Table w where w.Filed>3";string connstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];int totalCount = int.Parse(SqlHelper.ExecuteScalar(connstr, CommandType.Text, sql).ToString());return totalCount;}//事务的写法public string InsertTableInfo(int index1, string str, DateTime time, int index2=0){string entityIndex = string.Empty;string sqlInsert = "INSERT INTO Table (Filed1,Filed2,Filed3,Filed4) ";sqlInsert += "VALUES (@Filed1, @Filed2, @Filed3, @Filed4)";string connstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];SqlConnection conn = new SqlConnection(connstr);//创建连接conn.Open();SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);//开启事务try{SqlParameter[] inParms = {new SqlParameter("@Filed1", SqlDbType.Int),new SqlParameter("@Filed2", SqlDbType.Int),new SqlParameter("@Filed3", SqlDbType.DateTime),new SqlParameter("@Filed4", SqlDbType.NVarChar, 32),inParms[0].Value = index1;inParms[1].Value = index2;inParms[2].Value = time;inParms[3].Value = str;SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlInsert, inParms);//执行sql注意这里面传递的是事务,其余执行语句也应该传递事务string Seqcurrent = "SELECT current_value FROM sys.sequences WHERE name = 'TEST_SEQ'";//得到序列的当前值string sqlInsertHandle = "INSERT INTO Table2 (Filed1,Filed2) ";// System.Configuration.ConfigurationManager.AppSettings["OrderPrefixString"]前缀名+职工标示发(0000000234)sqlInsertHandle += "VALUES ('" + System.Configuration.ConfigurationManager.AppSettings["OrderPrefixString"] + "' + rtrim(ltrim(right(cast('00000000'+rtrim(cast(@Text_SEQ as int)) as varchar(20)),10))) , @Filed2)";SqlParameter[] inParmsHandle = {new SqlParameter("@Test_SEQ", SqlDbType.VarChar,20),new SqlParameter("@Test_SEQ", SqlDbType.int)    };inParmsHandle[0].Value = Seqcurrent;inParmsHandle[1].Value = index2;SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlInsertHandle, inParmsHandle);string sqlSearchIndex = "SELECT current_value FROM sys.sequences WHERE name = 'TEST_SEQ'";object obj = SqlHelper.ExecuteScalar(trans, CommandType.Text, sqlSearchIndex);entityIndex = System.Configuration.ConfigurationManager.AppSettings["OrderPrefixString"] + int.Parse(obj.ToString()).ToString("00000000");trans.Commit();}catch (System.Exception e){trans.Rollback();throw new Exception(e.Message);}finally{conn.Close();}return entityIndex;}
//获取数量public DataTable GeTableCounte(string orderindex){string sql = "select * from Table where orderindex = '" + orderindex + "'";string connstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];DataTable dr = SqlHelper.ExecuteDataset(connstr, CommandType.Text, sql).Tables[0];return dr;}//删除表数据public void DeleteTableInfo(string Field){string sql = "delete from Table where Field = '" + Field + "'";string connstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];SqlHelper.ExecuteNonQuery(connstr, CommandType.Text, sql);}//更新表数据public void UpdateTableInfo(string tity, int index){string sqlUpdate = "UPDATE Table SET Field1 = @Field1 WHERE Field2 = @Field2";string connstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];SqlParameter[] upParms = {new SqlParameter("@Field1", SqlDbType.NVarChar, 32),new SqlParameter("@Field2", SqlDbType.Int),};upParms[0].Value = tity;upParms[1].Value = Field2;SqlHelper.ExecuteNonQuery(connstr, CommandType.Text, sqlUpdate, upParms);}//调用存储过程传递参数时注意与存储过程中的参数名一致public DataTable GetMaintenanceReportData(int Index, DateTime startTime, DateTime endTime){var procedureName = "PT_TEST_REPORT";//自己定义好的存储过程var parameters = new SqlParameter[]{new SqlParameter("INDEX", SqlDbType.Int),new SqlParameter("START_TIME", SqlDbType.DateTime),new SqlParameter("stop_time", SqlDbType.DateTime),};parameters[0].Direction = ParameterDirection.Input;//这三个是存储过程默认的传参类型可不写parameters[1].Direction = ParameterDirection.Input;parameters[2].Direction = ParameterDirection.Input;parameters[0].Value = Index;parameters[1].Value = startTime;parameters[2].Value = endTime;DataTable dt = SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, procedureName, parameters).Tables[0];return dt;}} }

*以上表明列名均隐藏化了,只为展示怎么用,应为SQL server是微软的古只用把SqlHelper复制到自己的项目中即可使用,方便操作数据库

转载于:https://www.cnblogs.com/wangboke/p/5535483.html

相关文章:

python框架之Flask基础篇(一)

一.第一个hello world程序 # codingutf-8 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello World!if __name__ __main__:app.run(debugTrue) 1.app参数的设置&#xff1a; 以下几种方式全部拿debug模式举例&#xff1a; .方式一&…

flask部署机器学习_如何开发端到端机器学习项目并使用Flask将其部署到Heroku

flask部署机器学习Theres one question I always get asked regarding Data Science:关于数据科学&#xff0c;我经常被问到一个问题&#xff1a; What is the best way to master Data Science? What will get me hired?掌握数据科学的最佳方法是什么&#xff1f; 什么会雇…

UVALive2678:Subsequence

UVALive2678:Subsequence 题目大意 给定一个数组A和一个整数S。求数组A中&#xff0c;连续且之和不小于S的连续子序列长度最小值。 要求复杂度:Ο(n) Solution 用变量L表示所选区间最左端下标&#xff0c;用变量R表示所选区间最右端下标&#xff0c;用变量sum表示所选区间的和。…

【BZOJ-3712】Fiolki LCA + 倍增 (idea题)

3712: [PA2014]Fiolki Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 303 Solved: 67[Submit][Status][Discuss]Description 化学家吉丽想要配置一种神奇的药水来拯救世界。吉丽有n种不同的液体物质&#xff0c;和n个药瓶&#xff08;均从1到n编号&#xff09;。初始时&am…

访问系统相册或调用摄像头

头文件&#xff1a;#import <MobileCoreServices/MobileCoreServices.h> 协议&#xff1a;<UINavigationControllerDelegate, UIImagePickerControllerDelegate> // 调用系统相册获取图片 - (IBAction)getImageFromAlbum:(id)sender {// 判断系统相册是否可用&…

unity镜像_通过镜像学习Unity Multiplayer Basics

unity镜像Unity is one of the most well-known and established engines for game development, and Mirror is a third-party, open source networking solution that allows you to add multiplayer to your games.Unity是最著名的游戏开发引擎之一&#xff0c;而Mirror是第…

java内存模型和线程安全

转载于:https://www.cnblogs.com/Michael2397/p/8397451.html

测试,发布,质量保障,用户体验

1.在实际项目中何时开始设计用户体验&#xff1a;用户的第一印象&#xff1b;从用户的角度考虑问题&#xff1b;软件啊服务始终要记住用户的选择&#xff1b;短期刺激和长期影响 2.测试经验交流&#xff1a;基本名词解释及分类&#xff1b;按测试设计的方法分类&#xff1b;按测…

UIImage存为本地文件与UIImage转换为NSData

UIImage *image"XXX"; //png格式 NSData *imagedataUIImagePNGRepresentation(image); //JEPG格式 //NSData *imagedataUIImageJEPGRepresentation(image); NSArray*pathsNSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString …

如何在JavaScript中实现链接列表

If you are learning data structures, a linked list is one data structure you should know. If you do not really understand it or how it is implemented in JavaScript, this article is here to help you. 如果您正在学习数据结构&#xff0c;则链表是您应该知道的一种…

SVG.path_不连续的线段

1、之前 用<path/>画的 线段等 都是连续的&#xff0c;想知道 是否能画 不连续的线段等 结论&#xff1a;可以 2、测试代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <svg width"1000" height"800" viewBo…

Leetcode 之Binary Tree Postorder Traversal(44)

后序遍历&#xff0c;比先序和中序都要复杂。访问一个结点前&#xff0c;需要先判断其右孩子是否被访问过。如果是&#xff0c;则可以访问该结点&#xff1b;否则&#xff0c;需要先处理右子树。 vector<int> postorderTraversal(TreeNode *root){vector<int> resu…

如何创建自己的ESLint配置包

ESLint is a powerful tool that helps you enforce consistent coding conventions and ensure quality in your JavaScript codebase. ESLint是一个功能强大的工具&#xff0c;可帮助您实施一致的编码约定并确保JavaScript代码库的质量。 Coding conventions are sometimes …

MySQL更新命令_UPDATE

创建测试表 mysql> CREATE TABLE product (-> proID int(11) NOT NULL AUTO_INCREMENT COMMENT 商品表主键,-> price decimal(10,2) NOT NULL COMMENT 商品价格,-> type int(11) NOT NULL COMMENT 商品类别(0生鲜,1食品,2生活),-> dtime datetime N…

KVC与KVO

1、键值编码KVC常用的KVC操作方法如下&#xff1a;• 动态设置&#xff1a; setValue:属性值 forKey:属性名&#xff08;用于简单路径&#xff09;、setValue:属性值 forKeyPath:属性路径&#xff08;用于复合路径&#xff0c;例如Person有一个Account类型的属性&#xff0c…

javaScript 工作必知(三) String .的方法从何而来?

String 我们知道javascript 包括&#xff1a;number&#xff0c;string&#xff0c;boolean,null,undefined 基本类型和Object 类型。 在我的认知中&#xff0c;方法属性应该是对象才可以具有的。 var str"hello,world";var sstr.subString(1,4);//ellalert(typeof…

s3 aws_您需要了解的有关AWS S3的所有信息

s3 awsThis article will provide an in-depth introduction to AWS S3 — the secure, scalable, and super cheap storage service from Amazon Web Services.本文将深入介绍AWS S3-来自Amazon Web Services的安全&#xff0c;可扩展和超便宜的存储服务。 If you have eve…

untitled与前端——初学

“前端” 啥&#xff1f; 百度百科&#xff1a; 就是制作一网页界面。比如360浏览器打开&#xff0c; 包括界面布局设计&#xff0c;搜索框&#xff0c;点击字或图标跳到另一个页面等。 软件Untitled 下载网址&#xff1a;http://www.jetbrains.com/ 下拉 点download&#xff0…

NSThread

NSThread是轻量级的多线程开发&#xff0c;使用起来也并不复杂&#xff0c;但是使用NSThread需要自己管理线程生命周期。 可以使用对象方法&#xff1a; (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument 直接将操作添加到线程中并…

异步发送邮件、短信、微信

用户创建订单的按钮点击后&#xff0c;服务器存储这个订单信息后&#xff0c;调用发送短信、邮件、微信的接口&#xff0c;发送消息。而发送短信、邮件、微信都要涉及第三方的处理&#xff0c;服务器又要发送一个新的包裹给一个新的服务器&#xff0c;告诉他帮我发一个信息出去…

英语面试简短问题_用简单的英语解释产品设计

英语面试简短问题Product design is the process you go through when you conceptualize and build a product.产品设计是概念化和构建产品时要经历的过程。 The path to building – hardware, software, or even simple prototypes – has different steps and approaches.…

6-12 二叉搜索树的操作集

6-12 二叉搜索树的操作集&#xff08;30 分&#xff09; 本题要求实现给定二叉搜索树的5种常用操作。 函数接口定义&#xff1a; BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTree BST, ElementType X ); Position Find( BinTree BST, ElementType X );…

iOS关于自定义rightBarButtonItem

在常见iOS开发中,我们常遇到这样的需求,如下: 我们需要自定义导航栏右侧按钮,常见的自定义包装按钮如下: //设置rightItem; UIButton *btn [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame CGRectMake(0, 0, 40, 30); btn.selected NO; [btn setTitle:"管理&…

URL里汉字转码

URL里面不能包含中文。 解决办法&#xff1a;进行转码 NSString *urlStr[NSString stringWithFormat:kLotteryBar_putOutReviewUrl,_token,self.reviews_id,_User_Id,reviews_content]; urlStr[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

electron.js_在使用Electron.js之前我希望知道的事情

electron.jsIn this article, Ill share how you can avoid some of the mistakes I made when learning about Electron.js &#x1f926;‍♂️. I hope it helps!在本文中&#xff0c;我将分享如何避免在学习Electron.js &#x1f926;‍&#x1f926;️时犯的一些错误。 希…

Entity Framework的启动速度优化

最近开发的服务放到IIS上寄宿之后&#xff0c;遇到一些现象&#xff0c;比如刚部署之后&#xff0c;第一次启动很慢&#xff1b;程序放置一会儿&#xff0c;再次请求也会比较慢。比如第一个问题&#xff0c;可以解释为初次请求某一个服务的时候&#xff0c;需要把程序集加载到内…

NSURLConnection的简单使用

遵循代理&#xff1a;NSURLConnectionDataDelegate -(void)fetchWebData:(id)sender{ self.isLoadingYES;NSString *urlStrkRequestUrlStr(self.page);NSURL *url[NSURL URLWithString:urlStr];NSURLRequest *request[NSURLRequest requestWithURL:url];self.connection[N…

tcp reno_如何使用称为Reno Expo的简单入门工具包构建全栈应用程序

tcp renoBuilding any new project from scratch can be intimidating. Theres a lot to decide before you can even start coding to test out your idea.从头开始构建任何新项目都可能令人生畏。 在开始编码以检验您的想法之前&#xff0c;还有很多决定。 How are you buil…

不同命名空间的对象二进制反序列化问题

本质上说&#xff0c;这并不是二进制序列化的问题&#xff0c;甚至不关序列化的问题。 你想要的是在两个内部结构一致但在不同命名空间&#xff08;甚至不同项目&#xff09;的同名类间做类型转换。 这个问题很常见&#xff0c;因为实际工作中经常会有此类需求&#xff0c;但是…

对大文件的断点续传

注&#xff1a;#import "YGFileDownloader.h"是对NSURLConnection的简单封装 #import "YGResumeDownloadViewController.h" #import "NSStringutil.h"#import "YGFileDownloader.h"#define URL "http://dlsw.baidu.com/sw-searc…