主题:  ASP.net中设计基类的探讨

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#12004/12/12 17:52:33
最近化时间用心在.NET网站基类设计上化了很多时间,并把网站最根本的类,包括数据层基类、业务层基类及错误、日志的设计发表上来,供交流。这里不含源代码,只是就类设计上作些探索。
数据层类是以SQL SERVER作为数据库进行设计的,当然也可以用其它数据库。用ACCESS数据库需要稍作修改,因ACCESS数据库不能支持返回ID或其它值,也不支持存储过程。数据层设计主要是以执行存储过程命令设计,但也可执行SQL语句,只需变成执行类行的变量值。
业务层是空类,没有进行任何设计。这只是为以后进行扩展预设的。

我用DOC作了个类设计手册,供下载
相关文件:点这儿打开


图片如下:


非常大鱼

=ridincal=

职务:管理员
等级:7
金币:20.0
发贴:5886
注册:2004/1/13 11:47:04
#22004/12/13 11:14:38
最好用UML设计分析图谱



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#32004/12/13 15:03:01
UML确实非常好,不过现在还没时间去学,搞软件工程UML一定很实用。


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#42004/12/23 11:02:30
下而是DbBase类的整理,参考了国外先进的设计法,并结合自身需要作了符合自己需要的数据基类。
声明:本类有一定自身特色,借签使用最好能结合自己程序。本类主要调用SQL SERVER的存储过程,但也能使用SQL命令。如果以ACCESS或主要以SQL 命令为主,最好能稍加修改。

using System;
using System.Data;
using System.Data.SqlClient;

namespace Hellosea.WebModule.Data
{
	/// <summary>
	/// 数据库的基础类,所有的数据库类均基于该类,为网站的核心程序。
	/// 数据库其它类均派生此类。
	/// </summary>
	public class DbBase
	{
		private string mConnectionString;
		protected SqlConnection DbConnection;		
		protected CommandType myCommandType;	// 用于标志执行SQL或存储过程等

		/// <summary>
		/// 受保护的只读连接字符串属性
		/// 派生类可以继承该属性
		/// </summary>
		protected string ConnectionString
		{
			get 
			{
				return mConnectionString;
			}
		}

		/// <summary>
		/// 参数化的构造函数,并建立数据库连接
		/// </summary>
		/// <param name="newConnectionString">数据库连接字符串</param>
		public DbBase(string newConnectionString)
		{
			mConnectionString = newConnectionString;
			DbConnection = new SqlConnection(mConnectionString);

			myCommandType = CommandType.StoredProcedure;
		}

		/// <summary>
		/// 建立一SqlCommand的原型,这一新的命令通常用于执行一命令,并返回数值
		/// </summary>
		/// <param name="cmdString">命令SQL或存储过程名</param>
		/// <param name="parameters">IDataParameter类的数组</param>
		/// <returns>最新的SqlCommand实例</returns>
		private SqlCommand BuildIntCommand(string cmdString, IDataParameter[] parameters)
		{
			SqlCommand command = BuildQueryCommand( cmdString, parameters );			

			command.Parameters.Add( new SqlParameter( "ReturnValue",
				SqlDbType.Int,
				4,		// Size
				ParameterDirection.ReturnValue,
				false,	// is nullable 
				0,		// byte precision
				0,		// byte scale
				string.Empty,
				DataRowVersion.Default,
				null ));

			return command;
		}

		/// <summary>
		/// 建立一SqlCommand的原型,这一新的命令通常用于把
		/// SELECT语句的结果返回给DataSet或DataReader。
		/// </summary>
		/// <param name="cmdString">SQL命令或存储过程名</param>
		/// <param name="parameters">IDataParameter类的数组</param>
		/// <returns></returns>
		private SqlCommand BuildQueryCommand( string cmdString, IDataParameter[] parameters )
		{
			SqlCommand command = new SqlCommand( cmdString, DbConnection );
			command.CommandType = myCommandType;

			foreach (SqlParameter parameter in parameters)
			{
				command.Parameters.Add( parameter );
			}

			return command;
		}

		/// <summary>
		/// 建立一SqlCommand的原型,这一新的命令通常用于把
		/// SELECT语句的结果返回给DataSet或DataReader。
		/// </summary>
		/// <param name="cmdString">命令SQL或存储过程名</param>
		private SqlCommand BuildQueryCommand( string cmdString )
		{
			SqlCommand command = new SqlCommand( cmdString, DbConnection );
			command.CommandType = myCommandType;
			return command;
		}

