using System.Data;
using System.Xml;
using System.Data.sqlClient;
using System.Collections;
using System.Configuration;
namespace BookDAL
{
/// <summary>
/// sqlServer数据访问帮助类
/// </summary>
public sealed class sqlHelper
{
#region 私有构造函数和方法
private sqlHelper() { }
/// <summary>
/// 将sqlParameter参数数组(参数值)分配给sqlCommand命令.
/// 这个方法将给任何一个参数分配dbnull.Value;
/// 该操作将阻止默认值的使用.
/// </summary>
/// <param name="command">命令名</param>
/// <param name="commandParameters">sqlParameters数组</param>
private static void AttachParameters(sqlCommand command,sqlParameter[] commandParameters)
{
if (command == null) throw new ArgumentNullException("command");
if (commandParameters != null)
{
foreach (sqlParameter p in commandParameters)
{
if (p != null)
{
// 检查未分配值的输出参数,将其分配以dbnull.Value.
if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) &&
(p.Value == null))
{
p.Value = dbnull.Value;
}
command.Parameters.Add(p);
}
}
}
}
/// <summary>
/// 将DaTarow类型的列值分配到sqlParameter参数数组.
/// </summary>
/// <param name="commandParameters">要分配值的sqlParameter参数数组</param>
/// <param name="daTarow">将要分配给存储过程参数的DaTarow</param>
private static void AssignParameterValues(sqlParameter[] commandParameters,DaTarow daTarow)
{
if ((commandParameters == null) || (daTarow == null))
{
return;
}
int i = 0;
// 设置参数值
foreach (sqlParameter commandParameter in commandParameters)
{
// 创建参数名称,如果不存在,只抛出一个异常.
if (commandParameter.ParameterName == null ||
commandParameter.ParameterName.Length <= 1)
throw new Exception(
string.Format("请提供参数{0}一个有效的名称{1}.",i,commandParameter.ParameterName));
// 从daTarow的表中获取为参数数组中数组名称的列的索引.
// 如果存在和参数名称相同的列,则将列值赋给当前名称的参数.
if (daTarow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1)
commandParameter.Value = daTarow[commandParameter.ParameterName.Substring(1)];
i++;
}
}
/// <summary>
/// 将一个对象数组分配给sqlParameter参数数组.
/// </summary>
/// <param name="commandParameters">要分配值的sqlParameter参数数组</param>
/// <param name="parameterValues">将要分配给存储过程参数的对象数组</param>
private static void AssignParameterValues(sqlParameter[] commandParameters,object[] parameterValues)
{
if ((commandParameters == null) || (parameterValues == null))
{
return;
}
// 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常.
if (commandParameters.Length != parameterValues.Length)
{
throw new ArgumentException("参数值个数与参数不匹配.");
}
// 给参数赋值
for (int i = 0,j = commandParameters.Length; i < j; i++)
{
// If the current array value derives from IDbDataParameter,then assign its Value property
if (parameterValues[i] is IDbDataParameter)
{
IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i];
if (paramInstance.Value == null)
{
commandParameters[i].Value = dbnull.Value;
}
else
{
commandParameters[i].Value = paramInstance.Value;
}
}
else if (parameterValues[i] == null)
{
commandParameters[i].Value = dbnull.Value;
}
else
{
commandParameters[i].Value = parameterValues[i];
}
}
}
/// <summary>
/// 预处理用户提供的命令,数据库连接/事务/命令类型/参数
/// </summary>
/// <param name="command">要处理的sqlCommand</param>
/// <param name="connection">数据库连接</param>
/// <param name="transaction">一个有效的事务或者是null值</param>
/// <param name="commandType">命令类型 (存储过程,命令文本,其它.)</param>
/// <param name="commandText">存储过程名或都T-sql命令文本</param>
/// <param name="commandParameters">和命令相关联的sqlParameter参数数组,如果没有参数为'null'</param>
/// <param name="mustCloseConnection"><c>true</c> 如果连接是打开的,则为true,其它情况下为false.</param>
private static void PrepareCommand(sqlCommand command,sqlConnection connection,sqlTransaction transaction,CommandType commandType,string commandText,sqlParameter[] commandParameters,out bool mustCloseConnection)
{
if (command == null) throw new ArgumentNullException("command");
if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
// If the provided connection is not open,we will open it
if (connection.State != ConnectionState.Open)
{
mustCloseConnection = true;
connection.open();
}
else
{
mustCloseConnection = false;
}
// 给命令分配一个数据库连接.
command.Connection = connection;
// 设置命令文本(存储过程名或sql语句)
command.CommandText = commandText;
// 分配事务
if (transaction != null)
{
if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,please provide an open transaction.","transaction");
command.Transaction = transaction;
}
// 设置命令类型.
command.CommandType = commandType;
// 分配命令参数
if (commandParameters != null)
{
AttachParameters(command,commandParameters);
}
return;
}
#endregion 私有构造函数和方法结束
#region 数据库连接
/// <summary>
/// 一个有效的数据库连接字符串
/// </summary>
/// <returns></returns>
public static string GetConnSting()
{
return ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
}
/// <summary>
/// 一个有效的数据库连接对象
/// </summary>
/// <returns></returns>
public static sqlConnection GetConnection()
{
sqlConnection Connection = new sqlConnection(sqlHelper.GetConnSting());
return Connection;
}
#endregion
#region ExecuteNonQuery命令
/// <summary>
/// 执行指定连接字符串,类型的sqlCommand.
/// </summary>
/// <remarks>
/// 示例:
/// int result = ExecuteNonQuery(connString,CommandType.StoredProcedure,"PublishOrders");
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="commandType">命令类型 (存储过程,其它.)</param>
/// <param name="commandText">存储过程名称或sql语句</param>
/// <returns>返回命令影响的行数</returns>
public static int ExecuteNonQuery(string connectionString,string commandText)
{
return ExecuteNonQuery(connectionString,commandType,commandText,(sqlParameter[])null);
}
/// <summary>
/// 执行指定连接字符串,类型的sqlCommand.如果没有提供参数,不返回结果.
/// </summary>
/// <remarks>
/// 示例:
/// int result = ExecuteNonQuery(connString,"PublishOrders",new sqlParameter("@prodid",24));
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="commandType">命令类型 (存储过程,其它.)</param>
/// <param name="commandText">存储过程名称或sql语句</param>
/// <param name="commandParameters">sqlParameter参数数组</param>
/// <returns>返回命令影响的行数</returns>
public static int ExecuteNonQuery(string connectionString,params sqlParameter[] commandParameters)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
using (sqlConnection connection = new sqlConnection(connectionString))
{
connection.open();
return ExecuteNonQuery(connection,commandParameters);
}
}
/// <summary>
/// 执行指定连接字符串的存储过程,将对象数组的值赋给存储过程参数,
/// 此方法需要在参数缓存方法中探索参数并生成参数.
/// </summary>
/// <remarks>
/// 这个方法没有提供访问输出参数和返回值.
/// 示例:
/// int result = ExecuteNonQuery(connString,24,36);
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串/param>
/// <param name="spName">存储过程名称</param>
/// <param name="parameterValues">分配到存储过程输入参数的对象数组</param>
/// <returns>返回受影响的行数</returns>
public static int ExecuteNonQuery(string connectionString,string spName,params object[] parameterValues)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果存在参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从探索存储过程参数(加载到缓存)并分配给存储过程参数数组.
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,spName);
// 给存储过程参数赋值
AssignParameterValues(commandParameters,parameterValues);
return ExecuteNonQuery(connectionString,spName,commandParameters);
}
else
{
// 没有参数情况下
return ExecuteNonQuery(connectionString,spName);
}
}
/// <summary>
/// 执行指定数据库连接对象的命令
/// </summary>
/// <remarks>
/// 示例:
/// int result = ExecuteNonQuery(conn,"PublishOrders");
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(sqlConnection connection,string commandText)
{
return ExecuteNonQuery(connection,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库连接对象的命令
/// </summary>
/// <remarks>
/// 示例:
/// int result = ExecuteNonQuery(conn,24));
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
/// <param name="commandText">T存储过程名称或T-sql语句</param>
/// <param name="commandParameters">sqlParamter参数数组</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(sqlConnection connection,params sqlParameter[] commandParameters)
{
if (connection == null) throw new ArgumentNullException("connection");
// 创建sqlCommand命令,并进行预处理
sqlCommand cmd = new sqlCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd,connection,(sqlTransaction)null,commandParameters,out mustCloseConnection);
// Finally,execute the command
int retval = cmd.ExecuteNonQuery();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
if (mustCloseConnection)
connection.Close();
return retval;
}
/// <summary>
/// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值
/// 示例:
/// int result = ExecuteNonQuery(conn,36);
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(sqlConnection connection,params object[] parameterValues)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,spName);
// 给存储过程分配参数值
AssignParameterValues(commandParameters,parameterValues);
return ExecuteNonQuery(connection,commandParameters);
}
else
{
return ExecuteNonQuery(connection,spName);
}
}
/// <summary>
/// 执行带事务的sqlCommand.
/// </summary>
/// <remarks>
/// 示例.:
/// int result = ExecuteNonQuery(trans,"PublishOrders");
/// </remarks>
/// <param name="transaction">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回影响的行数/returns>
public static int ExecuteNonQuery(sqlTransaction transaction,string commandText)
{
return ExecuteNonQuery(transaction,(sqlParameter[])null);
}
/// <summary>
/// 执行带事务的sqlCommand(指定参数).
/// </summary>
/// <remarks>
/// 示例:
/// int result = ExecuteNonQuery(trans,"Getorders",24));
/// </remarks>
/// <param name="transaction">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">sqlParamter参数数组</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(sqlTransaction transaction,params sqlParameter[] commandParameters)
{
if (transaction == null) throw new ArgumentNullException("transaction");
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction");
// 预处理
sqlCommand cmd = new sqlCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd,transaction.Connection,transaction,out mustCloseConnection);
// 执行
int retval = cmd.ExecuteNonQuery();
// 清除参数集,以便再次使用.
cmd.Parameters.Clear();
return retval;
}
/// <summary>
/// 执行带事务的sqlCommand(指定参数值).
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值
/// 示例:
/// int result = ExecuteNonQuery(conn,trans,36);
/// </remarks>
/// <param name="transaction">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回受影响的行数</returns>
public static int ExecuteNonQuery(sqlTransaction transaction,params object[] parameterValues)
{
if (transaction == null) throw new ArgumentNullException("transaction");
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);
// 调用重载方法
return ExecuteNonQuery(transaction,commandParameters);
}
else
{
// 没有参数值
return ExecuteNonQuery(transaction,spName);
}
}
#endregion ExecuteNonQuery方法结束
#region ExecuteDataset方法
/// <summary>
/// 执行指定数据库连接字符串的命令,返回DataSet.
/// </summary>
/// <remarks>
/// 示例:
/// DataSet ds = ExecuteDataset(connString,"Getorders");
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(string connectionString,string commandText)
{
return ExecuteDataset(connectionString,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库连接字符串的命令,返回DataSet.
/// </summary>
/// <remarks>
/// 示例:
/// DataSet ds = ExecuteDataset(connString,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">sqlParamters参数数组</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(string connectionString,params sqlParameter[] commandParameters)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
// 创建并打开数据库连接对象,操作完成释放对象.
using (sqlConnection connection = new sqlConnection(connectionString))
{
connection.open();
// 调用指定数据库连接字符串重载方法.
return ExecuteDataset(connection,commandParameters);
}
}
/// <summary>
/// 执行指定数据库连接字符串的命令,直接提供参数值,返回DataSet.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值.
/// 示例:
/// DataSet ds = ExecuteDataset(connString,36);
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(string connectionString,params object[] parameterValues)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中检索存储过程参数
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,spName);
// 给存储过程参数分配值
AssignParameterValues(commandParameters,parameterValues);
return ExecuteDataset(connectionString,commandParameters);
}
else
{
return ExecuteDataset(connectionString,spName);
}
}
/// <summary>
/// 执行指定数据库连接对象的命令,返回DataSet.
/// </summary>
/// <remarks>
/// 示例:
/// DataSet ds = ExecuteDataset(conn,"Getorders");
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(sqlConnection connection,string commandText)
{
return ExecuteDataset(connection,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库连接对象的命令,指定存储过程参数,24));
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <param name="commandParameters">sqlParamter参数数组</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(sqlConnection connection,params sqlParameter[] commandParameters)
{
if (connection == null) throw new ArgumentNullException("connection");
// 预处理
sqlCommand cmd = new sqlCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd,out mustCloseConnection);
// 创建sqlDataAdapter和DataSet.
using (sqlDataAdapter da = new sqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
// 填充DataSet.
da.Fill(ds);
cmd.Parameters.Clear();
if (mustCloseConnection)
connection.Close();
return ds;
}
}
/// <summary>
/// 执行指定数据库连接对象的命令,指定参数值,返回DataSet.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输入参数和返回值.
/// 示例.:
/// DataSet ds = ExecuteDataset(conn,36);
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(sqlConnection connection,params object[] parameterValues)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 比缓存中加载存储过程参数
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,parameterValues);
return ExecuteDataset(connection,commandParameters);
}
else
{
return ExecuteDataset(connection,spName);
}
}
/// <summary>
/// 执行指定事务的命令,返回DataSet.
/// </summary>
/// <remarks>
/// 示例:
/// DataSet ds = ExecuteDataset(trans,"Getorders");
/// </remarks>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(sqlTransaction transaction,string commandText)
{
return ExecuteDataset(transaction,(sqlParameter[])null);
}
/// <summary>
/// 执行指定事务的命令,指定参数,24));
/// </remarks>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <param name="commandParameters">sqlParamter参数数组</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(sqlTransaction transaction,out mustCloseConnection);
// 创建 DataAdapter & DataSet
using (sqlDataAdapter da = new sqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds);
cmd.Parameters.Clear();
return ds;
}
}
/// <summary>
/// 执行指定事务的命令,返回DataSet.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输入参数和返回值.
/// 示例.:
/// DataSet ds = ExecuteDataset(trans,36);
/// </remarks>
/// <param name="transaction">事务</param>
/// <param name="spName">存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回一个包含结果集的DataSet</returns>
public static DataSet ExecuteDataset(sqlTransaction transaction,"transaction");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);
return ExecuteDataset(transaction,commandParameters);
}
else
{
return ExecuteDataset(transaction,spName);
}
}
#endregion ExecuteDataset数据集命令结束
#region ExecuteReader 数据阅读器
/// <summary>
/// 枚举,标识数据库连接是由sqlHelper提供还是由调用者提供
/// </summary>
private enum sqlConnectioNownership
{
/// <summary>由sqlHelper提供连接</summary>
Internal,
/// <summary>由调用者提供连接</summary>
External
}
/// <summary>
/// 执行指定数据库连接对象的数据阅读器.
/// </summary>
/// <remarks>
/// 如果是sqlHelper打开连接,当连接关闭DataReader也将关闭.
/// 如果是调用都打开连接,DataReader由调用都管理.
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="transaction">一个有效的事务,或者为 'null'</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <param name="commandParameters">sqlParameters参数数组,如果没有参数则为'null'</param>
/// <param name="connectioNownership">标识数据库连接对象是由调用者提供还是由sqlHelper提供</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
private static sqlDataReader ExecuteReader(sqlConnection connection,sqlConnectioNownership connectioNownership)
{
if (connection == null) throw new ArgumentNullException("connection");
bool mustCloseConnection = false;
// 创建命令
sqlCommand cmd = new sqlCommand();
try
{
PrepareCommand(cmd,out mustCloseConnection);
// 创建数据阅读器
sqlDataReader dataReader;
if (connectioNownership == sqlConnectioNownership.External)
{
dataReader = cmd.ExecuteReader();
}
else
{
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
// 清除参数,以便再次使用..
// HACK: There is a problem here,the output parameter values are fletched
// when the reader is closed,so if the parameters are detached from the command
// then the sqlReader can磘 set its values.
// When this happen,the parameters can磘 be used again in other command.
bool canClear = true;
foreach (sqlParameter commandParameter in cmd.Parameters)
{
if (commandParameter.Direction != ParameterDirection.Input)
canClear = false;
}
if (canClear)
{
cmd.Parameters.Clear();
}
return dataReader;
}
catch
{
if (mustCloseConnection)
connection.Close();
throw;
}
}
/// <summary>
/// 执行指定数据库连接字符串的数据阅读器.
/// </summary>
/// <remarks>
/// 示例:
/// sqlDataReader dr = ExecuteReader(connString,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(string connectionString,string commandText)
{
return ExecuteReader(connectionString,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库连接字符串的数据阅读器,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// sqlDataReader dr = ExecuteReader(connString,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <param name="commandParameters">sqlParamter参数数组(new sqlParameter("@prodid",24))</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(string connectionString,params sqlParameter[] commandParameters)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
sqlConnection connection = null;
try
{
connection = new sqlConnection(connectionString);
connection.open();
return ExecuteReader(connection,null,sqlConnectioNownership.Internal);
}
catch
{
// If we fail to return the sqlDatReader,we need to close the connection ourselves
if (connection != null) connection.Close();
throw;
}
}
/// <summary>
/// 执行指定数据库连接字符串的数据阅读器,指定参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
/// 示例:
/// sqlDataReader dr = ExecuteReader(connString,36);
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(string connectionString,params object[] parameterValues)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
if ((parameterValues != null) && (parameterValues.Length > 0))
{
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,spName);
AssignParameterValues(commandParameters,parameterValues);
return ExecuteReader(connectionString,commandParameters);
}
else
{
return ExecuteReader(connectionString,spName);
}
}
/// <summary>
/// 执行指定数据库连接对象的数据阅读器.
/// </summary>
/// <remarks>
/// 示例:
/// sqlDataReader dr = ExecuteReader(conn,命令文本或其它)</param>
/// <param name="commandText">存储过程名或T-sql语句</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(sqlConnection connection,string commandText)
{
return ExecuteReader(connection,(sqlParameter[])null);
}
/// <summary>
/// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// sqlDataReader dr = ExecuteReader(conn,命令文本或其它)</param>
/// <param name="commandText">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandParameters">sqlParamter参数数组</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(sqlConnection connection,params sqlParameter[] commandParameters)
{
return ExecuteReader(connection,sqlConnectioNownership.External);
}
/// <summary>
/// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
/// 示例:
/// sqlDataReader dr = ExecuteReader(conn,36);
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">T存储过程名</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(sqlConnection connection,params object[] parameterValues)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
if ((parameterValues != null) && (parameterValues.Length > 0))
{
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,parameterValues);
return ExecuteReader(connection,commandParameters);
}
else
{
return ExecuteReader(connection,spName);
}
}
/// <summary>
/// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值.
/// </summary>
/// <remarks>
/// 示例:
/// sqlDataReader dr = ExecuteReader(trans,"Getorders");
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(sqlTransaction transaction,string commandText)
{
return ExecuteReader(transaction,(sqlParameter[])null);
}
/// <summary>
/// [调用者方式]执行指定数据库事务的数据阅读器,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// sqlDataReader dr = ExecuteReader(trans,24));
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(sqlTransaction transaction,"transaction");
return ExecuteReader(transaction.Connection,sqlConnectioNownership.External);
}
/// <summary>
/// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// sqlDataReader dr = ExecuteReader(trans,36);
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="spName">存储过程名称</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReader(sqlTransaction transaction,"transaction");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);
return ExecuteReader(transaction,commandParameters);
}
else
{
// 没有参数值
return ExecuteReader(transaction,spName);
}
}
#endregion ExecuteReader数据阅读器
#region ExecuteScalar 返回结果集中的第一行第一列
/// <summary>
/// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列.
/// </summary>
/// <remarks>
/// 示例:
/// int orderCount = (int)ExecuteScalar(connString,"GetorderCount");
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(string connectionString,string commandText)
{
// 执行参数为空的方法
return ExecuteScalar(connectionString,"GetorderCount",命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(string connectionString,params sqlParameter[] commandParameters)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
// 创建并打开数据库连接对象,操作完成释放对象.
using (sqlConnection connection = new sqlConnection(connectionString))
{
connection.open();
// 调用指定数据库连接字符串重载方法.
return ExecuteScalar(connection,返回结果集中的第一行第一列.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// int orderCount = (int)ExecuteScalar(connString,36);
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名称</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(string connectionString,params object[] parameterValues)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connectionString,parameterValues);
// 调用重载方法
return ExecuteScalar(connectionString,commandParameters);
}
else
{
// 没有参数值
return ExecuteScalar(connectionString,返回结果集中的第一行第一列.
/// </summary>
/// <remarks>
/// 示例:
/// int orderCount = (int)ExecuteScalar(conn,"GetorderCount");
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(sqlConnection connection,string commandText)
{
// 执行参数为空的方法
return ExecuteScalar(connection,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(sqlConnection connection,并进行预处理
sqlCommand cmd = new sqlCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd,out mustCloseConnection);
// 执行sqlCommand命令,并返回结果.
object retval = cmd.ExecuteScalar();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
if (mustCloseConnection)
connection.Close();
return retval;
}
/// <summary>
/// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// int orderCount = (int)ExecuteScalar(conn,36);
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(sqlConnection connection,params object[] parameterValues)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(connection,parameterValues);
// 调用重载方法
return ExecuteScalar(connection,commandParameters);
}
else
{
// 没有参数值
return ExecuteScalar(connection,spName);
}
}
/// <summary>
/// 执行指定数据库事务的命令,返回结果集中的第一行第一列.
/// </summary>
/// <remarks>
/// 示例:
/// int orderCount = (int)ExecuteScalar(trans,"GetorderCount");
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(sqlTransaction transaction,string commandText)
{
// 执行参数为空的方法
return ExecuteScalar(transaction,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库事务的命令,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(sqlTransaction transaction,"transaction");
// 创建sqlCommand命令,以便再次使用.
cmd.Parameters.Clear();
return retval;
}
/// <summary>
/// 执行指定数据库事务的命令,返回结果集中的第一行第一列.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// int orderCount = (int)ExecuteScalar(trans,36);
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="spName">存储过程名称</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(sqlTransaction transaction,"transaction");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// PPull the parameters for this stored procedure from the parameter cache ()
sqlParameter[] commandParameters = sqlHelperParameterCache.GetSpParameterSet(transaction.Connection,parameterValues);
// 调用重载方法
return ExecuteScalar(transaction,commandParameters);
}
else
{
// 没有参数值
return ExecuteScalar(transaction,spName);
}
}
#endregion ExecuteScalar
#region ExecuteXmlReader XML阅读器
/// <summary>
/// 执行指定数据库连接对象的sqlCommand命令,并产生一个XmlReader对象做为结果集返回.
/// </summary>
/// <remarks>
/// 示例:
/// XmlReader r = ExecuteXmlReader(conn,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReader(sqlConnection connection,string commandText)
{
// 执行参数为空的方法
return ExecuteXmlReader(connection,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库连接对象的sqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// XmlReader r = ExecuteXmlReader(conn,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReader(sqlConnection connection,params sqlParameter[] commandParameters)
{
if (connection == null) throw new ArgumentNullException("connection");
bool mustCloseConnection = false;
// 创建sqlCommand命令,并进行预处理
sqlCommand cmd = new sqlCommand();
try
{
PrepareCommand(cmd,out mustCloseConnection);
// 执行命令
XmlReader retval = cmd.ExecuteXmlReader();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
return retval;
}
catch
{
if (mustCloseConnection)
connection.Close();
throw;
}
}
/// <summary>
/// 执行指定数据库连接对象的sqlCommand命令,指定参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// XmlReader r = ExecuteXmlReader(conn,36);
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称 using "FOR XML AUTO"</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReader(sqlConnection connection,parameterValues);
// 调用重载方法
return ExecuteXmlReader(connection,commandParameters);
}
else
{
// 没有参数值
return ExecuteXmlReader(connection,spName);
}
}
/// <summary>
/// 执行指定数据库事务的sqlCommand命令,并产生一个XmlReader对象做为结果集返回.
/// </summary>
/// <remarks>
/// 示例:
/// XmlReader r = ExecuteXmlReader(trans,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReader(sqlTransaction transaction,string commandText)
{
// 执行参数为空的方法
return ExecuteXmlReader(transaction,(sqlParameter[])null);
}
/// <summary>
/// 执行指定数据库事务的sqlCommand命令,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// XmlReader r = ExecuteXmlReader(trans,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句 using "FOR XML AUTO"</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReader(sqlTransaction transaction,out mustCloseConnection);
// 执行命令
XmlReader retval = cmd.ExecuteXmlReader();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
return retval;
}
/// <summary>
/// 执行指定数据库事务的sqlCommand命令,指定参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// XmlReader r = ExecuteXmlReader(trans,36);
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="spName">存储过程名称</param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
/// <returns>返回一个包含结果集的DataSet.</returns>
public static XmlReader ExecuteXmlReader(sqlTransaction transaction,parameterValues);
// 调用重载方法
return ExecuteXmlReader(transaction,commandParameters);
}
else
{
// 没有参数值
return ExecuteXmlReader(transaction,spName);
}
}
#endregion ExecuteXmlReader 阅读器结束
#region FillDataset 填充数据集
/// <summary>
/// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(connString,ds,new string[] {"orders"});
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)</param>
public static void FillDataset(string connectionString,DataSet dataSet,string[] tableNames)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (dataSet == null) throw new ArgumentNullException("dataSet");
// 创建并打开数据库连接对象,操作完成释放对象.
using (sqlConnection connection = new sqlConnection(connectionString))
{
connection.open();
// 调用指定数据库连接字符串重载方法.
FillDataset(connection,dataSet,tableNames);
}
}
/// <summary>
/// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(connString,new string[] {"orders"},命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
public static void FillDataset(string connectionString,
string commandText,string[] tableNames,
params sqlParameter[] commandParameters)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (dataSet == null) throw new ArgumentNullException("dataSet");
// 创建并打开数据库连接对象,tableNames,映射数据表并填充数据集,指定存储过程参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// FillDataset(connString,24);
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名称</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
public static void FillDataset(string connectionString,
DataSet dataSet,
params object[] parameterValues)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (dataSet == null) throw new ArgumentNullException("dataSet");
// 创建并打开数据库连接对象,parameterValues);
}
}
/// <summary>
/// 执行指定数据库连接对象的命令,映射数据表并填充数据集.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(conn,new string[] {"orders"});
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
public static void FillDataset(sqlConnection connection,string[] tableNames)
{
FillDataset(connection,null);
}
/// <summary>
/// 执行指定数据库连接对象的命令,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(conn,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
public static void FillDataset(sqlConnection connection,
params sqlParameter[] commandParameters)
{
FillDataset(connection,commandParameters);
}
/// <summary>
/// 执行指定数据库连接对象的命令,指定存储过程参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// FillDataset(conn,36);
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
public static void FillDataset(sqlConnection connection,
params object[] parameterValues)
{
if (connection == null) throw new ArgumentNullException("connection");
if (dataSet == null) throw new ArgumentNullException("dataSet");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数,parameterValues);
// 调用重载方法
FillDataset(connection,commandParameters);
}
else
{
// 没有参数值
FillDataset(connection,tableNames);
}
}
/// <summary>
/// 执行指定数据库事务的命令,映射数据表并填充数据集.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(trans,new string[] {"orders"});
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
public static void FillDataset(sqlTransaction transaction,string[] tableNames)
{
FillDataset(transaction,null);
}
/// <summary>
/// 执行指定数据库事务的命令,指定参数.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(trans,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
public static void FillDataset(sqlTransaction transaction,
params sqlParameter[] commandParameters)
{
FillDataset(transaction.Connection,commandParameters);
}
/// <summary>
/// 执行指定数据库事务的命令,指定存储过程参数值.
/// </summary>
/// <remarks>
/// 此方法不提供访问存储过程输出参数和返回值参数.
///
/// 示例:
/// FillDataset(trans,new string[]{"orders"},36);
/// </remarks>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="spName">存储过程名称</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
/// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
public static void FillDataset(sqlTransaction transaction,
params object[] parameterValues)
{
if (transaction == null) throw new ArgumentNullException("transaction");
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction");
if (dataSet == null) throw new ArgumentNullException("dataSet");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果有参数值
if ((parameterValues != null) && (parameterValues.Length > 0))
{
// 从缓存中加载存储过程参数,parameterValues);
// 调用重载方法
FillDataset(transaction,commandParameters);
}
else
{
// 没有参数值
FillDataset(transaction,tableNames);
}
}
/// <summary>
/// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,DataSet/TableNames/sqlParameters.
/// </summary>
/// <remarks>
/// 示例:
/// FillDataset(conn,24));
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="transaction">一个有效的连接事务</param>
/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
/// <param name="commandText">存储过程名称或T-sql语句</param>
/// <param name="dataSet">要填充结果集的DataSet实例</param>
/// <param name="tableNames">表映射的数据表数组
/// 用户定义的表名 (可有是实际的表名.)
/// </param>
/// <param name="commandParameters">分配给命令的sqlParamter参数数组</param>
private static void FillDataset(sqlConnection connection,
params sqlParameter[] commandParameters)
{
if (connection == null) throw new ArgumentNullException("connection");
if (dataSet == null) throw new ArgumentNullException("dataSet");
// 创建sqlCommand命令,并进行预处理
sqlCommand command = new sqlCommand();
bool mustCloseConnection = false;
PrepareCommand(command,out mustCloseConnection);
// 执行命令
using (sqlDataAdapter dataAdapter = new sqlDataAdapter(command))
{
// 追加表映射
if (tableNames != null && tableNames.Length > 0)
{
string tableName = "Table";
for (int index = 0; index < tableNames.Length; index++)
{
if (tableNames[index] == null || tableNames[index].Length == 0) throw new ArgumentException("The tableNames parameter must contain a list of tables,a value was provided as null or empty string.","tableNames");
dataAdapter.TableMappings.Add(tableName,tableNames[index]);
tableName += (index + 1).ToString();
}
}
// 填充数据集使用默认表名称
dataAdapter.Fill(dataSet);
// 清除参数,以便再次使用.
command.Parameters.Clear();
}
if (mustCloseConnection)
connection.Close();
}
#endregion
#region UpdateDataset 更新数据集
/// <summary>
/// 执行数据集更新到数据库,指定inserted,updated,or deleted命令.
/// </summary>
/// <remarks>
/// 示例:
/// UpdateDataset(conn,insertCommand,deleteCommand,updateCommand,"Order");
/// </remarks>
/// <param name="insertCommand">[追加记录]一个有效的T-sql语句或存储过程</param>
/// <param name="deleteCommand">[删除记录]一个有效的T-sql语句或存储过程</param>
/// <param name="updateCommand">[更新记录]一个有效的T-sql语句或存储过程</param>
/// <param name="dataSet">要更新到数据库的DataSet</param>
/// <param name="tableName">要更新到数据库的DataTable</param>
public static void UpdateDataset(sqlCommand insertCommand,sqlCommand deleteCommand,sqlCommand updateCommand,string tableName)
{
if (insertCommand == null) throw new ArgumentNullException("insertCommand");
if (deleteCommand == null) throw new ArgumentNullException("deleteCommand");
if (updateCommand == null) throw new ArgumentNullException("updateCommand");
if (tableName == null || tableName.Length == 0) throw new ArgumentNullException("tableName");
// 创建sqlDataAdapter,当操作完成后释放.
using (sqlDataAdapter dataAdapter = new sqlDataAdapter())
{
// 设置数据适配器命令
dataAdapter.UpdateCommand = updateCommand;
dataAdapter.InsertCommand = insertCommand;
dataAdapter.DeleteCommand = deleteCommand;
// 更新数据集改变到数据库
dataAdapter.Update(dataSet,tableName);
// 提交所有改变到数据集.
dataSet.AcceptChanges();
}
}
#endregion
#region CreateCommand 创建一条sqlCommand命令
/// <summary>
/// 创建sqlCommand命令,指定数据库连接对象,存储过程名和参数.
/// </summary>
/// <remarks>
/// 示例:
/// sqlCommand command = CreateCommand(conn,"AddCustomer","CustomerID","CustomerName");
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="sourceColumns">源表的列名称数组</param>
/// <returns>返回sqlCommand命令</returns>
public static sqlCommand CreateCommand(sqlConnection connection,params string[] sourceColumns)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 创建命令
sqlCommand cmd = new sqlCommand(spName,connection);
cmd.CommandType = CommandType.StoredProcedure;
// 如果有参数值
if ((sourceColumns != null) && (sourceColumns.Length > 0))
{
// 从缓存中加载存储过程参数,spName);
// 将源表的列到映射到DataSet命令中.
for (int index = 0; index < sourceColumns.Length; index++)
commandParameters[index].sourceColumn = sourceColumns[index];
// Attach the discovered parameters to the sqlCommand object
AttachParameters(cmd,commandParameters);
}
return cmd;
}
#endregion
#region ExecuteNonQueryTypedParams 类型化参数(DaTarow)
/// <summary>
/// 执行指定连接数据库连接字符串的存储过程,使用DaTarow做为参数值,返回受影响的行数.
/// </summary>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQueryTypedParams(String connectionString,String spName,DaTarow daTarow)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果row有值,存储过程必须初始化.
if (daTarow != null && daTarow.ItemArray.Length > 0)
{
// 从缓存中加载存储过程参数,spName);
// 分配参数值
AssignParameterValues(commandParameters,daTarow);
return sqlHelper.ExecuteNonQuery(connectionString,commandParameters);
}
else
{
return sqlHelper.ExecuteNonQuery(connectionString,spName);
}
}
/// <summary>
/// 执行指定连接数据库连接对象的存储过程,返回受影响的行数.
/// </summary>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQueryTypedParams(sqlConnection connection,DaTarow daTarow)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果row有值,daTarow);
return sqlHelper.ExecuteNonQuery(connection,commandParameters);
}
else
{
return sqlHelper.ExecuteNonQuery(connection,spName);
}
}
/// <summary>
/// 执行指定连接数据库事物的存储过程,返回受影响的行数.
/// </summary>
/// <param name="transaction">一个有效的连接事务 object</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQueryTypedParams(sqlTransaction transaction,DaTarow daTarow)
{
if (transaction == null) throw new ArgumentNullException("transaction");
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited,"transaction");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// Sf the row has values,the store procedure parameters must be initialized
if (daTarow != null && daTarow.ItemArray.Length > 0)
{
// 从缓存中加载存储过程参数,daTarow);
return sqlHelper.ExecuteNonQuery(transaction,commandParameters);
}
else
{
return sqlHelper.ExecuteNonQuery(transaction,spName);
}
}
#endregion
#region ExecuteDatasetTypedParams 类型化参数(DaTarow)
/// <summary>
/// 执行指定连接数据库连接字符串的存储过程,返回DataSet.
/// </summary>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回一个包含结果集的DataSet.</returns>
public static DataSet ExecuteDatasetTypedParams(string connectionString,DaTarow daTarow)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
//如果row有值,daTarow);
return sqlHelper.ExecuteDataset(connectionString,commandParameters);
}
else
{
return sqlHelper.ExecuteDataset(connectionString,返回DataSet.
/// </summary>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回一个包含结果集的DataSet.</returns>
///
public static DataSet ExecuteDatasetTypedParams(sqlConnection connection,daTarow);
return sqlHelper.ExecuteDataset(connection,commandParameters);
}
else
{
return sqlHelper.ExecuteDataset(connection,spName);
}
}
/// <summary>
/// 执行指定连接数据库事务的存储过程,返回DataSet.
/// </summary>
/// <param name="transaction">一个有效的连接事务 object</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回一个包含结果集的DataSet.</returns>
public static DataSet ExecuteDatasetTypedParams(sqlTransaction transaction,"transaction");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
// 如果row有值,daTarow);
return sqlHelper.ExecuteDataset(transaction,commandParameters);
}
else
{
return sqlHelper.ExecuteDataset(transaction,spName);
}
}
#endregion
#region ExecuteReaderTypedParams 类型化参数(DaTarow)
/// <summary>
/// 执行指定连接数据库连接字符串的存储过程,返回DataReader.
/// </summary>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReaderTypedParams(String connectionString,daTarow);
return sqlHelper.ExecuteReader(connectionString,commandParameters);
}
else
{
return sqlHelper.ExecuteReader(connectionString,spName);
}
}
/// <summary>
/// 执行指定连接数据库连接对象的存储过程,返回DataReader.
/// </summary>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReaderTypedParams(sqlConnection connection,daTarow);
return sqlHelper.ExecuteReader(connection,commandParameters);
}
else
{
return sqlHelper.ExecuteReader(connection,返回DataReader.
/// </summary>
/// <param name="transaction">一个有效的连接事务 object</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回包含结果集的sqlDataReader</returns>
public static sqlDataReader ExecuteReaderTypedParams(sqlTransaction transaction,daTarow);
return sqlHelper.ExecuteReader(transaction,commandParameters);
}
else
{
return sqlHelper.ExecuteReader(transaction,spName);
}
}
#endregion
#region ExecuteScalarTypedParams 类型化参数(DaTarow)
/// <summary>
/// 执行指定连接数据库连接字符串的存储过程,返回结果集中的第一行第一列.
/// </summary>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalarTypedParams(String connectionString,daTarow);
return sqlHelper.ExecuteScalar(connectionString,commandParameters);
}
else
{
return sqlHelper.ExecuteScalar(connectionString,返回结果集中的第一行第一列.
/// </summary>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalarTypedParams(sqlConnection connection,daTarow);
return sqlHelper.ExecuteScalar(connection,commandParameters);
}
else
{
return sqlHelper.ExecuteScalar(connection,返回结果集中的第一行第一列.
/// </summary>
/// <param name="transaction">一个有效的连接事务 object</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalarTypedParams(sqlTransaction transaction,daTarow);
return sqlHelper.ExecuteScalar(transaction,commandParameters);
}
else
{
return sqlHelper.ExecuteScalar(transaction,spName);
}
}
#endregion
#region ExecuteXmlReaderTypedParams 类型化参数(DaTarow)
/// <summary>
/// 执行指定连接数据库连接对象的存储过程,返回XmlReader类型的结果集.
/// </summary>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReaderTypedParams(sqlConnection connection,daTarow);
return sqlHelper.ExecuteXmlReader(connection,commandParameters);
}
else
{
return sqlHelper.ExecuteXmlReader(connection,返回XmlReader类型的结果集.
/// </summary>
/// <param name="transaction">一个有效的连接事务 object</param>
/// <param name="spName">存储过程名称</param>
/// <param name="daTarow">使用DaTarow作为参数值</param>
/// <returns>返回XmlReader结果集对象.</returns>
public static XmlReader ExecuteXmlReaderTypedParams(sqlTransaction transaction,daTarow);
return sqlHelper.ExecuteXmlReader(transaction,commandParameters);
}
else
{
return sqlHelper.ExecuteXmlReader(transaction,spName);
}
}
#endregion
}
/// <summary>
/// sqlHelperParameterCache提供缓存存储过程参数,并能够在运行时从存储过程中探索参数.
/// </summary>
public sealed class sqlHelperParameterCache
{
#region 私有方法,字段,构造函数
// 私有构造函数,妨止类被实例化.
private sqlHelperParameterCache() { }
// 这个方法要注意
private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
/// <summary>
/// 探索运行时的存储过程,返回sqlParameter参数数组.
/// 初始化参数值为 dbnull.Value.
/// </summary>
/// <param name="connection">一个有效的数据库连接</param>
/// <param name="spName">存储过程名称</param>
/// <param name="includeReturnValueParameter">是否包含返回值参数</param>
/// <returns>返回sqlParameter参数数组</returns>
private static sqlParameter[] discoverSpParameterSet(sqlConnection connection,bool includeReturnValueParameter)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
sqlCommand cmd = new sqlCommand(spName,connection);
cmd.CommandType = CommandType.StoredProcedure;
connection.open();
// 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中.
sqlCommandBuilder.DeriveParameters(cmd);
connection.Close();
// 如果不包含返回值参数,将参数集中的每一个参数删除.
if (!includeReturnValueParameter)
{
cmd.Parameters.RemoveAt(0);
}
// 创建参数数组
sqlParameter[] discoveredParameters = new sqlParameter[cmd.Parameters.Count];
// 将cmd的Parameters参数集复制到discoveredParameters数组.
cmd.Parameters.copyTo(discoveredParameters,0);
// 初始化参数值为 dbnull.Value.
foreach (sqlParameter discoveredParameter in discoveredParameters)
{
discoveredParameter.Value = dbnull.Value;
}
return discoveredParameters;
}
/// <summary>
/// sqlParameter参数数组的深层拷贝.
/// </summary>
/// <param name="originalParameters">原始参数数组</param>
/// <returns>返回一个同样的参数数组</returns>
private static sqlParameter[] CloneParameters(sqlParameter[] originalParameters)
{
sqlParameter[] clonedParameters = new sqlParameter[originalParameters.Length];
for (int i = 0,j = originalParameters.Length; i < j; i++)
{
clonedParameters[i] = (sqlParameter)((ICloneable)originalParameters[i]).Clone();
}
return clonedParameters;
}
#endregion 私有方法,构造函数结束
#region 缓存方法
/// <summary>
/// 追加参数数组到缓存.
/// </summary>
/// <param name="connectionString">一个有效的数据库连接字符串</param>
/// <param name="commandText">存储过程名或sql语句</param>
/// <param name="commandParameters">要缓存的参数数组</param>
public static void CacheParameterSet(string connectionString,params sqlParameter[] commandParameters)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
string hashKey = connectionString + ":" + commandText;
paramCache[hashKey] = commandParameters;
}
/// <summary>
/// 从缓存中获取参数数组.
/// </summary>
/// <param name="connectionString">一个有效的数据库连接字符</param>
/// <param name="commandText">存储过程名或sql语句</param>
/// <returns>参数数组</returns>
public static sqlParameter[] GetCachedParameterSet(string connectionString,string commandText)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
string hashKey = connectionString + ":" + commandText;
sqlParameter[] cachedParameters = paramCache[hashKey] as sqlParameter[];
if (cachedParameters == null)
{
return null;
}
else
{
return CloneParameters(cachedParameters);
}
}
#endregion 缓存方法结束
#region 检索指定的存储过程的参数集
/// <summary>
/// 返回指定的存储过程的参数集
/// </summary>
/// <remarks>
/// 这个方法将查询数据库,并将信息存储到缓存.
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符</param>
/// <param name="spName">存储过程名</param>
/// <returns>返回sqlParameter参数数组</returns>
public static sqlParameter[] GetSpParameterSet(string connectionString,string spName)
{
return GetSpParameterSet(connectionString,false);
}
/// <summary>
/// 返回指定的存储过程的参数集
/// </summary>
/// <remarks>
/// 这个方法将查询数据库,并将信息存储到缓存.
/// </remarks>
/// <param name="connectionString">一个有效的数据库连接字符.</param>
/// <param name="spName">存储过程名</param>
/// <param name="includeReturnValueParameter">是否包含返回值参数</param>
/// <returns>返回sqlParameter参数数组</returns>
public static sqlParameter[] GetSpParameterSet(string connectionString,bool includeReturnValueParameter)
{
if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
using (sqlConnection connection = new sqlConnection(connectionString))
{
return GetSpParameterSetInternal(connection,includeReturnValueParameter);
}
}
/// <summary>
/// [内部]返回指定的存储过程的参数集(使用连接对象).
/// </summary>
/// <remarks>
/// 这个方法将查询数据库,并将信息存储到缓存.
/// </remarks>
/// <param name="connection">一个有效的数据库连接字符</param>
/// <param name="spName">存储过程名</param>
/// <returns>返回sqlParameter参数数组</returns>
internal static sqlParameter[] GetSpParameterSet(sqlConnection connection,string spName)
{
return GetSpParameterSet(connection,false);
}
/// <summary>
/// [内部]返回指定的存储过程的参数集(使用连接对象)
/// </summary>
/// <remarks>
/// 这个方法将查询数据库,并将信息存储到缓存.
/// </remarks>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名</param>
/// <param name="includeReturnValueParameter">
/// 是否包含返回值参数
/// </param>
/// <returns>返回sqlParameter参数数组</returns>
internal static sqlParameter[] GetSpParameterSet(sqlConnection connection,bool includeReturnValueParameter)
{
if (connection == null) throw new ArgumentNullException("connection");
using (sqlConnection clonedConnection = (sqlConnection)((ICloneable)connection).Clone())
{
return GetSpParameterSetInternal(clonedConnection,includeReturnValueParameter);
}
}
/// <summary>
/// [私有]返回指定的存储过程的参数集(使用连接对象)
/// </summary>
/// <param name="connection">一个有效的数据库连接对象</param>
/// <param name="spName">存储过程名</param>
/// <param name="includeReturnValueParameter">是否包含返回值参数</param>
/// <returns>返回sqlParameter参数数组</returns>
private static sqlParameter[] GetSpParameterSetInternal(sqlConnection connection,bool includeReturnValueParameter)
{
if (connection == null) throw new ArgumentNullException("connection");
if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : "");
sqlParameter[] cachedParameters;
cachedParameters = paramCache[hashKey] as sqlParameter[];
if (cachedParameters == null)
{
sqlParameter[] spParameters = discoverSpParameterSet(connection,includeReturnValueParameter);
paramCache[hashKey] = spParameters;
cachedParameters = spParameters;
}
return CloneParameters(cachedParameters);
}
#endregion 参数集检索结束
}
}
如果要获取连接数据连接对象或字符串的话,先要修改sqlHelper类中GetConnSting() 方法中的ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;才能调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。