基于.NET的数据访问基类的构建

基于.NET的数据访问基类的构建

黄光芳

(湛江师范学院 教育技术部 ,广东 湛江 524048)

摘 要:为提高数据库应用程序的设计效率,基于VS.NET开发平台,利用ADO.NET的强大数据访问功能,设计了抽象的数据访问基类。主要通过代码的方式阐述了整个基类的创建过程,并重点介绍了创建存储过程参数的操作方法,在调用存储过程中,通过方法重载实现不同的数据库操作。利用该类并结合存储过程的优势构造数据服务层,统一整个系统的数据操作入口,提高开发效率,便于系统的升级、维护和移植。

关键词:ADO.NET数据访问基类存储过程

中图分类号: TP311.52  文献标识码:A

Construction of the Data Access Base Class Base on .NET

HUANG Guangfang

(Jiaoyujishubu, Zhangjiang Normal University, Zhangjiang Guangdong 524048)

Abstract: For enhancing development efficiency of database application, an abstract data access base class was designed with ADO.NET that has strong capacity for data access based on VS.NET development platform. Explain the entire base class construction process by the code mainly, introduce the operating methods that create the stored procedure parameters and implement different database operation through the methods overloading in the course of transferring stored procedure. Utilize this base class and combine advantages of stored procedure to construct data server layer, unify the data operating entry of the whole system, improve the efficiency of development and make the upgrading, maintenance and transplanting of the system convenient.

Key words: ADO.NET;data access;base class;stored procedure

0 引言

    在数据库应用程序中,数据访问界面都要执行相似的数据操作功能,例如查询、删除和修改等,另外,在不同或相同的应用中访问的数据种类不尽相同。所以,为了有效重用代码以提高开发效率,在项目开发中往往需要在数据层设计一个基类,利用此基类的派生类可方便的实现多种功能的数据访问。本文以课程与教学论资源库的开发为例,从数据层开始探讨在.NET开发中数据访问基类的实现过程。

1基类相关技术

1.1 ADO.NET技术

ADO.NET是.NET中一个核心技术,它提供了非连接的数据操纵功能,是多层数据访问的典型,是.NET Framework中包含的一个功能强大的数据访问类ADO.NET库有两个核心的组件(并不是COM意义上的组件):DataSet和.NET数据提供者[1]

DataSet是内存中的高速缓存区,用于高速缓存关系型的数据。为了执行常见的关系型数据任务,例如建立父/子关系,这个类可以包含数据表、数据列和数据行,甚至还可以包含各种表之间的关系。DataSet 的另一个主要特点是它对底层的数据源一无所知而这些数据源可能用于对其进行填充。这是一个分离的用于表示数据集合的独立实体并且它可通过多层应用程序的不同层由一个组件传递到另一组件,也可作为XML数据流被序列化因而非常适合于不同类型平台间的数据传输[2]

数据源提供者中常见的接口类有Connection 、Command、DataAdapter和DataReader等,每个类中都统一定义了一些方法和属性,以提供对特定类型数据源的托管访问[3]。本文以SQL Server数据库为数据源,具体的接口类分别是SqlConnection、SqlCommand、SqlDataAdapter和SqlDataReader等。

1.2 存储过程

   存储过程(Stored Procedure)是数据库中的一个重要对象,是一组为了完成特定功能的SQL语句集, 经编译后存储在数据库中[4]。对于带参数的存储过程,在调用前必须指明该参数的类型,是输入型的还是输出型的或者是输入输出型的还是返回值型的。用户通过相应的存储过程名称以及正确有效的参数便可调用该存储过程了。

    使用存储过程访问数据库相对SQL语句有很大的优势。第一,大大提高效率存储过程本身的执行速度非常快而且调用存储过程可以大大减少同数据库的交互次数第二提高安全性系统管理员可以限制存储过程执行权限避免非授权用户对数据的访问保证数据的安全第三有利于SQL语句的重用存储过程在被创建后可以在程序中被多次调用而不必重新编写该存储过程的SQL语句

2        数据访问基类基本方法的构建

在分布式的应用开发特别是基于B/S 的开发结构中通常采用三层甚至是多层架构在一些小型的多层架构应用程序中程序员为了简单方便,往往会把商务逻辑和数据访问放在同一逻辑层中,这在开发的初期虽然简单方便,但随着程序集的增加,重复的代码也越来越多,程序结构性和可维护性也越来越差。所以在资源库开发中,为了更方便处理繁多的数据操作,提高代码的利用率,系统以SQL Server为平台数据库建立一个数据层基类。在示例中,基类名为zykBaseClass,它是一个抽象类,使用C#语言编写,可以作为其他类的基类被继承。

基类的开始首先引入命名空间,声明两个变量 第一个用来储存 SQL 连接 保护类型的 只有它的子类才能访问这一属性 为了进一步保证访问的高效性 在数据访问的基类中 通常采用单体模式 提供全局的唯一连接实例 减少系统开销,此外还应该在Try/Catch错误处理结构的内部编写数据库处理代码,从而在出现错误时可以做出响应[5]。另一个用来保存数据库连接字符串信息。如下所示:

using System;

using System.Data;

using System.Data.SqlClient;

namespace zyk.config

protected SqlConnection Connection;

private string connectionString;

下面是构造函数通过连接字符串,创建一个Connection对象实例,连接信息从web.config配置文件读取方便随时更改数据连接而不必重新构建项目,但是连接并没有打开以便提高性能。

protected zykBaseClass()

        {

            connectionString = ConfigurationSettings.AppSettings["ConnStr"];

            if(Connection == null)

{

try{Connection = new SqlConnection(connectionString);}

catch(Exception ex){ …… }

             }

        }