		/// <summary>
		/// 执行SqlCommand命令,返回整型ID号
		/// </summary>
		/// <param name="cmdString">执行的SQL语句</param>
		/// <param name="parameters">IDataParameter类的数组</param>
		/// <returns>返回整型ID号</returns>
		protected int RunCommand( string cmdString, IDataParameter[] parameters, out int rowsAffected )
		{
			int result;

			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlCommand command = BuildIntCommand( cmdString, parameters );
			rowsAffected = command.ExecuteNonQuery();
			result = (int)command.Parameters["ReturnValue"].Value;
			DbConnection.Close();
			return result;
		}

		/// <summary>
		/// 执行SqlCommand命令,不返回值
		/// </summary>
		/// <param name="cmdString">执行的SQL语句</param>
		/// <param name="parameters">IDataParameter类的数组</param>
		protected void RunCommand( string cmdString, IDataParameter[] parameters )
		{
			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlCommand command = BuildQueryCommand( cmdString, parameters );
			command.ExecuteNonQuery();
			DbConnection.Close();
		}

		/// <summary>
		/// 执行SqlCommand命令,不返回值
		/// </summary>
		/// <param name="cmdString">执行的SQL语句</param>
		protected void RunCommand( string cmdString )
		{
			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlCommand command = BuildQueryCommand( cmdString );
			command.ExecuteNonQuery();
			DbConnection.Close();
		}

		/// <summary>
		/// 执行查询,并返回SqlDataReader查询记录
		/// </summary>
		/// <param name="cmdString">执行的SQL语句</param>
		/// <returns>返回SqlDataReader查询记录</returns>
		protected SqlDataReader GetDataReader(string cmdString, IDataParameter[] parameters)
		{
			SqlDataReader returnReader;

			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlCommand command = BuildQueryCommand( cmdString, parameters );

			returnReader = command.ExecuteReader();
			//DbConnection.Close();
			return returnReader;
		}

		/// <summary>
		/// 执行查询,并返回SqlDataReader查询记录
		/// </summary>
		/// <param name="cmdString">执行的SQL语句</param>
		/// <returns>返回SqlDataReader查询记录</returns>
		protected SqlDataReader GetDataReader(string cmdString)
		{
			SqlDataReader returnReader;

			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlCommand command = BuildQueryCommand( cmdString );

			returnReader = command.ExecuteReader();
			//DbConnection.Close();
			return returnReader;
		}

		/// <summary>
		/// 执行查询,并返回DataSet查询数据集
		/// </summary>
		/// <param name="cmdStringName">执行的SQL语句</param>
		/// <param name="parameters">IDataParameter类的数组</param>
		/// <param name="tableName">要填充数据集的表名</param>
		/// <returns>返回DataSet类型数据集</returns>
		protected DataSet GetDataSet(string cmdStringName, IDataParameter[] parameters, string tableName )
		{
			DataSet dataSet = new DataSet();
			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlDataAdapter adapter = new SqlDataAdapter();
			adapter.SelectCommand = BuildQueryCommand( cmdStringName, parameters );
			adapter.Fill( dataSet, tableName );
			DbConnection.Close();

			return dataSet;
		}

		/// <summary>
		/// 执行查询,并返回DataSet查询数据集
		/// </summary>
		/// <param name="cmdStringName">执行的SQL语句</param>
		/// <param name="tableName">要填充数据集的表名</param>
		/// <returns>返回DataSet类型数据集</returns>
		protected DataSet GetDataSet(string cmdStringName, string tableName )
		{
			DataSet dataSet = new DataSet();
			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlDataAdapter adapter = new SqlDataAdapter();
			adapter.SelectCommand = BuildQueryCommand( cmdStringName );
			adapter.Fill( dataSet, tableName );
			DbConnection.Close();

			return dataSet;
		}

		/// <summary>
		/// 执行查询,把数据填充至指定数据集中
		/// </summary>
		/// <param name="cmdStringName">执行的SQL语句</param>
		/// <param name="tableName">要填充数据集的表名</param>
		/// <param name="dataSet">填充数据集</param>
		protected void GetDataSet(string cmdStringName, IDataParameter[] parameters, DataSet dataSet, string tableName )
		{
			if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
			SqlDataAdapter adapter = new SqlDataAdapter();
			adapter.SelectCommand = BuildQueryCommand( cmdStringName, parameters );
			adapter.Fill( dataSet, tableName );
			DbConnection.Close();		
		}

		/// <summary>
		/// 关闭数据库
		/// </summary>
		protected void CloseConnection()
		{
			if (DbConnection.State == ConnectionState.Open)
			{
				DbConnection.Close();
			}
		}
	}
}


非常大鱼