using System; using System.Data; using System.Xml; using System.Data.Common; using System.Collections; using System.Collections.Generic; using CB.Common; using CB.Config; using CB.Interface; namespace CB.Data { /// /// 数据库操作方法类 /// public partial class DbHelper { #region 私有变量 /// /// 数据库连接字符串 /// //protected static string m_connectionstring = null; /// /// DbProviderFactory实例 /// //private static DbProviderFactory m_factory = null; /// /// Discuz!NT数据接口 /// //private static IDbProvider m_provider = null; /// /// 查询次数统计 /// private static int m_querycount = 0; /// /// Parameters缓存哈希表 /// private static Hashtable m_paramcache = Hashtable.Synchronized(new Hashtable()); private static object lockHelper = new object(); #endregion #region 属性 /// /// 查询次数统计 /// public static int QueryCount { get { return m_querycount; } set { m_querycount = value; } } /// /// 数据库连接字符串 /// public static string ConnectionString(string interfaceId) { try { return DataProviderConfig.GetConfig(interfaceId).ConnectStringName; } catch { throw new Exception("未找到:[" + interfaceId + "]接口连接字符串" + DataProviderConfig.GetConfig(interfaceId).DbProviderName); } } /// /// IDbProvider接口 /// public static IDbProvider Provider(string interfaceId) { try { return (IDbProvider)Activator.CreateInstance(Type.GetType(DataProviderConfig.GetConfig(interfaceId).DbProviderName, false, true)); } catch { throw new Exception("未找到此类[" + interfaceId + "],无法实例化:" + DataProviderConfig.GetConfig(interfaceId).DbProviderName); } } /// /// DbFactory实例 /// public static DbProviderFactory Factory(string interfaceId) { return Provider(interfaceId).Instance(); } /// /// 刷新数据库提供者 /// //public static void ResetDbProvider() //{ // DatabaseProvider.ResetDbProvider(); // m_connectionstring = null; // m_factory = null; // m_provider = null; //} #endregion #region 私有方法 /// /// 将DbParameter参数数组(参数值)分配给DbCommand命令. /// 这个方法将给任何一个参数分配DBNull.Value; /// 该操作将阻止默认值的使用. /// /// 命令名 /// DbParameters数组 private static void AttachParameters(DbCommand command, DbParameter[] commandParameters) { if (command == null) throw new ArgumentNullException("command"); if (commandParameters != null) { foreach (DbParameter 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); } } } } /// /// 将DataRow类型的列值分配到DbParameter参数数组. /// /// 要分配值的DbParameter参数数组 /// 将要分配给存储过程参数的DataRow private static void AssignParameterValues(DbParameter[] commandParameters, DataRow dataRow) { if ((commandParameters == null) || (dataRow == null)) return; int i = 0; // 设置参数值 foreach (DbParameter 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++; } } /// /// 将一个对象数组分配给DbParameter参数数组. /// /// 要分配值的DbParameter参数数组 /// 将要分配给存储过程参数的对象数组 private static void AssignParameterValues(DbParameter[] 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]; } } /// /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数 /// /// 要处理的DbCommand /// 数据库连接 /// 一个有效的事务或者是null值 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名或都SQL命令文本 /// 和命令相关联的DbParameter参数数组,如果没有参数为'null' /// true 如果连接是打开的,则为true,其它情况下为false. private static void PrepareCommand(DbCommand command, DbConnection connection, DbTransaction transaction, CommandType commandType, string commandText, DbParameter[] 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; } /// /// 探索运行时的存储过程,返回DbParameter参数数组. /// 初始化参数值为 DBNull.Value. /// /// 一个有效的数据库连接 /// 存储过程名称 /// 是否包含返回值参数 /// 返回DbParameter参数数组 private static DbParameter[] DiscoverSpParameterSet(string interfaceId, DbConnection connection, string spName, bool includeReturnValueParameter) { if (connection == null) throw new ArgumentNullException("connection"); if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); if (connection.State == ConnectionState.Open) connection.Close(); connection.ConnectionString = ConnectionString(interfaceId); connection.Open(); DbCommand cmd = connection.CreateCommand(); cmd.CommandText = spName; cmd.CommandType = CommandType.StoredProcedure; // 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中. Provider(interfaceId).DeriveParameters(cmd); connection.Close(); // 如果不包含返回值参数,将参数集中的每一个参数删除. if (!includeReturnValueParameter) cmd.Parameters.RemoveAt(0); // 创建参数数组 DbParameter[] discoveredParameters = new DbParameter[cmd.Parameters.Count]; // 将cmd的Parameters参数集复制到discoveredParameters数组. cmd.Parameters.CopyTo(discoveredParameters, 0); // 初始化参数值为 DBNull.Value. foreach (DbParameter discoveredParameter in discoveredParameters) { discoveredParameter.Value = DBNull.Value; } return discoveredParameters; } /// /// DbParameter参数数组的深层拷贝. /// /// 原始参数数组 /// 返回一个同样的参数数组 private static DbParameter[] CloneParameters(DbParameter[] originalParameters) { DbParameter[] clonedParameters = new DbParameter[originalParameters.Length]; for (int i = 0, j = originalParameters.Length; i < j; i++) { clonedParameters[i] = (DbParameter)((ICloneable)originalParameters[i]).Clone(); } return clonedParameters; } #endregion 私有方法结束 #region ExecuteNonQuery方法 /// /// 执行指定连接字符串,类型的DbCommand. /// /// /// 示例: /// int result = ExecuteNonQuery("SELECT * FROM [table123]"); /// /// 存储过程名称或SQL语句 /// 返回命令影响的行数 public static int ExecuteNonQuery(string interfaceId, string commandText) { return ExecuteNonQuery(interfaceId, CommandType.Text, commandText, (DbParameter[])null); } /// /// 执行指定连接字符串,类型的DbCommand. /// /// /// 示例: /// int result = ExecuteNonQuery("SELECT * FROM [table123]"); /// /// 存储过程名称或SQL语句 /// 返回命令影响的行数 public static int ExecuteNonQuery(string interfaceId, out int id, string commandText) { return ExecuteNonQuery(interfaceId, out id, CommandType.Text, commandText, (DbParameter[])null); } /// /// 执行指定连接字符串,类型的DbCommand. /// /// /// 示例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名称或SQL语句 /// 返回命令影响的行数 public static int ExecuteNonQuery(string interfaceId, CommandType commandType, string commandText) { return ExecuteNonQuery(interfaceId, commandType, commandText, (DbParameter[])null); } /// /// 执行指定连接字符串,并返回刚插入的自增ID /// /// /// 示例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名称或SQL语句 /// 返回命令影响的行数 public static int ExecuteNonQuery(string interfaceId, out int id, CommandType commandType, string commandText) { return ExecuteNonQuery(interfaceId, out id, commandType, commandText, (DbParameter[])null); } /// /// 执行指定连接字符串,类型的DbCommand.如果没有提供参数,不返回结果. /// /// /// 示例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名称或SQL语句 /// DbParameter参数数组 /// 返回命令影响的行数 public static int ExecuteNonQuery(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); using (DbConnection connection = Factory(interfaceId).CreateConnection()) { connection.ConnectionString = ConnectionString(interfaceId); //connection.Open(); return ExecuteNonQuery(interfaceId, connection, commandType, commandText, commandParameters); } } /// /// 执行指定连接字符串并返回刚插入的自增ID,类型的DbCommand.如果没有提供参数,不返回结果. /// /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名称或SQL语句 /// DbParameter参数数组 /// 返回命令影响的行数 public static int ExecuteNonQuery(string interfaceId, out int id, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); using (DbConnection connection = Factory(interfaceId).CreateConnection()) { connection.ConnectionString = ConnectionString(interfaceId); //connection.Open(); return ExecuteNonQuery(interfaceId, out id, connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令 /// /// /// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, DbConnection connection, CommandType commandType, string commandText) { return ExecuteNonQuery(interfaceId, connection, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接对象的命令并返回自增ID /// /// /// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, out int id, DbConnection connection, CommandType commandType, string commandText) { return ExecuteNonQuery(interfaceId, out id, connection, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接对象的命令 /// /// /// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// T存储过程名称或SQL语句 /// SqlParamter参数数组 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); // 创建DbCommand命令,并进行预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 执行DbCommand命令,并返回结果. int retval = cmd.ExecuteNonQuery(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return retval; } /// /// 执行指定数据库连接对象的命令 /// /// /// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// T存储过程名称或SQL语句 /// SqlParamter参数数组 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, out int id, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); if (Provider(interfaceId).GetLastIdSql().Trim() == "") throw new ArgumentNullException("GetLastIdSql is \"\""); // 创建DbCommand命令,并进行预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 执行命令 int retval = cmd.ExecuteNonQuery(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); cmd.CommandType = CommandType.Text; cmd.CommandText = Provider(interfaceId).GetLastIdSql(); id = TypeConverter.ObjectToInt(cmd.ExecuteScalar()); m_querycount++; if (mustCloseConnection) { connection.Close(); } return retval; } /// /// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数. /// /// /// 此方法不提供访问存储过程输出参数和返回值 /// 示例: /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); /// /// 一个有效的数据库连接对象 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, DbConnection 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)) { // 从缓存中加载存储过程参数 DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName); // 给存储过程分配参数值 AssignParameterValues(commandParameters, parameterValues); return ExecuteNonQuery(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteNonQuery(interfaceId, connection, CommandType.StoredProcedure, spName); } } /// /// 执行带事务的DbCommand. /// /// /// 示例.: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// 返回影响的行数/returns> public static int ExecuteNonQuery(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText) { return ExecuteNonQuery(interfaceId, transaction, commandType, commandText, (DbParameter[])null); } /// /// 执行带事务的DbCommand. /// /// /// 示例.: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// 返回影响的行数/returns> public static int ExecuteNonQuery(string interfaceId, out int id, DbTransaction transaction, CommandType commandType, string commandText) { return ExecuteNonQuery(interfaceId, out id, transaction, commandType, commandText, (DbParameter[])null); } /// /// 执行带事务的DbCommand(指定参数). /// /// /// 示例: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// SqlParamter参数数组 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] 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"); // 预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 执行 // 执行DbCommand命令,并返回结果. int retval = cmd.ExecuteNonQuery(); // 清除参数集,以便再次使用. cmd.Parameters.Clear(); return retval; } /// /// 执行带事务的DbCommand(指定参数). /// /// /// 示例: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// SqlParamter参数数组 /// 返回影响的行数 public static int ExecuteNonQuery(string interfaceId, out int id, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] 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"); // 预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 执行 int retval = cmd.ExecuteNonQuery(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); cmd.CommandType = CommandType.Text; cmd.CommandText = Provider(interfaceId).GetLastIdSql(); id = TypeConverter.ObjectToInt(cmd.ExecuteScalar().ToString()); return retval; } /// /// 执行带事务的DbCommand(指定参数值). /// /// /// 此方法不提供访问存储过程输出参数和返回值 /// 示例: /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); /// /// 一个有效的数据库连接对象 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回受影响的行数 public static int ExecuteNonQuery(string interfaceId, DbTransaction 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)) { // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName); // 给存储过程参数赋值 AssignParameterValues(commandParameters, parameterValues); // 调用重载方法 return ExecuteNonQuery(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters); } else { // 没有参数值 return ExecuteNonQuery(interfaceId, transaction, CommandType.StoredProcedure, spName); } } #endregion ExecuteNonQuery方法结束 #region ExecuteCommandWithSplitter方法 /// /// 运行含有GO命令的多条SQL命令 /// /// SQL命令字符串 /// 分割字符串 public static void ExecuteCommandWithSplitter(string interfaceId, string commandText, string splitter) { int startPos = 0; do { int lastPos = commandText.IndexOf(splitter, startPos); int len = (lastPos > startPos ? lastPos : commandText.Length) - startPos; string query = commandText.Substring(startPos, len); if (query.Trim().Length > 0) { try { ExecuteNonQuery(interfaceId, CommandType.Text, query); } catch { ;} } if (lastPos == -1) break; else startPos = lastPos + splitter.Length; } while (startPos < commandText.Length); } /// /// 运行含有GO命令的多条SQL命令 /// /// SQL命令字符串 public static void ExecuteCommandWithSplitter(string interfaceId, string commandText) { ExecuteCommandWithSplitter(interfaceId, commandText, "\r\nGO\r\n"); } #endregion ExecuteCommandWithSplitter方法结束 #region ExecuteDataset方法 /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset("SELECT * FROM [table1]"); /// /// 存储过程名称或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, string commandText) { return ExecuteDataset(interfaceId, CommandType.Text, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, CommandType commandType, string commandText) { return ExecuteDataset(interfaceId, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// SqlParamters参数数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); // 创建并打开数据库连接对象,操作完成释放对象. using (DbConnection connection = Factory(interfaceId).CreateConnection()) { connection.ConnectionString = ConnectionString(interfaceId); // connection.Open(); // 调用指定数据库连接字符串重载方法. return ExecuteDataset(interfaceId, connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText) { return ExecuteDataset(interfaceId, connection, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); // connection.Close(); connection.ConnectionString = ConnectionString(interfaceId); connection.Open(); // 预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 创建DbDataAdapter和DataSet. using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter()) { da.SelectCommand = cmd; DataSet ds = new DataSet(); // 填充DataSet. da.Fill(ds); m_querycount++; cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return ds; } } /// /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet. /// /// /// 此方法不提供访问存储过程输入参数和返回值. /// 示例.: /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); /// /// 一个有效的数据库连接对象 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, DbConnection 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)) { // 比缓存中加载存储过程参数 DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName); // 给存储过程参数分配值 AssignParameterValues(commandParameters, parameterValues); return ExecuteDataset(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteDataset(interfaceId, connection, CommandType.StoredProcedure, spName); } } /// /// 执行指定事务的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText) { return ExecuteDataset(interfaceId, transaction, commandType, commandText, (DbParameter[])null); } /// /// 执行指定事务的命令,指定参数,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] 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"); // 预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 创建 DataAdapter & DataSet using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter()) { da.SelectCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds); cmd.Parameters.Clear(); return ds; } } /// /// 执行指定事务的命令,指定参数值,返回DataSet. /// /// /// 此方法不提供访问存储过程输入参数和返回值. /// 示例.: /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); /// /// 事务 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataset(string interfaceId, DbTransaction 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)) { // 从缓存中加载存储过程参数 DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName); // 给存储过程参数分配值 AssignParameterValues(commandParameters, parameterValues); return ExecuteDataset(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteDataset(interfaceId, transaction, CommandType.StoredProcedure, spName); } } #endregion ExecuteDataset数据集命令结束 #region ExecuteDataTable方法 /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset("SELECT * FROM [table1]"); /// /// 存储过程名称或SQL语句 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, string commandText) { return ExecuteDatatable(interfaceId, CommandType.Text, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, CommandType commandType, string commandText) { return ExecuteDatatable(interfaceId, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// SqlParamters参数数组 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); // 创建并打开数据库连接对象,操作完成释放对象. using (DbConnection connection = Factory(interfaceId).CreateConnection()) { connection.ConnectionString = ConnectionString(interfaceId); // connection.Open(); // 调用指定数据库连接字符串重载方法. return ExecuteDatatable(interfaceId, connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, DbConnection connection, CommandType commandType, string commandText) { return ExecuteDatatable(interfaceId, connection, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); // connection.Close(); connection.ConnectionString = ConnectionString(interfaceId); connection.Open(); // 预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 创建DbDataAdapter和DataSet. using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter()) { da.SelectCommand = cmd; DataTable dt = new DataTable(); // 填充DataSet. da.Fill(dt); m_querycount++; cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return dt; } } /// /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet. /// /// /// 此方法不提供访问存储过程输入参数和返回值. /// 示例.: /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); /// /// 一个有效的数据库连接对象 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, DbConnection 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)) { // 比缓存中加载存储过程参数 DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName); // 给存储过程参数分配值 AssignParameterValues(commandParameters, parameterValues); return ExecuteDatatable(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteDatatable(interfaceId, connection, CommandType.StoredProcedure, spName); } } /// /// 执行指定事务的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText) { return ExecuteDatatable(interfaceId, transaction, commandType, commandText, (DbParameter[])null); } /// /// 执行指定事务的命令,指定参数,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] 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"); // 预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 创建 DataAdapter & DataSet using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter()) { da.SelectCommand = cmd; DataTable dt = new DataTable(); da.Fill(dt); cmd.Parameters.Clear(); return dt; } } /// /// 执行指定事务的命令,指定参数值,返回DataSet. /// /// /// 此方法不提供访问存储过程输入参数和返回值. /// 示例.: /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); /// /// 事务 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回一个包含结果集的DataSet public static DataTable ExecuteDatatable(string interfaceId, DbTransaction 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)) { // 从缓存中加载存储过程参数 DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName); // 给存储过程参数分配值 AssignParameterValues(commandParameters, parameterValues); return ExecuteDatatable(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteDatatable(interfaceId, transaction, CommandType.StoredProcedure, spName); } } #endregion ExecuteDataset数据集命令结束 #region ExecuteReader 数据阅读器 /// /// 枚举,标识数据库连接是由BaseDbHelper提供还是由调用者提供 /// private enum DbConnectionOwnership { /// 由BaseDbHelper提供连接 Internal, /// 由调用者提供连接 External } /// /// 执行指定数据库连接对象的数据阅读器. /// /// /// 如果是BaseDbHelper打开连接,当连接关闭DataReader也将关闭. /// 如果是调用都打开连接,DataReader由调用都管理. /// /// 一个有效的数据库连接对象 /// 一个有效的事务,或者为 'null' /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// DbParameters参数数组,如果没有参数则为'null' /// 标识数据库连接对象是由调用者提供还是由BaseDbHelper提供 /// 返回包含结果集的DbDataReader private static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, DbTransaction transaction, CommandType commandType, string commandText, DbParameter[] commandParameters, DbConnectionOwnership connectionOwnership) { if (connection == null) throw new ArgumentNullException("connection"); //connection.Close(); connection.ConnectionString = ConnectionString(interfaceId); connection.Open(); bool mustCloseConnection = false; // 创建命令 DbCommand cmd = Factory(interfaceId).CreateCommand(); try { PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 创建数据阅读器 DbDataReader dataReader; if (connectionOwnership == DbConnectionOwnership.External) { dataReader = cmd.ExecuteReader(); } else { dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } m_querycount++; // 清除参数,以便再次使用.. bool canClear = true; foreach (DbParameter commandParameter in cmd.Parameters) { if (commandParameter.Direction != ParameterDirection.Input) canClear = false; } if (canClear) { //cmd.Dispose(); cmd.Parameters.Clear(); } return dataReader; } catch { if (mustCloseConnection) connection.Close(); throw; } } /// /// 执行指定数据库连接字符串的数据阅读器. /// /// /// 示例: /// DbDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, CommandType commandType, string commandText) { return ExecuteReader(interfaceId, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接字符串的数据阅读器,指定参数. /// /// /// 示例: /// DbDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组(new DbParameter("@prodid", 24)) /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); DbConnection connection = null; try { connection = Factory(interfaceId).CreateConnection(); connection.ConnectionString = ConnectionString(interfaceId); //connection.Open(); return ExecuteReader(interfaceId, connection, null, commandType, commandText, commandParameters, DbConnectionOwnership.Internal); } catch { // If we fail to return the SqlDatReader, we need to close the connection ourselves if (connection != null) connection.Close(); throw; } } /// /// 执行指定数据库连接字符串的数据阅读器,指定参数值. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// 示例: /// DbDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); /// /// 一个有效的数据库连接字符串 /// 存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, string spName, params object[] parameterValues) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); if ((parameterValues != null) && (parameterValues.Length > 0)) { DbParameter[] commandParameters = GetSpParameterSet(interfaceId, spName); AssignParameterValues(commandParameters, parameterValues); return ExecuteReader(ConnectionString(interfaceId), CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteReader(ConnectionString(interfaceId), CommandType.StoredProcedure, spName); } } /// /// 执行指定数据库连接对象的数据阅读器. /// /// /// 示例: /// DbDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, CommandType commandType, string commandText) { return ExecuteReader(interfaceId, connection, commandType, commandText, (DbParameter[])null); } /// /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数. /// /// /// 示例: /// DbDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 命令类型 (存储过程,命令文本或其它) /// SqlParamter参数数组 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters) { return ExecuteReader(interfaceId, connection, (DbTransaction)null, commandType, commandText, commandParameters, DbConnectionOwnership.External); } /// /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// 示例: /// DbDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); /// /// 一个有效的数据库连接对象 /// T存储过程名 /// 分配给存储过程输入参数的对象数组 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, DbConnection 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)) { DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName); AssignParameterValues(commandParameters, parameterValues); return ExecuteReader(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters); } else { return ExecuteReader(interfaceId, connection, CommandType.StoredProcedure, spName); } } /// /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. /// /// /// 示例: /// DbDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText) { return ExecuteReader(interfaceId, transaction, commandType, commandText, (DbParameter[])null); } /// /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数. /// /// /// 示例: /// DbDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24)); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] 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(interfaceId, transaction.Connection, transaction, commandType, commandText, commandParameters, DbConnectionOwnership.External); } /// /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// /// 示例: /// DbDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); /// /// 一个有效的连接事务 /// 存储过程名称 /// 分配给存储过程输入参数的对象数组 /// 返回包含结果集的DbDataReader public static DbDataReader ExecuteReader(string interfaceId, DbTransaction 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)) { DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName); AssignParameterValues(commandParameters, parameterValues); return ExecuteReader(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters); } else { // 没有参数值 return ExecuteReader(interfaceId, transaction, CommandType.StoredProcedure, spName); } } #endregion ExecuteReader数据阅读器 #region ExecuteScalar 返回结果集中的第一行第一列 /// /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, CommandType commandType, string commandText) { // 执行参数为空的方法 return ExecuteScalar(interfaceId, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); // 创建并打开数据库连接对象,操作完成释放对象. using (DbConnection connection = Factory(interfaceId).CreateConnection()) { connection.ConnectionString = ConnectionString(interfaceId); // connection.Open(); // 调用指定数据库连接字符串重载方法. return ExecuteScalar(interfaceId, connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, DbConnection connection, CommandType commandType, string commandText) { // 执行参数为空的方法 return ExecuteScalar(interfaceId, connection, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); //connection.Close(); connection.ConnectionString = ConnectionString(interfaceId); connection.Open(); // 创建DbCommand命令,并进行预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 执行DbCommand命令,并返回结果. object retval = cmd.ExecuteScalar(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return retval; } /// /// 执行指定数据库连接对象的命令,指定参数值,返回结果集中的第一行第一列. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// /// 示例: /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); /// /// 一个有效的数据库连接对象 /// 存储过程名称 /// 分配给存储过程输入参数的对象数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, DbConnection 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)) { // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName); // 给存储过程参数赋值 AssignParameterValues(commandParameters, parameterValues); // 调用重载方法 return ExecuteScalar(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters); } else { // 没有参数值 return ExecuteScalar(interfaceId, connection, CommandType.StoredProcedure, spName); } } /// /// 执行指定数据库事务的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText) { // 执行参数为空的方法 return ExecuteScalar(interfaceId, transaction, commandType, commandText, (DbParameter[])null); } /// /// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new DbParameter("@prodid", 24)); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] 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"); // 创建DbCommand命令,并进行预处理 DbCommand cmd = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 执行DbCommand命令,并返回结果. object retval = cmd.ExecuteScalar(); m_querycount++; // 清除参数,以便再次使用. cmd.Parameters.Clear(); return retval; } /// /// 执行指定数据库事务的命令,指定参数值,返回结果集中的第一行第一列. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// /// 示例: /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); /// /// 一个有效的连接事务 /// 存储过程名称 /// 分配给存储过程输入参数的对象数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string interfaceId, DbTransaction 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 () DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName); // 给存储过程参数赋值 AssignParameterValues(commandParameters, parameterValues); // 调用重载方法 return ExecuteScalar(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters); } else { // 没有参数值 return ExecuteScalar(interfaceId, transaction, CommandType.StoredProcedure, spName); } } #endregion ExecuteScalar #region FillDataset 填充数据集 /// /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集. /// /// /// 示例: /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) //public static void FillDataset(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 (DbConnection connection = Factory.CreateConnection()) // { // connection.ConnectionString = ConnectionString; // connection.Open(); // // 调用指定数据库连接字符串重载方法. // FillDataset(connection, commandType, commandText, dataSet, tableNames); // } //} /// /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数. /// /// /// 示例: /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// //public static void FillDataset(CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters) //{ // if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); // if (dataSet == null) throw new ArgumentNullException("dataSet"); // // 创建并打开数据库连接对象,操作完成释放对象. // using (DbConnection connection = Factory.CreateConnection()) // { // connection.ConnectionString = ConnectionString; // connection.Open(); // // 调用指定数据库连接字符串重载方法. // FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters); // } //} /// /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集,指定存储过程参数值. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// /// 示例: /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24); /// /// 一个有效的数据库连接字符串 /// 存储过程名称 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// /// 分配给存储过程输入参数的对象数组 //public static void FillDataset(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 (DbConnection connection = Factory.CreateConnection()) // { // connection.ConnectionString = ConnectionString; // connection.Open(); // // 调用指定数据库连接字符串重载方法. // FillDataset(connection, spName, dataSet, tableNames, parameterValues); // } //} /// /// 执行指定数据库连接对象的命令,映射数据表并填充数据集. /// /// /// 示例: /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// public static void FillDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) { FillDataset(interfaceId, connection, commandType, commandText, dataSet, tableNames, null); } /// /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定参数. /// /// /// 示例: /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// /// 分配给命令的SqlParamter参数数组 public static void FillDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters) { FillDataset(interfaceId, connection, null, commandType, commandText, dataSet, tableNames, commandParameters); } /// /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定存储过程参数值. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// /// 示例: /// FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36); /// /// 一个有效的数据库连接对象 /// 存储过程名称 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// /// 分配给存储过程输入参数的对象数组 //public static void FillDataset(DbConnection 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)) // { // // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () // DbParameter[] commandParameters = GetSpParameterSet(connection, spName); // // 给存储过程参数赋值 // AssignParameterValues(commandParameters, parameterValues); // // 调用重载方法 // FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); // } // else // { // // 没有参数值 // FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames); // } //} /// /// 执行指定数据库事务的命令,映射数据表并填充数据集. /// /// /// 示例: /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// //public static void FillDataset(DbTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) //{ // FillDataset(transaction, commandType, commandText, dataSet, tableNames, null); //} /// /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定参数. /// /// /// 示例: /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24)); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// /// 分配给命令的SqlParamter参数数组 public static void FillDataset(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters) { FillDataset(interfaceId, transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters); } /// /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定存储过程参数值. /// /// /// 此方法不提供访问存储过程输出参数和返回值参数. /// /// 示例: /// FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36); /// /// 一个有效的连接事务 /// 存储过程名称 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// /// 分配给存储过程输入参数的对象数组 //public static void FillDataset(DbTransaction 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)) // { // // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () // DbParameter[] commandParameters = GetSpParameterSet(transaction.Connection, spName); // // 给存储过程参数赋值 // AssignParameterValues(commandParameters, parameterValues); // // 调用重载方法 // FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); // } // else // { // // 没有参数值 // FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames); // } //} /// /// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,映射数据表并填充数据集,DataSet/TableNames/DbParameters. /// /// /// 示例: /// FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 要填充结果集的DataSet实例 /// 表映射的数据表数组 /// 用户定义的表名 (可有是实际的表名.) /// /// 分配给命令的SqlParamter参数数组 private static void FillDataset(string interfaceId, DbConnection connection, DbTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); if (dataSet == null) throw new ArgumentNullException("dataSet"); // 创建DbCommand命令,并进行预处理 DbCommand command = Factory(interfaceId).CreateCommand(); bool mustCloseConnection = false; PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 执行命令 using (DbDataAdapter dataAdapter = Factory(interfaceId).CreateDataAdapter()) { dataAdapter.SelectCommand = 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 检索指定的存储过程的参数集 /// /// 返回指定的存储过程的参数集 /// /// /// 这个方法将查询数据库,并将信息存储到缓存. /// /// 一个有效的数据库连接字符 /// 存储过程名 /// 返回DbParameter参数数组 public static DbParameter[] GetSpParameterSet(string interfaceId, string spName) { return GetSpParameterSet(interfaceId, spName, false); } /// /// 返回指定的存储过程的参数集 /// /// /// 这个方法将查询数据库,并将信息存储到缓存. /// /// 一个有效的数据库连接字符. /// 存储过程名 /// 是否包含返回值参数 /// 返回DbParameter参数数组 public static DbParameter[] GetSpParameterSet(string interfaceId, string spName, bool includeReturnValueParameter) { if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString"); if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); using (DbConnection connection = Factory(interfaceId).CreateConnection()) { connection.ConnectionString = ConnectionString(interfaceId); return GetSpParameterSetInternal(interfaceId, connection, spName, includeReturnValueParameter); } } /// /// [内部]返回指定的存储过程的参数集(使用连接对象). /// /// /// 这个方法将查询数据库,并将信息存储到缓存. /// /// 一个有效的数据库连接字符 /// 存储过程名 /// 返回DbParameter参数数组 internal static DbParameter[] GetSpParameterSet(string interfaceId, DbConnection connection, string spName) { return GetSpParameterSet(interfaceId, connection, spName, false); } /// /// [内部]返回指定的存储过程的参数集(使用连接对象) /// /// /// 这个方法将查询数据库,并将信息存储到缓存. /// /// 一个有效的数据库连接对象 /// 存储过程名 /// /// 是否包含返回值参数 /// /// 返回DbParameter参数数组 internal static DbParameter[] GetSpParameterSet(string interfaceId, DbConnection connection, string spName, bool includeReturnValueParameter) { if (connection == null) throw new ArgumentNullException("connection"); using (DbConnection clonedConnection = (DbConnection)((ICloneable)connection).Clone()) { return GetSpParameterSetInternal(interfaceId, clonedConnection, spName, includeReturnValueParameter); } } /// /// [私有]返回指定的存储过程的参数集(使用连接对象) /// /// 一个有效的数据库连接对象 /// 存储过程名 /// 是否包含返回值参数 /// 返回DbParameter参数数组 private static DbParameter[] GetSpParameterSetInternal(string interfaceId, DbConnection 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" : ""); DbParameter[] cachedParameters; cachedParameters = m_paramcache[hashKey] as DbParameter[]; if (cachedParameters == null) { DbParameter[] spParameters = DiscoverSpParameterSet(interfaceId, connection, spName, includeReturnValueParameter); m_paramcache[hashKey] = spParameters; cachedParameters = spParameters; } return CloneParameters(cachedParameters); } #endregion 参数集检索结束 #region 生成参数 public static DbParameter MakeInParam(string interfaceId, string ParamName, DbType DbType, int Size, object Value) { return MakeParam(interfaceId, ParamName, DbType, Size, ParameterDirection.Input, Value); } public static DbParameter MakeOutParam(string interfaceId, string ParamName, DbType DbType, int Size) { return MakeParam(interfaceId, ParamName, DbType, Size, ParameterDirection.Output, null); } public static DbParameter MakeParam(string interfaceId, string ParamName, DbType DbType, Int32 Size, ParameterDirection Direction, object Value) { DbParameter param; param = Provider(interfaceId).MakeParam(ParamName, DbType, Size); param.Direction = Direction; if (!(Direction == ParameterDirection.Output && Value == null)) param.Value = Value; return param; } public static DbParameter MakeParamByColumn(string interfaceId, string ParamName, DbType DbType, Int32 Size, string ColumnName) { DbParameter param; param = Provider(interfaceId).MakeParam(ParamName, DbType, Size); param.Direction = ParameterDirection.Input; param.SourceColumn = ColumnName; return param; } #endregion 生成参数结束 #region 执行ExecuteScalar,将结果以字符串类型输出。 public static string ExecuteScalarToStr(string interfaceId, CommandType commandType, string commandText) { object ec = ExecuteScalar(interfaceId, commandType, commandText); if (ec == null) { return ""; } return ec.ToString(); } public static string ExecuteScalarToStr(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters) { object ec = ExecuteScalar(interfaceId, commandType, commandText, commandParameters); if (ec == null) { return ""; } return ec.ToString(); } #endregion } }