ylbtech-架构-层-DAL:DAL

DAL是数据访问层的英文缩写,即为数据访问层(Data Access Layer)。其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作

1.返回顶部
1、
中文名:DAL为数据访问层
外文名:Data Access Layer
结构层数:3层
别    称:DAL层
定    义:主要是负责数据库的访问
学    科:计算机技术

目录

2、
2.返回顶部
1、

基本介绍

在企业级应用中,很少有不与数据库打交道的。只要是用到数据库,就有把业务数据持久化到数据库的需求
在项目实际开发过程,有的直接采用JDBC技术进行数据库持久化操作,有的采用目前很好用的ORM框架来进行数据库持久化操作。
抽取数据库访问层的主要作用是进行隔离,把与数据库打交道的事情都放在数据访问层解决,在服务层则只要调用数据访问层就可以了,不必和具体的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( ),
ProductName = sdr.GetString( ),
UnitPrice = sdr.GetDecimal( ),
Type = sdr.GetString( )
}; 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( ),
ProductName = sdr.GetString( ),
UnitPrice = sdr.GetDecimal( ),
Type = sdr.GetString( )
};
}
}
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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

架构-层-DAL:DAL的更多相关文章

  1. asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

    学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...

  2. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖

    DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...

  3. 三层架构BLL+DAL+Model & MVC & MVVM

    三层架构 - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E4%B8%89%E5%B1%82%E6%9E%B6% ...

  4. 架构-层-Model:Model

    ylbtech-架构-层-Model:Model 1.返回顶部 1. Model,意思是模特儿,模特儿是英文“model”的音译.模特一般来说要五官端正,身材良好,有气质,展示能力强,另外身高要具备一 ...

  5. 架构-层-BLL:BLL

    ylbtech-架构-层-BLL:BLL 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的 ...

  6. 从架构层面谈web加载优化(个人整理)

    最近听了阿里一位大牛的讲座,讲web架构优化对网页加载的影响,看完之后对他所讲的一些优化方法进行一些总结和整理,发现收获还是蛮多的,下面多为个人整理和个人见解,希望有说的不对的,能及时指出 1.DNS ...

  7. JDBC——架构层、驱动

    JDBC(java Datebase Connector) jdbc驱动程序 四种类型: jdbc-odbc桥接驱动程序 Native-API JDBC-Net Native-Protocol (常见 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

随机推荐

  1. python学习第五十二天logging模块的使用

    很多程序都有记录日志的需求,并且日志包含的信息即有正常的程序访问日志,还可能有错误,警告等信息输出,python的 logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  2. 计算机系统结构总结_Scoreboard and Tomasulo

    Textbook:<计算机组成与设计——硬件/软件接口>  HI<计算机体系结构——量化研究方法>          QR 超标量 前面讲过超标量的概念.超标量的目的就是实现指 ...

  3. application session 实现简单的在线聊天人数的统计

    写了快一年的asp.net,application对象还真没怎么用过.看了看书,根据这两个对象的特性写了一个简单的聊天室程序.真的是非常的简陋 ASP.Net中有两个重要的对象,一个是applicat ...

  4. java中的数据类型,基本数据类型及其包装类型

    java中的8大基本类型及其包装类型 1,int--->Integer 2,byte--->Byte 3,short--->Short 4,long--->Long 5,cha ...

  5. spring服务器接收参数格式

    注:@RequestParam 或@RequestBody等注解是否添加有什么区别 不加:参数可有可无,无参数时为null,但当参数类型是 数字基本类型(int.double)时会报错: 加上@Req ...

  6. String.IsNullOrEmpty官方示例

    // This example demonstrates the String.IsNullOrEmpty() method using System; class Sample { public s ...

  7. Windows 实用软件

    Useful tool Listary Ditto Winsnap Quick Look Myper Splash GifCam ScreenToGif Free Download Manage Si ...

  8. PAT Basic 1028 人口普查 (20 分)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  9. CSS3之mix-blend-mode

    <!-- more --> 在线编辑demo 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合. mix-blend-mode: normal; //正常 mix-bl ...

  10. pyqt5-橡皮筋控件QRubberBand

    提供一个矩形或线来指示选择或边界 一般结合鼠标事件一同协作 继承于 QWidget import sys from PyQt5.QtWidgets import QApplication, QWidg ...