Asp.net的多层架构主要是为了解决数据层,逻辑层,表示层等之间的关系
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();
}
... {
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();
}
最后是表示层,表示层的功能就是完成页面逻辑。主要是接受客户端数据然后经过简单整合和判断,传递给逻辑层处理。同样,接收逻辑层传递来的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,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())); |
其他类似的变量传递和引用也遇到类似问题,虽然几个层次相对独立,但是在数据的传递上也相对连续。