三层访问数据库

一、在三层中,要表示的信息的话,需要连接数据库,需要一个类。

1、添加一个DBHelper类

class DBHelper
{
private static string strConn = ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString;
/// <summary>
/// 查询
/// </summary>
/// <param name="sql">查询语句</param>
/// <param name="sqlParameters">参数列表</param>
/// <returns></returns>
public static DataTable Query(string sql, params SqlParameter[] sqlParameters)
{
DataTable table = new DataTable();//实例化
SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, strConn);
//查询参数是否大于0
if (sqlParameters.Length > 0)
{
//添加
dataAdapter.SelectCommand.Parameters.AddRange(sqlParameters);
}
dataAdapter.Fill(table);
return table;
}
/// <summary>
/// 单条查询
/// </summary>
/// <param name="sql">查询语句</param>
/// <param name="sqlParameters">参数列表</param>
/// <returns></returns>
public static SqlDataReader Reader(string sql, params SqlParameter[] sqlParameters)
{
//创建数据库链接
SqlConnection sqlConnection = new SqlConnection(strConn);
//打开数据库
sqlConnection.Open();
//创建对象
SqlCommand sqlCommand = new SqlCommand(sql, sqlConnection);
if (sqlParameters.Length > 0)
{
sqlCommand.Parameters.AddRange(sqlParameters);
}
//数据库链接SqlDataReader对象关闭时自动关闭
SqlDataReader dataReader = sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
//dataReader.Close();

//if (sqlConnection.State == ConnectionState.Open)
// sqlConnection.Close();
return dataReader;
}
/// <summary>
/// 非查询
/// </summary>
/// <param name="sql">非查询语句</param>
/// <param name="sqlParameters">参数列表</param>
/// <returns></returns>
/// sql:sql语句 parameters:需要的参数集合
public static int NonQuery(string sql,CommandType type=CommandType.Text, params SqlParameter[] sqlParameters)
{
int rum = 0;
//当到达using语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以推出using语句。自动释放对象
using (SqlConnection sqlConnection = new SqlConnection(strConn))
{
using (SqlCommand sqlCommand = new SqlCommand(sql, sqlConnection))
{
sqlCommand.CommandType = type;
try
{
if (sqlParameters.Length > 0)
{
sqlCommand.Parameters.AddRange(sqlParameters);//获取执行操作后,受影响的行数
}
sqlConnection.Open();
rum = sqlCommand.ExecuteNonQuery();
}
finally
{
//数据库状态打开时
if (sqlConnection.State == ConnectionState.Open)
sqlConnection.Close();//关闭数据库
}
//sqlConnection.Dispose();

return rum;
}
}
}
}

2、通过DAL进行提供数据的服务,直接操作数据库,针对其增删改查的一些操作。

public List<Classinfo> Select(string name="")
{
var sql = $"select * from Classinfo where name like @name";
SqlParameter[] sqlParameters = new SqlParameter[]
{
new SqlParameter("@name",$"%{name}%")
};
DataTable table = DBHelper.Query(sql, sqlParameters);
List<Classinfo> list = new List<Classinfo>();
foreach (DataRow row in table.Rows)
{
var cla = new Classinfo()
{
Id = Convert.ToInt32(row["Id"]),
Name = Convert.ToString(row["Name"]),
Remarks = Convert.ToString(row["Remarks"]),
};
list.Add(cla);
}
return list;
}
public Classinfo Select(int id)
{

var sql = "select * from classinfo where id=@id";
SqlParameter[] sqlParameter = new SqlParameter[]
{
new SqlParameter("@id",id)
};
SqlDataReader reader = DBHelper.Reader(sql, sqlParameter);
Classinfo info = null;
if (reader.Read())
{
info = new Classinfo()
{
Id = Convert.ToInt32(reader["Id"]),
Name = Convert.ToString(reader["Name"]),
Remarks = Convert.ToString(reader["Remarks"]),
};
}
reader.Close();
return info;
}
//添加
public int Insert(Classinfo info)
{

var sql = "insert into classinfo values (@name,@remarks)";
SqlParameter[] sqlParameters = new SqlParameter[]
{
new SqlParameter("@name",info.Name),
new SqlParameter("@remarks",info.Remarks),
};
return DBHelper.NonQuery(sql, CommandType.Text, sqlParameters);
}
//删除
public int Delete(Classinfo info)
{

var sql = "del_class";
SqlParameter[] sqlParameters = new SqlParameter[]
{
new SqlParameter("@id",id)
};
return DBHelper.NonQuery(sql, CommandType.StoredProcedure, sqlParameters);
}
//修改
public int Update(Classinfo info)
{

var sql = "Update classinfo set name=@name,remarks=@remarks where id=@id";
SqlParameter[] sqlParameters = new SqlParameter[]
{
new SqlParameter ("@id",info.Id),
new SqlParameter("@name",info.Name),
new SqlParameter("@remarks",info.Remarks),
};
return DBHelper.NonQuery(sql, sqlParameters: sqlParameters);

}

