ylbtech-架构-层-DAL:DAL |
DAL是数据访问层的英文缩写,即为数据访问层(Data Access Layer)。其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作。
1.返回顶部 |
1、
2、
2.返回顶部 |
1、
基本介绍
在企业级应用中,很少有不与数据库打交道的。只要是用到数据库,就有把业务数据持久化到数据库的需求。
抽取数据库访问层的主要作用是进行隔离,把与数据库打交道的事情都放在数据访问层解决,在服务层则只要调用数据访问层就可以了,不必和具体的ORM层实现相耦合。
数据库访问层:又称为DAL层,有时候也称为是持久层,其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作。如果要加入ORM的思想,就会包括对象和数据表之间的映射,以及对象实体的持久化操作。
讲到数据库访问层,不得不提下三层架构,通常会把应用系统划分为:表现层、业务逻辑层和数据库访问层。这样的设计目的是为了实现“高内聚,低耦合”的设计思想。数据库访问层在三层架构中只负责数据存储与读取。业务逻辑层作为数据库访问层的上层,内部调用数据库访问层提供的方法,来完成数据的存储与读取。数据库访问层与底层数据库应该是独立的,好的数据库访问层方案是能够在不修改程序代码功能的基础之上实现不同类型数据库的动态切换。我们比较熟悉的做法就是通过XML配置文件来完成底层数据库的切换。目前很多流行的数据库访问层框架都是采用这种方式来实现数据库的动态切换。数据访问层能够将应用程序中的数据持久化到存储介质中,通常我们使用的数据库都是关系型的数据库,采用的数据模型都是对象模型,这就需要数据库访问层实现对象模型与关系模型直接的、互相的转换。
特点
三层结构为:
1.表示层(USL):主要表示WEB方式,也可以表示成WINFORM方式。如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
2.业务逻辑层(BLL):主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。如果说数据层是积木,那逻辑层就是对这些积木的搭建。
3.数据访问层(DAL):主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务。
设计
数据访问层DataAccessLayer用于数据库数据的读写操作,该层只包含一个类文件Database.cs。在该类文件中需要创建一些方法以完成建立数据库连接、向数据库提交SQL语句并返回相应的操作结果等功能。
添加类文件
在DataAccessLayer文件夹下添加新项,在“选择新项”对话框中选择模板为“类”给类文件命名为Database.cs,单击“添加”按钮。
引用命名空间
由于类的代码中要使用ADO.NET相关对象,需要引用以下命名空间:
using System.Data.SqlClient;
类文件结构
将Database类的定义代码放在命名空间MessageBoard.DataAccessLayer的定义中,付码结构如下:
namespace MessageBoard.DataAccessLayer { public class Database { 自定义方法() { } } }
在Database类中添加方法
(1)DBCon()方法
功能:返回SqlConnection对象的数据库连接参数,属于无参函数。代码如下:
using System.Data.SqlClient; public class DBConnection { SqlConnection conn = null; public DBConnection() { //TODO:创建对象 // Windows 身份验证 //conn = new SqlConnection("Server=.;Database=db1;Integrated Security=SSPI"); // 本地连接 // SQL Server 身份验证 // .,locahost,127.0.0.1 都代表本地 //conn.ConnectionString = "Server=.;Database=db1;Uid=sa;Pwd=123456"; //conn.ConnectionString = "Server=locahost;Database=db1;Uid=sa;Pwd=123456"; //conn.ConnectionString = "Server=127.0.0.1;Database=db1;Uid=sa;Pwd=123456"; conn = new SqlConnection( "Server=.;User ID=sa;Password=123456;Initial Catalog=db1;Min Pool Size=30;Max Pool Size=100;Connect Timeout=60" ); // 远程连接 } public SqlConnection Conn { get { return conn; } set { conn = value; } } }
也可以用以下方法直接返回数据库连接字符串:
// 创建Conn对象 SqlConnection conn = new DBConnection().Conn;
(2)GetDataSet(String)方法
功能:接收传来的SQL语句,执行查询操作,返回查询结果集。该方法的参数为字符类型,代码如下:
(3)ExecuteSQL(String)方法
功能:接收传来的SQL语句,执行非查询操作,完成将留言信息写到数据库中的操作。该方法的参数为字符串类型,代码如下:
2、
3. 代码返回顶部 |
·DBConnection.cs
using System.Data.SqlClient; public class DBConnection { SqlConnection conn = null; public DBConnection() { //TODO:创建对象 // Windows 身份验证 //conn = new SqlConnection("Server=.;Database=db1;Integrated Security=SSPI"); // 本地连接 // SQL Server 身份验证 // .,locahost,127.0.0.1 都代表本地 //conn.ConnectionString = "Server=.;Database=db1;Uid=sa;Pwd=123456"; //conn.ConnectionString = "Server=locahost;Database=db1;Uid=sa;Pwd=123456"; //conn.ConnectionString = "Server=127.0.0.1;Database=db1;Uid=sa;Pwd=123456"; conn = new SqlConnection( "Server=.;User ID=sa;Password=123456;Initial Catalog=db1;Min Pool Size=30;Max Pool Size=100;Connect Timeout=60" ); // 远程连接 } public SqlConnection Conn { get { return conn; } set { conn = value; } } }
·ProductInfo.cs
public class ProductInfo { public int? ProductId { get; set; } public string ProductName { get; set; } public decimal? UnitPrice { get; set; } public string Type { get; set; } }
·Product.cs
using System.Collections.Generic; using System.Data.SqlClient; public class Product { /// <summary> /// ylb: 1,GetAll /// remark: 获取所有产品,并以productId降序排列 /// </summary> /// <returns></returns> public IList<ProductInfo> GetAll() { IList<ProductInfo> dals = new List<ProductInfo>(); string sql = "select productId,productName,unitPrice,type from Product"; SqlConnection conn = new DBConnection().Conn; SqlCommand com = conn.CreateCommand(); com.CommandText = sql; conn.Open(); try { SqlDataReader sdr = com.ExecuteReader(); while( sdr.Read() ) { ProductInfo dal = new ProductInfo() { ProductId = sdr.GetInt32( 0 ), ProductName = sdr.GetString( 1 ), UnitPrice = sdr.GetDecimal( 2 ), Type = sdr.GetString( 3 ) }; dals.Add( dal ); } } finally { conn.Close(); } return dals; } /// <summary> /// ylb: 2,Add /// remark: 添加一个产品 /// field: productName,unitPrice,type /// </summary> /// <param name="dal"></param> public void Add( ProductInfo dal ) { string sql = "insert into Product(productName,unitPrice,type) values(@productName,@unitPrice,@type)"; SqlConnection conn = new DBConnection().Conn; SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productName", dal.ProductName ) ); com.Parameters.Add( new SqlParameter( "@unitPrice", dal.UnitPrice ) ); com.Parameters.Add( new SqlParameter( "@type", dal.Type ) ); com.CommandText = sql; conn.Open(); try { com.ExecuteNonQuery(); } finally { conn.Close(); } } /// <summary> /// ylb: 3,GetModel /// remark: 获得一个实体对象,根据productId /// </summary> /// <param name="productId"></param> /// <returns></returns> public ProductInfo GetModel( int productId ) { ProductInfo dal = null; string sql = "select productId,productName,unitPrice,type from Product where productId=@productId"; SqlConnection conn = new DBConnection().Conn; SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productId", productId ) ); com.CommandText = sql; conn.Open(); try { SqlDataReader sdr = com.ExecuteReader(); while( sdr.Read() ) { dal = new ProductInfo() { ProductId = sdr.GetInt32( 0 ), ProductName = sdr.GetString( 1 ), UnitPrice = sdr.GetDecimal( 2 ), Type = sdr.GetString( 3 ) }; } } finally { conn.Close(); } return dal; } /// <summary> /// ylb: 4,Update /// remark: 修改一条信息 ,根据productId /// </summary> /// <param name="dal"></param> public void Update( ProductInfo dal ) { string sql = "update Product set productName=@productName,unitPrice=@unitPrice,type=@type where productId=@productId"; SqlConnection conn = new DBConnection().Conn; SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productName", dal.ProductName ) ); com.Parameters.Add( new SqlParameter( "@unitPrice", dal.UnitPrice ) ); com.Parameters.Add( new SqlParameter( "@type", dal.Type ) ); com.Parameters.Add( new SqlParameter( "@productId", dal.ProductId ) ); com.CommandText = sql; conn.Open(); try { com.ExecuteNonQuery(); } finally { conn.Close(); } } /// <summary> /// ylb: 5,Delete /// remark: 删除一条信息,根据productId /// </summary> /// <param name="productId"></param> public void Delete( int productId ) { string sql = "delete Product where productId=@productId"; SqlConnection conn = new DBConnection().Conn; SqlCommand com = conn.CreateCommand(); com.Parameters.Add( new SqlParameter( "@productId", productId ) ); com.CommandText = sql; conn.Open(); try { com.ExecuteNonQuery(); } finally { conn.Close(); } } }
·
4.返回顶部 |
5.返回顶部 |
1、
2、
6.返回顶部 |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |