如何入手机房重构
sqlHelper连接数据库
- 什么是 sqlHelper(数据库助手类)
SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了 - 怎么写sqlHelper
sqlHelper作为连接数据库的核心功能类代码 肯定是要写在DAL层的
public class sqlHelper
{
//从配置文件中读取连接字符串
private static readonly string connStr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
//ExecuteNonQuery(); //执行命令的方法: insert update delete
//返回值类型为int型。多用于执行增加,删除,修改数据,返回受影响的行数。当select操作时,返回-1.
//ExecuteNonQuery()方法主要用户更新数据,通常它使用Updae,Insert,Delete语句来操作数据库,
//其方法返回值意义;对于Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,
//params是关键字:是可变参数的意思,目的是省略手动构造数组的过程,直接指定对象编译器会帮助我们构造数组,并将对象加入数组中传递过来
public static int ExcuteNonQuery(string sql, params SqlParameter[] pms)
{
using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象
{
SqlCommand cmd = new SqlCommand(sql, conn);//创建command连接对象
cmd.Parameters.AddRange(pms);
conn.Open();//打开链接
int n = cmd.ExecuteNonQuery();//执行命令并返回受影响的行数
cmd.Parameters.Clear();
return n;
}
}
//Executescaler(); 获取首行首列的方法
//它的返回值类型多为int类型。它返回的多为执行select查询。得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。
//ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,
//ExecuteScalar()方法的返回值的数据类型是Object类型。
//如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,
//如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,
public static object ExecuteScalar(string sql, params SqlParameter[] pms)
{
using (SqlConnection conn = new SqlConnection(connStr))//创建链接对象
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(pms); //添加参数
conn.Open();//打开链接
object o = cmd.ExecuteScalar();//执行命令,获取查询结构中的首行首列的值
cmd.Parameters.Clear();
return o;
}
}
//获取结果结果集
public static DataTable GetDataTable(string sql, params SqlParameter[] pms)
{
using (SqlConnection conn = new SqlConnection(connStr))//创建链接对象
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);//创建适配器对象
DataTable dt = new DataTable();//构造数据表用于接受查询结果
adapter.SelectCommand.Parameters.AddRange(pms);//添加参数
adapter.Fill(dt);//执行结果,fill方法内部自动打开链接,不需要Conn。open();
adapter.SelectCommand.Parameters.Clear();//清空集合
return dt;//返回结果集
}
}
}
- 如何用sqlHelper
这段代码重点在于注释!注释标明了方法的适用类型 返回类型 返回值意义 例如
就清晰的解释了ExcuteNonQuery的使用方法 这是我们在选择语句的重要依据
七层的概念
- U B D 三层的扩展
七层是在三层原有的基础上为了方便代码阅读、解耦合、更符合面向对象的思想、更符合代码设计的要求而出现的
例如:
一、项目名称及描述:(实现步骤为:4-1-3-5-2-7-5-6-1)
1、UI=表示层
2、BLL=业务逻辑层
3、IBLL=业务逻辑接口层定义
4、Model=业务实体
5、Factory=抽象工厂(创建反射)
6、DAL = 数据层
7、IDAL = 数据接口层定义
二、项目引用关系
1、UI 引用 IBLL、Model
2、BLL 引用 IDAL,Model,使用DALFactory创建实例,实现接口方法。
3、IDAL/IBLL 引用 Model。
4、Model 无引用。
5、DALFactory 引用IDAL,返回给BLL使用。
6、DAL 引用 Model和IDAL,实现接口里的方法。
三、实现步骤
1、创建Model,实现业务实体。
2、根据需要的返回值类型和传入的参数创建IBLL。
3、运用抽象工厂加反射+配置文件BLL实现接口
4、D层同样过程
5、U层传入参数,接收D层返回给B层的值,经过逻辑加工返回结果给UI层
注意:
1、一定要添加引用,不然各层之间不能进行联通
2、遇到错误,一定断点调试,看传入值的走向和代码书写的正确性
3、逻辑一定要是通的 最好先画好流程图
4、注意修改解决方案里的项目依赖。
5、注意在解决方案里增加各项目引用。
解耦思想
- 什么是耦合
一个好的软件工程一定是高内聚低耦合的
但是什么是耦合呢?
通俗来讲就是类模块一依赖于类模块二,当我们有需求需要改动类模块二的时候,类模块一就也需要跟着更改 - 怎么解耦合
接口的引入就是一种很好的解耦合方法 当然还有设计模式 方法类的封装,但是都基于接口的应用
接口的使用
- 什么是接口?
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
接口使得实现接口的类或结构在形式上保持一致。
通俗来讲接口分为两部分:有什么 和 缺什么 例如:
public interface IDeleteonlinestu
{
/// <summary>
/// 删除上机表中的学生
/// </summary>
/// <param name="cardID">传入的值</param>
/// <returns></returns>
int deleteonlinestu(string cardID);
}
这就是一个简单的接口代码 怎么解读呢?
括号中是我们有的东西 也就是需要传入的值
而“ int ” 是我们没有的 需要从实现类中接收的返回值类型
- 实现类实现接口