另外基类中Close方法用于关闭数据连接,Dispose方法用于释放资源。下面方法创建执行存储过程操作的Command对象并添加Command对象执行操作过程中所需要的参数

protected SqlCommand CreateCommand(string procName,SqlParameter[] prams)

        {

            SqlCommand cmd = new SqlCommand(procName,Connection);

            cmd.CommandType = CommandType.StoredProcedure;

            //添加存储过程的参数

            if (prams != null)

            {

                foreach (SqlParameter parameter in prams)

                {

                    cmd.Parameters.Add(parameter);

                }

            }

            //添加返回参数ReturnValue

            cmd.Parameters.Add(

                new SqlParameter(RETURNVALUE, SqlDbType.Int,4,ParameterDirection.ReturnValue,

                false,0,0,string.Empty, DataRowVersion.Default,null));

            return cmd;  //返回创建的SqlCommand对象

        }

3 创建存储过程参数实现不同的数据库操作

   下面创建一系列的方法实现对表、存储过程、视图、索引和XML等数据库对象的操作。因为存储过程是数据库操作中最常用到的数据库对象,也是数据层操作中最为复杂的部分,而且使用存储过程访问数据库相对SQL语句有很大的优势,所以本文主要是针对存储过程的操作部分展开讨论。

3.1 创建存储过程参数  

在应用逻辑层调用基类方法操作数据库时,必须先设置好存储过程参数。以下是生成存储过程参数的例子。

public SqlParameter CreateParam(string ParamName,SqlDbType DbType,Int32 Size, ParameterDirection Direction,object Value)

        {

            SqlParameter param;

            if(Size > 0)

            {

                param = new SqlParameter(ParamName,DbType,Size);

            }

            else

            {

                //当参数大小为0时,不使用该参数大小值

                param = new SqlParameter(ParamName,DbType);

            }

            ……

            return param;

        }

在操作存储过程时一个主要环节就是根据存储过程传递不同类型的参数。因此考虑到不同的需要,本系统提供了三种不同的调用方式。例如下面方法创建一个输入类型的参数

public SqlParameter CreateInParam(string ParamName,SqlDbType DbType,int Size,object Value)

        {

    return CreateParam(ParamName,DbType,Size,ParameterDirection.Input,Value);

        } 

另外,还可以使用同样的方法,通过更改输入输出类型,创建输出类型的参数返回类型的参数

3.2 利用重载实现不同的数据库操作

   在创建Command对象与创建存储过程参数的函数编写完成后,接下来便可以创建不同的函数及存储过程来操作数据库。在执行存储过程中,根据表示层的需要,通过函数重载,可以返回不同类型的数据。下面方法执行一个带有参数集合的存储过程,该函数带有一个输出类型的参数,该参数用于保存从数据库获取的结果。

public void RunProc(string procName,SqlParameter[] prams,out SqlDataReader dataReader)

        {

            SqlCommand cmd = CreateCommand(procName,prams);

            dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        }

    通过重载的方式,还可以创建一系列的数据库操作方法,如public int RunProc(string procName,SqlParameter[] prams),它带两个参数,第一个参数表示存储过程名称,第二个参数表示存储过程参数,函数返回受影响的数据行

3.3 利用SQL语句直接操作数据库

   在课程与教学论资源库开发中,除了在基类中扩充更多的调用储存过程的方法以外,也可以在此类中构造运用SQL语句直接操作数据库的方法让其他类继承调用,这种方法因为在数据层没有涉及到参数传递的问题,所以相对存储过程简单很多。下面GetDataReader函数就是直接通过SQL语句读取数据库内容并返回一个SqlDataReader对象。

public SqlDataReader GetDataReader(string SqlString)

        {

            SqlCmd = new SqlCommand(SqlString,SqlConn);

            SqlConn.Open(); //打开数据库

                   SqlDataReader SqlDrow = SqlCmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

            return SqlDrow; //返回SqlDataReader对象

        }

通过为整个数据层构造一个这样的基类在系统中所有的数据底层操作都将通过这个类进行便于维护、升级也可以最大限度的复用能方便的扩充底层数据操作而不影响具体数据访问组件操作从而统一控制了数据访问的入口。

4 结束语

    本文以C#语言、SQL Server数据库为例,利用ADO.NET数据库访问组件,阐述一种基于ASP.NET技术的数据库访问基类设计方法,并重点介绍了存储过程的数据库操作。在资源库具体的开发中,还涉及到数据库组件的安全性、异常处理及存储过程权限设置等问题,这里就不再赘述。本文虽然只是针对资源库的基类展开讨论,不过作为基类的一种开发方法,在其他类似的系统开发中都有一定的参考意义。

参考文献:

[1] (美)Kouresh Ardestani,Kevin Hoffman, Donald Xie.高效掌握ADO.NET—C#编程篇[M].张哲峰译.北京:清华大学出版社,2003.

[2] 章剑林,熊传光.多层架构下的数据访问基类构造—基于.net平台[J] .安徽理工大学学报(自然科学版版),2005,25(1):18-21.

[3] 毛莉,刘广强.基于.NET的数据访问策略.微机发展,2004,14(10):52-54,58.

[4] 鄢爱兰,鹿江春.数据库存储过程应用研究.南华大学学报,2006,20(2):100-102.

[5](美)Matthew MacDonald.ASP.NET完全手册[M].贾晓军,于秀山,吕嘉章等译.北京:电子工业出版社,2003.3.

 

(本文发表在《计算机技术与发展》2008年第三期上)

你可能感兴趣的:(.net)