⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataaccess.cs

📁 人力资源管理系统 读者须安装好IIS和Microsoft Visual Stutio.NET相关开发环境
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.IO ;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Web.Caching ;
using HRAdmin.COMMON ;

namespace HRAdmin.DAL
{
	/// <summary>
	/// DataAccess 的摘要说明。
	/// </summary>
	public class DataAccess
	{	

		private static SqlConnection _connection  ;
		private static SqlCommand _command  ;
		private static SqlDataAdapter _adapter ;
//		private static SqlCommand _command_ds  ;
//		private static SqlCommand _command_sl  ;

		//创建自己的Hashtable
		private static Hashtable myCache = Hashtable.Synchronized(new Hashtable());

		#region 初始化
		/// <summary>
		/// 初始化数据连接
		/// </summary>
		/// <returns>true:成功  false:失败</returns>
		public static bool InitConn()
		{
			bool ret = true ;

			//获取web.config中配置的数据连接字串
			string str_conn = HRAdminGlobals.ConnectionString ;
			if(str_conn != "")
				//初始化数据连接
				_connection = new SqlConnection(str_conn) ;
			else
			{
				//获取字串失败,写日志
				Trace.Write("InitCommand","Error","从web.config获取数据连接字串失败.") ;

				ret = false ;
				return ret ;
			}

			//初始化命令
			_command = new SqlCommand() ;

			//为命令设置数据连接
			_command.Connection = _connection ;		

			//初始化数据适配器
            _adapter = new SqlDataAdapter() ;
						
			return ret ;
		}
		#endregion

		#region 参数赋值
		/// <summary>
		/// 将SQL参数队列值赋给SQL命令(SQL语句或存储过程)
		/// </summary>
		/// <param name="commandParameters">待指定给SQL命令的参数队列</param>
		private static void AttachParameters(SqlParameter[] commandParameters)
		{
			foreach (SqlParameter p in commandParameters)
			{
				//给为null的输出参数赋值
				if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
				{
					p.Value = DBNull.Value;
				}
				
				_command.Parameters.Add(p);
			}
		}

		/// <summary>
		/// 将参数值序列赋值给对应的参数序列
		/// </summary>
		/// <param name="commandParameters">待赋值的参数序列</param>
		/// <param name="parameterValues">参数值序列</param>
		private static bool AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
		{
			bool ret = true ;

			if ((commandParameters == null) || (parameterValues == null)) 
			{
				//若参数为null,返回
				return ret;
			}

			// 参数数组长度与参数值数组长度需匹配
			if (commandParameters.Length != parameterValues.Length)
			{
				ret = false ;
				Trace.Write("AssignParameterValues","Error","参数个数和参数值个数不匹配.");
				return ret;
			}

			//循环为参数赋值
			//注意,参数与参数值在各自的序列中位置应当对应
			for (int i = 0, j = commandParameters.Length; i < j; i++)
			{
				commandParameters[i].Value = parameterValues[i];
			}

			return ret;
		}

		/// <summary>
		/// 为给定的SQL命令(SQL语句或存储过程)打开数据连接,设置事务、命令名称、命令类型等等
		/// 并为命令的参数赋值
		/// </summary>
		/// <param name="commandType">命令类型</param>
		/// <param name="commandText">存储过程名或SQL语句</param>
		/// <param name="commandParameters">参数序列</param>
		private static void PrepareCommand(string commandText, SqlParameter[] commandParameters)
		{
			//若数据连接未打开,打开连接
			if (_connection.State != ConnectionState.Open)
			{
				_connection.Open();
			}			

			//设置command text (存储过程名或其他SQL语句)
			_command.CommandText = commandText;			

			//指定命令类型(存储过程或者其他SQL语句)
			_command.CommandType = CommandType.StoredProcedure;

			//为参数赋值
			if (commandParameters != null)
			{
				AttachParameters(commandParameters);
			}

			return;
		}
		#endregion

		#region 执行无查询存储过程
		/// <summary>
		/// 执行无查询存储过程
		/// </summary>
		/// <param name="commandText">存储过程名</param>
		/// <param name="HasReturn">是否有返回值</param>
		/// <param name="commandParameters">参数值</param>
		/// <returns>返回执行结果</returns>
		private static int ExecuteNonQuery_in(string commandText,bool HasReturn, params SqlParameter[] commandParameters)
		{
			int result = -1 ;
			//创建并打开数据连接			
			if (_connection.State != ConnectionState.Open)
			{
				_connection.Open();
			}		
			
			_command.Connection = _connection ;
			PrepareCommand(commandText, commandParameters);

			//调用执行函数
			//执行命令
			try
			{
				result = _command.ExecuteNonQuery();
			}
			catch(Exception e)
			{
				//执行失败
				//从异常中获取失败信息
				string msg = e.Message ;
				//调用写日志方法
				Trace.Write("ExecuteNonQuery","Error",commandText+"|"+msg) ;
			}
			if(HasReturn)
			{
				result = (int)_command.Parameters["@RETURN_VALUE"].Value ;
			}				
			
			//清除参数
			_command.Parameters.Clear();

			//执行完毕后关闭连接
			_connection.Close() ;

			return result ;
		}
		
