DAL--数据访问层的开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题提出
数据访问层(DAL)的目标创建一些以便业务层来调用的类和方法。我们之前总是用GridView来绑定DataSet和DataReader,但是在稍微大点的项目开发中DAL不能直接和用户
界面打交道。
一般来说,DAL是用来和数据库和BLL打交道的,也就是处理BLL和数据库的中间。数据以什么形式在DAL和BLL之前传递有很多的争论。不同的人有不同的意见,数据传递的形式有:DataSet,强类型的DataSet,DataReader,自定义实体。在介绍Ling to Sql之后,大家心里会有清晰的答案。在以前的开发中,我们一般是采用来和数据库打交道,那么就需要我们的开发人员对有一定的比较深入的了解,但是当我们用Linq to Sql之后,我们可以很方便的使用DataContext来与数据库拉打交道,而不需要我们懂得很多的的知识,但是在Linq to Sql的背后还是在采用ADO. NET来和数据库交互的。
还有就是事务处理的问题。关于事务的概念,相信大家都清楚,我也不赘述了。事务处理在什么地方实现有如下意见:在存储过程中直接用SQL语句来写;在DAL层处理,
在BLL层处理。当然,每一种的选择都有各自的理由和利弊。还有一点要注意的是:不要把事务处理的代码到处写,如在DAL层中写一点,在BLL中写一点。
设计方案
在设计方案中实际上就是提供几个选择来解决之前我们提出的问题。以下就是两个选择:
1.DAL只要是执行CRUD操作,CRUD是就是:Create,Read,Update,Delete.在.NET Framwe work中提供了很多和数据库打交道的类和方法,如
SqlConnection,SqlCommand,SqlCommand.ExecuteNonQuery()等,用过的朋友应该清楚这些常用的类,我这里也不罗嗦。
2.SqlHelper
用过的朋友应该知道,在我们开发过程中,很多时候写代码的时候,代码结构和功能都是大同小异的,所以基于此,微软就开发了Microsoft Data Access Application Block,只要我们调用其中的一些方法,传入一些参数就行了,不需要我们再去写那些繁琐的代码,因为这个数据访问块都已经封装好了。其中一个最重要的类就是SqlHelper.这个类是个静态类,提供了很多的方法,如下:
ExecuteNonQuery
ExecuteDataset
ExecuteReader
ExecuteScalar
FillDataset
上面方法的设计包含了很多OO的思想。我们来看看ExecuteNonQuery方法,其他的方法的设计思想和方式一样的:
//连接字符串
public static int ExecuteNonQuery(string connectionString, CommandType comm andType,string commandText)
{ … }
public static int ExecuteNonQuery(string connectionString, CommandType comm andType,string commandText, params SqlParameter[] commandParameters)
{ … }
public static int ExecuteNonQuery(string connectionString, string spName, p arams object[] parameterValues)
//连接对象
public static int ExecuteNonQuery(SqlConnection connection, CommandType com mandType, string commandText)
{ … }
public static int ExecuteNonQuery(SqlConnection connection, CommandType com mandType, string commandText, params SqlParameter[] commandParameters)
{ … }
public static int ExecuteNonQuery(SqlConnection connection, string spNam e, params object[] parameterValues)
{ … }
//事务对象
public static int ExecuteNonQuery(SqlTransaction transaction, CommandType c ommandType, string commandText)
{ … }
public static int ExecuteNonQuery(SqlTransaction transaction, CommandType c ommandType, string commandText, params SqlParameter[] commandParameters)
{ … }
public static int ExecuteNonQuery(SqlTransaction transaction, string spNam e, params object[] parameterValues)
上面前3个方法都是采用了一个连接字符串的参数,而接下来的3个方法是采用了一个连接对象为参数,最后的3个方法采用了一个事务对象为参数。这些方法在调用存储过程时提供了很大的灵活性。例如:
CREATE PROCEDURE UserAccountInsert(
@Name varchar(50),
@UserAccountId int OUTPUT
)
AS
SET NOCOUNT ON
INSERT INTO UserAccount (Name) VALUES (@Name)
SET@UserAccountId=Scope_Identity()
调用代码如下:
public int InsertUserAccount(string connectionString, string name)
{
SqlParameter[] parameters =
{
new SqlParameter( "@Name", SqlDbType.VarChar, 50),
new SqlParameter( "@UserAccountId", SqlDbType.Int)
};
parameters[0].Value = name;
parameters[1].Direction = ParameterDirection.Output;
SqlHelper.ExecuteNonQuery(connectionString,CommandType.StoredProcedure, "U serAccountInsert", parameters);