3、BLL层,是数据访问层和表示层之间的桥梁,针对具体问题的操作

public static List<Classinfo> Select(string name = "")
{
return ClassinfoDAL.Select(name);
}
public static Classinfo Select(int id)
{
return ClassinfoDAL.Select(id);
}
//添加
public static int Insert(Classinfo info)
{
return ClassinfoDAL.Insert(info);
}
//删除
public static int Delete(int id)
{
return ClassinfoDAL.Delete(id);
}
//修改
public static int Update(Classinfo info)
{
return ClassinfoDAL.Update(info);
}

4、UI表示层,通俗讲就是展现给用户的界面,用于显示数据和接受用户输入的数据;即用户在使用一个系统的时候他的所见所得。

<div>
<a href="ClassinfoAdd.aspx">添加</a>
<%--<asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/ClassinfoAdd.aspx" />--%>
<asp:GridView ID="GridView1" runat="server" DataKeyNames="Id" AutoGenerateColumns="False" AllowSorting="True" OnRowDeleting="GridView1_RowDeleting">
<Columns>
<asp:BoundField DataField="Id" HeaderText="编号" />
<asp:BoundField DataField="Name" HeaderText="班级" />
<asp:BoundField DataField="Remarks" HeaderText="备注" />
<asp:HyperLinkField Text="详情" DataNavigateUrlFields="Id" DataNavigateUrlFormatString="ClassinfoDetial.aspx?id={0}" />
<asp:HyperLinkField Text="修改" DataNavigateUrlFields="Id" DataNavigateUrlFormatString="ClassinfoUpdate.aspx?id={0}" />
<asp:CommandField ShowDeleteButton="True" />
</Columns>
</asp:GridView>
</div>

 

 二、为什么要用三层呢?

1.分析

层次结构在现实社会中随处可见。记得有个笑话讲有个村长得意的向他的老婆吹牛:“全中国比我官大的只有四个人,乡长、县长、省长和国务院总理”,这个笑话体现了真实社会的分层现象,社会人群会分层,公司管理人员结构也会分层

楼房是分层的,甚至做包子的笼屉也是分层的,虽然分层的目的各有不同,但都是为了解决某一问题而产生的,所以分层架构是为了解决某一问题而产生的解决方案。

        社会分工的优势:让适合的人做自己最擅长的事情,缩短劳动时间,提高劳动效率。人尽其才,物尽其用。软件开发也一样,开发小项目,也许分层与不分层也许看不出多大的差别来,分层可能显得更加啰嗦,但是当开发一个复杂的项目时,分层的优势就显示出来了。

        举个例子:我们重构机房收费系统,需要进行数据库的访问,在不分层的情况下,就会出现大量重复的代码,无非就是数据库的增、删、改、查,这些重复的代码可以适用于多个模块,就是字段名和数量不一样。光敲这些重复的代码就得花去我们不少的时间,何况我们的机房收费系统还只是一个不大的项目。如果是一个较大的项目呢?

每一个事物有优点必有缺点,分层架构的缺点主要有以下两点:

        1)、分层也一样,如果不分层,很多业务可以直接访问数据库,获得数据,而现在却必须通过中间层来访问,从而降低了系统运行性能。

        2)、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

     不过分层架构的利大于弊。

2、结束语

在软件体系架构中,分层式结构是比较容易懂的也是最常见的一个结构,而三层结构又是分层结构里面最常见的一种分层方式,也是Microsoft推荐的分层式结构。分层式结构还有其他模式例如MVC,了解和熟悉三层架构之后,学习其他架构会显得比较容易,让我们先从最容易理解的学起。

posted @ 2021-11-23 21:34  烈焰杀神小军  阅读(127)  评论(0)    收藏  举报