SUFC_WebSite 广东工业大学计算机学院学生会网站,从接手到现在快一个多月了,实际动手也不过半个月,DAL已经完成了百分之七八十吧,剩下百分之二十是在测试阶段完成,我想测试阶段的改动也会挺大吧。
DAL类:
DAL说白了就是一个类库,供前台调用,对数据库执行增删改查。DAL 为每个实体提供一组方法,每个方法会调用一或多个存储过程。
通过抽取方法,把执行存储过程的方法分离开来,把底层对数据库的操作都封装在一类里面,减少了代码冗余,代码最大程度的得到了复用,几乎全部DAL方法都要调用。
一共有3个方法,一个构建Command 对象,两个执行存储过程。传入参数对象数组,设置Command 对象,也是一个减少代码冗余的好方法。
/// 执行存储过程,返回DataSet对象
/// </summary>
/// <param name="storedProcName">存储过程名字</param>
/// <param name="parameters">参数</param>
/// <param name="tableName">表名</param>
/// <returns></returns>
public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDateAdpter = new SqlDataAdapter();
sqlDateAdpter.SelectCommand =DBHelpSQL.BuildQueryCommand(connection, storedProcName, parameters);
sqlDateAdpter.Fill(dataSet, tableName);
return dataSet;
}
}
/// <summary>
/// 执行存储过程,返回指示值
/// </summary>
/// <param name="storedProcName">存储过程名字</param>
/// <param name="parameters">参数</param>
/// <returns>指示值</returns>
public static void RunProcedure(string storedProcName, IDataParameter[] parameters)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
connection.Open();
command.ExecuteNonQuery();
}
}
/// <summary>
/// 构建 Command 对象,内部方法
/// </summary>
/// <param name="connection"></param>
/// <param name="storedProcName"></param>
/// <param name="parameters"></param>
/// <returns></returns>
private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = new SqlCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter parameter in parameters)
{
if (parameter != null)
{
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
command.Parameters.Add(parameter);
}
}
return command;
}
实体类的命名:
一个实体对象就是一组属性,BLL 通过调用实体类和IDAL ,实现对具体数据的操作。
写实体类并不是很难,但是后来我发现我错了,错就错在属性的变量名的命名上,准确的命名规则如下:先加“_”下划线,再变量名。
/// <summary>
/// 用户名
/// </summary>
public int UserNO
{
set{ _userno=value;}
get{return _userno;}
}
SqlParameter类:
在SUFC_WebSite_DAL中,实际用的是SqlParameter数组,这样就不用因为参数的个数而受限制了,只要把SqlParameter[] 直接传个BuildQueryCommand()方法(详细看前面代码)。
SqlParameter的Direction属性:
获取或设置一个值,该值指示参数是只可输入、只可输出、双向还是存储过程返回值参数。
这个属性需要ParameterDirection 枚举来设置的:
Input 参数是输入参数。
Output 参数是输出参数。
InputOutput 参数既能输入,也能输出。
ReturnValue 参数表示诸如存储过程、内置函数或用户定义函数之类的操作的返回值。
需要注意一点的是,如果执行存储过程,返回两个值(不是返回一个结果集和一个值),这时需要在存储过程里把其中一个设置冲OUTPUT,这样DAL才能得到两值。
web.config文件:
SUFC_WebSite 的连接字符串是直接明文写在web.config文件里面的,这是十分不安全的,在后续的工作中会努力完善的。
实际项目中,通过web.config文件来设置获取类是很常见的。比如通过事先存放在web.config文件的命名空间和类名,直接指向具体的数据库操作类,配置好具体的Factory对象的完整的类名,实现“工厂模式”。这各也是我没有在SUFC_WebSite项目实现。上述两个缺点,我会尽力弥补上去。

浙公网安备 33010602011771号