		/// <summary>
		/// 执行无返回值的存储过程
		/// 注意参数值的顺序需与存储过程参数顺序一致
		/// </summary>		
		/// <param name="spName">存储过程名</param>
		/// <param name="parameterValues">参数值</param>
		/// <returns>执行结果</returns>
		public static int ExecuteNonQuery(string spName,bool hasReturns,params object[] parameterValues)
		{
			//如果有参数值, 先赋参数值再执行
			if ((parameterValues != null) && (parameterValues.Length > 0)) 
			{
				//获取存储过程参数
				SqlParameter[] commandParameters = GetSpParameters(spName,hasReturns);

				//为存储过程参数设定参数值
				AssignParameterValues(commandParameters, parameterValues);

				//调用执行带参数值的存储过程方法
				return ExecuteNonQuery_in(spName,hasReturns, commandParameters);
			}
			//不带参数
			else 
			{
				return ExecuteNonQuery_in(spName,hasReturns);
			}
		}
		#endregion

		#region 获取存储过程参数
		/// <summary>
		/// 获取存储过程参数数组
		/// </summary>
		/// <param name="spName">存储过程名</param>
		/// <param name="hasReturn">是否包含返回类型的参数</param>
		/// <returns>参数数组</returns>
		private static SqlParameter[] GetSpParameterSet(string spName,bool hasReturn)
		{			
			using(SqlCommand cmd = new SqlCommand() )
			{
				//为命令指定连接
				cmd.Connection = _connection ;

				//如果数据连接未开启,打开它
				if(_connection.State != ConnectionState.Open)
				{
					_connection.Open() ;
				}
				//指定CommandText为存储过程名
				cmd.CommandText = spName ;
				cmd.CommandType = CommandType.StoredProcedure ;
				//从存储过程中检索参数,填充到Parameters集
				try
				{
					SqlCommandBuilder.DeriveParameters(cmd) ;
				}
				catch(Exception e)
				{
					//执行失败
					//从异常中获取失败信息
					string msg = e.Message ;
					//调用写日志方法
					Trace.Write("DeriveParameters","Error",spName+"|"+msg) ;
				}

				//如果有返回值
				if (!hasReturn) 
				{
					cmd.Parameters.RemoveAt(0);
				}

				//将Parameters集中的参数复制到参数数组
				SqlParameter[] para = new SqlParameter[cmd.Parameters.Count] ;
				cmd.Parameters.CopyTo(para,0) ;

				return para ;
			}
		}		

		/// <summary>
		/// 深拷贝缓存中的参数序列
		/// </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;
		}

		/// <summary>
		/// 获取存储过程参数
		/// </summary>
		/// <param name="spName">存储过程名</param>
		/// <param name="hasReturn">是否包含返回值</param>
		/// <returns>返回参数序列</returns>
		public static SqlParameter[] GetSpParameters(string spName, bool hasReturn)
		{
			//缓存HashTable的主键
			string cacheKey = spName + (hasReturn ? ":hasReturn":"");
			//从Hachtable中获取参数
			SqlParameter[] cachedParameters  = (SqlParameter[])myCache[cacheKey];
			if(cachedParameters == null)
			{		
				//如果Hachtable中没有,调用获取存储过程参数数组方法
				cachedParameters = (SqlParameter[])(myCache[cacheKey] = GetSpParameterSet(spName,hasReturn)) ;
			}			

			return CloneParameters(cachedParameters);
		}
		#endregion

		#region 执行返回DataSet的存储过程
		/// <summary>
		/// 执行返回DataSet的存储过程
		/// </summary>
		/// <param name="commandType">命令类型,存储过程、Text等</param>
		/// <param name="commandText">存储过程名或SQL语句等</param>
		/// <param name="commandParameters">参数序列</param>
		/// <returns>查询结果DataSet</returns>
		private static DataSet ExecuteDataset_in(string commandText, params SqlParameter[] commandParameters)
		{	
			//如果数据连接未开启,打开它
			if (_connection.State != ConnectionState.Open)
			{
				_connection.Open();
			}

			//准备命令
			PrepareCommand(commandText, commandParameters);
			
			//创建DataAdapter和DataSet
			SqlDataAdapter da = new SqlDataAdapter(_command);
			DataSet ds = new DataSet();

			//填充DataSet
			try
			{
				da.Fill(ds);
			}
			catch(Exception e)
			{
				//执行失败
				//从异常中获取失败信息
				string msg = e.Message ;
				//调用写日志方法
				Trace.Write("FillDataSet","Error",commandText+"|"+msg) ;
			}
			
			// 清除参数		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -