机房重构在敲了一条简单的登录线之后,对于“三层”理解突然感觉通了一窍。其实仔细想想也挺有意思的,每个层各司其职,通过一层调用一层来产生信息的传递。Model就像是三层之间通信的使者,很好的封装了数据,使数据在三层之间更方便的传输。要说起数据的处理,增删改查就统统包括了,其DAL层中就是定义了这四个主要的函数,ADO.NET作为强大的数据访问助手,给DAL层省了不少事情。
还记得VB当中,为了访问数据我们使用的ADO对象么?有了新朋友,可不能忘了老朋友。ADO.NET的名称就是来源于ADO,ADO是用在以往的Microsoft技术中访问数据,那为什么升级之后名字多了一个“.NET”呢??那是因为Microsoft希望表明,这是在NET编程环境中优化使用的数据访问接口。
一、理论学习(对比ADO)
回顾着ADO,让我们认识一下ADO.NET。
1、COM VS NET
ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。众所周知.NET体系不同于COM体系,ADO.NET接口也就完全不同于ADO和OLE DB接口,这也就是说ADO.NET和ADO是两种数据访问方式。
2、在线运作 VS 离线运作
ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的。ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线。这样就大大提高了我们数据库的安全,也会提高性能。
3、主要对象的对比
ADO | ADO.NET |
Connection | Connection |
Command | Command |
DataAdaper | |
DataReader | |
RecordSet | DataSet |
(2)再看,最后这行,两个功能相似的对象:Recordset(ADO)是一个连接或断开的(通过使用游标)的记录集合,被定义成数据表。DataSet(ADO.NET)是一个断开的记录集合,它可以作为在内存中使用的数据集。
(3)最后看,ADO.NET升级后的新对象。因为.NET的离线访问方式,于是就出现DataAdaper对象,用来充当DataSet和数据源之间用于检索和保存数据的桥梁。DataReader是一个简单的数据集,检索的数据只能读取,不能修改。对于ADO.NET这几个对象,看了下面这张图,你会更加清楚他们之间是如何协调工作的。
二、代码实现
看完了ADO.NET类的介绍,我们就利用这几个对象,编一个DAL层,看看它访问数据库的过程。
Imports System.Data Imports System.Data.sqlClient Imports Login.Model Public Class DALUser Public Function SelectUser(ByVal user As ModelUser) As ModelUser '函数功能:从user表中查信息,并以User实体返回数据库中的数据 Dim conn As sqlConnection = New sqlConnection(Util.connstring()) '数据库连接的字符串 Dim cmd As New sqlCommand '定义一个命令对象 cmd.Connection = conn '发送命令前,先取得连接的字符串 cmd.CommandText = "Select * From User_Info Where UserID=@ID and PWD=@Password" '查询实体中(UI层传入的数据)的这条记录 cmd.Parameters.Add(New sqlParameter("@ID",user.ID)) '设置参数 cmd.Parameters.Add(New sqlParameter("@Password",user.Password)) '设置参数 cmd.CommandType = CommandType.Text 'COMMAND命令的属性设置为sql语句 conn.Open() '打开连接 Dim reader As sqlClient.sqlDataReader '定义数据集对象 reader = cmd.ExecuteReader() '执行查询操作,返回多行多列结果(如果有记录就要返回给loginuser实体对象) Dim loginuser As New ModelUser '把Userinfo表信息实例化 Try While (reader.Read()) '循环的条件是:记录存在。 loginuser.ID = reader.GetInt32(0) loginuser.Password = reader.GetString(reader.GetOrdinal("PWD")) loginuser.level = reader.GetString(reader.GetOrdinal("level")) End While Catch ex As Exception Finally If Not IsNothing(conn) Then conn.Close() End If End Try Return loginuser '把从Reader中取得数据返回到BLL层进行逻辑判断。 End Function End Class
三、小结
其实对于ADO.NET我们一点也不陌生,.NET平台为我们写好了很多的类,进行了打包和封装的工作。形成了类库,我们就用现成的就可以了。给我们带来了很多的方便。看来面向对象的语言就是比面向过程的语言简单。