实体层在三层架构中的地位:
1.实体对象实际上是对应着数据库里的每张表的,我们把表里的字段封装在1个实体对象里 当你想用哪个字段 你就就通过该实体对象的get() set() 把那个字段提取出来 这比你临时创建1个变量要灵活的多 而且便于程序的维护和扩展.在实际的3层结构开发中,专门有个实体层,他的作用就是便于层和层之间的数据传递 ;
2.实体体现了面向对象程序开发的思想,把大量的数据进行封装 然后传递.当然 如果只是1,2个参数,那么传递实体或者传递变量都可以 。
比如你想查询某个学号的学生信息,那么你完全就可以以ID为参数传下去 就没必要把他再封装到实体对象里;
值与引用的区别:
将一个变量作为参数进行传递,本质是传栈空间的存储内容;
if (reader.Read()){ per = new MODEL.Person(); ** // 如果有数据,就创建对象,一行数据就对应着 一个实体类对象 }//读取一行记录,从第一行开始,if()的作用是最多一行数据
return comm.ExecuteReader(CommandBehavior.CloseConnection);//中的CommandBehavior.CloseConnection 可以用作关闭通道的用途;
从数据库表中读取的数据到c#里面都会被做一层封装:1.如果是具体的值,就封装为object, 如果是null值就被封装为DBNull,这种类型的值不方便用户后期操作,所以我们需要将这些类型的值转换为面向对象的数据---实体类对象,同时要明确,一行数据就对应着一个实体类对象,对象里面,包含了,name,cid....这些列内容,再将取出来的数据,object转换成值类型;
例:
per.name=reader["name"].tostring();
params 构造函数声明数组 而不知道数组长度 用的
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
params是指可变参数,它会根据调用方法的实参值生成一具对应长度的数组,如:没有传递实参值,那么就相当于SqlParameter[] p=new SqlParameter[0];如果传递了参数,那么就相当于SqlParameter[] p=new SqlParameter[]{p,p2,p3,p4};强调:params只能修饰数组
一般是存在于方法声明当中
例如: public static void UseParams(params int[] list){}
public static void UseParams2(params object[] list) {}
public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] ps){}
注意:
cmd.Parameters的Add方法是增加一个参数,增加多个参数的的时候使用一个foreach循环而已
cmd.Parameters的AddRange方法是增加一个参数的数组
配置文件的应用:
引用中选择框架,找到System.Configuration这个选项,选择引用;
在需要调用连接字符串的类中加入:readonly static string constr = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
最中要的是在UI层的配置文件App.config中添加下面的代码:
<connectionStrings>
<add name="constr" connectionString="Data Source=.;Initial Catalog=ItcastSIM;Integrated Security=True"/>
</connectionStrings>
当需要修改数据库时候,使用配置文件可以避免导致程序出错,若需要修改数据库,则直接将配置文件找到打开后修改便可;
sqlHelp类的出现,是为了将重复的代码,封装成一个类对象,然后需要的时候就直接调用到该类中的方法,例如sqlDataReader reader=sqlHelp.ExecuteReader(comm,p,p2);