protected int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected ) { int result; Connection.Open(); SqlCommand command = BuildIntCommand( storedProcName, parameters ); rowsAffected = command.ExecuteNonQuery(); result = (int)command.Parameters["ReturnValue"].Value; Connection.Close(); return result; } protected SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters ) { SqlDataReader returnReader; Connection.Open(); SqlCommand command = BuildQueryCommand( storedProcName, parameters ); command.CommandType = CommandType.StoredProcedure; returnReader = command.ExecuteReader(); //Connection.Close(); return returnReader; } protected DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName ) { DataSet dataSet = new DataSet(); Connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand( storedProcName, parameters ); sqlDA.Fill( dataSet, tableName ); Connection.Close(); return dataSet; } protected void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName ) { Connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildIntCommand( storedProcName, parameters ); sqlDA.Fill( dataSet, tableName ); Connection.Close(); } |
其次是要建立逻辑层,这个逻辑层基本上就是实例化数据层DataCore之后为表示层返回一些DataSet,DataReader之类或是执行一些insert,update,delete之类语句。这个逻辑层也是为了区分整个Project下面不同功能模块。比如说用户模块起名叫做UserModel.cs,新闻模块叫做NewsModel.cs之类。逻辑层的另一个好处就是可以为表示层建立可以多次实例化的同一个对象或是方法。比如说User类,通过ID或是Username 查询并建立的对象可以被表示层多次调用。
最后是表示层,表示层的功能就是完成页面逻辑。主要是接受客户端数据然后经过简单整合和判断,传递给逻辑层处理。同样,接收逻辑层传递来的Dataset或DataReader,表示在前台页面。
数据在各个层次之间的关系相对独立,但是又相对连续。
独立性:
对于表示层之外的几个层,都可以把单个的对象或是方法直接拿出来放到其他工程中。因为每个曾都是为了实现模型中独立的功能而完成的。因为在类似工程中的应用基本上不用太大改动,特别是一些相对更加原始的层,在这个示例中的DataCore就是一个典型的例子。
连续性:
数据在传递过程中有较强的连续性。举一个例子,在表示层中有这样一个根据Session中Userid返回一个Dataset,原本我是这样写的:
表示层:
DataSet UserInforRow = ObjectUser.GetUserInfor(Int32.Parse(Session["UserId"].ToString())); |
public DataSet GetUserInfor(int UserID) { SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,4)}; parameters[0].Value = UserID; using(DataSet UserInfor = RunProcedure("GetUserInfor",parameters,"UserInfor")) { return UserInfor; } } |
对于这个问题的解决方案有两种,无非是更改表示层还是更改逻辑层。更改逻辑层,就要改成
SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,32)}; |
DataSet UserInforRow = ObjectUser.GetUserInfor(int.Parse(Session["UserId"].ToString())); |