ASP.NET 一个数据访问层的封装

刚通过开通写博客的申请,向博客园的大佬致敬,由于一直以来都在网上搜索大家的思想,也有翻遍整个百度都有的找不到的时候,作为一个网民理应为互联网贡献一点东西。

下面是我工作后受一个师傅的影响对数据库访问层的封装,多年以来一直都在使用,用的特别爽,请看下面的代码:

第一步、需要编写一个通用的用于查询的数据库存储过程,这个存储过程接受“表名、查询字段、排序、页大小、页码”:

CREATE PROCEDURE [dbo].[P_Pagination]
    @tblName varchar(5000), -- 表名
    @strGetFields varchar(1000) = ‘*‘, -- 需要返回的列
    @strWhere varchar(1500) = ‘‘, -- 查询条件(注意: 不要加 where)
    @OrderSql varchar(255) = ‘‘, -- 排序语句(注意: 不要加 order by)
    @PageSize int = 0, -- 页尺寸
    @PageIndex int = 1, -- 页码
    @doCount bit = 0 -- 返回记录总数,非 0 值则返回
AS
BEGIN
    declare @strSQL varchar(5000) -- 主语句

    if @doCount <> 0
    begin
        if @strWhere <> ‘‘
            set @strSQL = ‘select count(*) as Total from ‘ + @tblName + ‘ where ‘ + @strWhere
        else
            set @strSQL = ‘select count(*) as Total from ‘ + @tblName + ‘‘
    end
    --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    else
    begin
        if @PageSize = 0 --返回所有记录集
        begin
            if @strWhere <> ‘‘
                set @strSQL = ‘select ‘ + @strGetFields + ‘ from ‘ + @tblName + ‘ where ‘ + @strWhere + ‘ order by ‘ + @OrderSql
            else
                set @strSQL = ‘select ‘ + @strGetFields + ‘ from ‘ + @tblName + ‘ order by ‘ + @OrderSql
        end
        else
        begin
            if @PageIndex = 1
            begin
                if @strWhere <> ‘‘
                    set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ ‘ + @strGetFields + ‘ from ‘ + @tblName + ‘ where ‘ + @strWhere + ‘ order by ‘ + @OrderSql
                else
                    set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ ‘ + @strGetFields + ‘ from ‘ + @tblName + ‘ order by ‘ + @OrderSql
                --如果是第一页就执行以上代码,这样会加快执行速度
            end
            else
            begin
                --以下代码赋予了@strSQL以真正执行的SQL代码
                if @strWhere = ‘‘
                    set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ tblTmp.* from ‘
                        + ‘(select ROW_NUMBER() OVER(order by ‘ + @OrderSql + ‘) AS RowNum,‘ + @strGetFields + ‘ from ‘ + @tblName + ‘) tblTmp where tblTmp.[RowNum] > ‘
                            + ‘(select max([RowNum]) from ‘
                                + ‘(select top ‘ + str((@PageIndex - 1) * @PageSize) + ‘ ROW_NUMBER() OVER(order by ‘ + @OrderSql + ‘) AS RowNum from ‘ + @tblName + ‘) as tblTmp1)‘
                else
                    set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ tblTmp.* from ‘
                        + ‘(select ROW_NUMBER() OVER(order by ‘ + @OrderSql + ‘) AS RowNum,‘ + @strGetFields + ‘ from ‘ + @tblName + ‘ where ‘ + @strWhere + ‘) tblTmp where tblTmp.[RowNum] > ‘
                            + ‘(select max([RowNum]) from ‘
                                + ‘(select top ‘ + str((@PageIndex - 1) * @PageSize) + ‘ ROW_NUMBER() OVER(order by ‘ + @OrderSql + ‘) AS RowNum from ‘ + @tblName + ‘ where ‘ + @strWhere + ‘) as tblTmp1)‘
            end
        end
    end
    exec (@strSQL);
END

第二步、封装数据库访问层,该层实现执行存储过程或SQL语句返回 DataTable、SqlDataReader、受影响行数:

namespace Ant.DAL
{
    /// <summary>
    /// 存储过程返回值
    /// </summary>
    public class ProcResultValue
    {
        /// <summary>
        /// @Result 字符串返回值
        /// </summary>
        public string ResultValueStr { get; set; }

        /// <summary>
        /// Return 任意类型返回值
        /// </summary>
        public int ReturnValueInt { get; set; }

        /// <summary>
        /// 存储过程异常实体信息返回
        /// </summary>
        public string ReturnValue
        {
            get
            {
                if (ReturnValueInt <= 0)
                    return ResultValueStr;
                else
                    return "";
            }
        }
    }

    /// <summary>
    /// 数据库基础操作类
    /// </summary>
    public class Database
    {
        // 测试用Sql连接字符串
        private static string SqlConn_Debug = System.Configuration.ConfigurationManager.ConnectionStrings["ConnDB"].ToString();/// <summary>
        /// 数据库基础操作类 构造函数
        /// </summary>
        public Database()
        {
        }

        /// <summary>
        /// 获得数据库连接数据
        /// </summary>
        /// <returns>数据库连接信息</returns>
        protected SqlConnection GetConn()
        {
            SqlConnection ConnDB = new SqlConnection(SqlConn_Debug);
            ConnDB.StateChange += new StateChangeEventHandler(ConnDB_StateChange);
            ConnDB.Open();
            return ConnDB;
        }

        /// <summary>
        /// 数据库链接状态改变事件
        /// </summary>
        protected void ConnDB_StateChange(object sender, StateChangeEventArgs e)
        {
            if (e.CurrentState == ConnectionState.Closed)
            {
                ((SqlConnection)sender).Dispose(); // 释放资源
                GC.Collect(); // 释放资源
            }
        }

        /// <summary>
        /// 获得对应表序列的新ID
        /// </summary>
        /// <param name="TableName">表名</param>
        /// <param name="TableCol">表ID列名</param>
        /// <param name="TableWhere">查询条件(注意:不添加‘where‘)</param>
        /// <returns>返回:序列的新ID</returns>
        protected int GetSequence(string TableName, string TableCol, string tableWhere = "")
        {
            DataParameters DP = new DataParameters();
            DP.Add("@TableName", SqlDbType.VarChar, TableName);
            DP.Add("@TableCol", SqlDbType.VarChar, TableCol);
            DP.Add("@tableWhere", SqlDbType.VarChar, tableWhere);
            return ExeProc("P_Sequence", DP, false).ReturnValueInt;
        }

        /// <summary>
        /// 通过存储过程,获得数据集 DataReader
        /// </summary>
        /// <param name="tblName">要查询的表名</param>
        /// <param name="strGetFields">要查询的字段</param>
        /// <param name="strWhere">查询条件(注意:不要加 "where")</param>
        /// <param name="OrderSql">排序规则(注意:不要加 "order by",且不能为空)</param>
        /// <param name="PageSize">页大小 为0时,则不分页</param>
        /// <param name="PageIndex">页索引</param>
        /// <returns>返回:记录集 SqlDataReader</returns>
        protected SqlDataReader GetDataReader(string tblName, string strGetFields, string strWhere, string OrderSql, int PageSize, int PageIndex)
        {
            SqlCommand Cmd = new SqlCommand("P_Pagination", GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;
            Cmd.Parameters.Add("@tblName", SqlDbType.VarChar).Value = tblName;
            Cmd.Parameters.Add("@strGetFields", SqlDbType.VarChar).Value = strGetFields;
            Cmd.Parameters.Add("@strWhere", SqlDbType.VarChar).Value = strWhere;
            Cmd.Parameters.Add("@OrderSql", SqlDbType.VarChar).Value = OrderSql;
            Cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSize;
            Cmd.Parameters.Add("@PageIndex", SqlDbType.Int).Value = PageIndex;
            Cmd.Parameters.Add("@doCount", SqlDbType.Bit).Value = false;
            return Cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// 通过存储过程及自定义参数,获得数据集 DataReader
        /// </summary>
        /// <param name="ProcName">存储过程名</param>
        /// <param name="DataParas">存储过程参数集</param>
        /// <returns>返回:记录集 SqlDataReader</returns>
        protected SqlDataReader GetDataReader(string ProcName, DataParameters DataParas)
        {
            SqlCommand Cmd = new SqlCommand(ProcName, GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;

            // 遍历 存储过程参数集
            foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
            {
                Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[0]).Value = ((object[])obj.Value)[1];
            }
            return Cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// 通过存储过程,获得数据集 DataTable
        /// </summary>
        /// <param name="tblName">要查询的表名</param>
        /// <param name="strGetFields">要查询的字段</param>
        /// <param name="strWhere">查询条件(注意:不要加 "where")</param>
        /// <param name="OrderSql">排序规则(注意:不要加 "order by",且不能为空)</param>
        /// <param name="PageSize">页大小 为0时,则不分页</param>
        /// <param name="PageIndex">页索引</param>
        /// <returns>返回:记录集 DataTable</returns>
        protected DataTable GetDataTable(string tblName, string strGetFields, string strWhere, string OrderSql, int PageSize, int PageIndex)
        {
            SqlCommand Cmd = new SqlCommand("P_Pagination", GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;
            Cmd.Parameters.Add("@tblName", SqlDbType.VarChar).Value = tblName;
            Cmd.Parameters.Add("@strGetFields", SqlDbType.VarChar).Value = strGetFields;
            Cmd.Parameters.Add("@strWhere", SqlDbType.VarChar).Value = strWhere;
            Cmd.Parameters.Add("@OrderSql", SqlDbType.VarChar).Value = OrderSql;
            Cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSize;
            Cmd.Parameters.Add("@PageIndex", SqlDbType.Int).Value = PageIndex;
            Cmd.Parameters.Add("@doCount", SqlDbType.Bit).Value = false;
            SqlDataAdapter DA = new SqlDataAdapter(Cmd);
            DataTable DT = new DataTable();
            DA.Fill(DT);
            Cmd.Connection.Close();
            return DT;
        }

        /// <summary>
        /// 通过指定的存储过程名称,获取数据集 DataTable
        /// </summary>
        /// <param name="ProcName">存储过程名</param>
        /// <param name="DataParas">存储过程参数集</param>
        /// <returns>返回:记录集 DataTable</returns>
        protected DataTable GetDataTable(string ProcName, DataParameters DataParas = null)
        {
            SqlCommand Cmd = new SqlCommand(ProcName, GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;

            // 遍历 存储过程参数集
            if(DataParas != null)
            {
                foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
                {
                    Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[0]).Value = ((object[])obj.Value)[1];
                }
            }
            SqlDataAdapter DA = new SqlDataAdapter(Cmd);
            DataTable DT = new DataTable();
            DA.Fill(DT);
            Cmd.Connection.Close();
            return DT;
        }

        /// <summary>
        /// 执行SQL查询语句,获取数据集 DataReader
        /// </summary>
        /// <param name="sqlTxt">要执行的SQL语句</param>
        /// <returns>返回:记录集 DataReader</returns>
        protected SqlDataReader GetDataReader(string sqlTxt)
        {
            SqlCommand Cmd = new SqlCommand(sqlTxt, GetConn());
            Cmd.CommandType = CommandType.Text;
            return Cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// 执行SQL查询语句,获取数据集 DataTable
        /// </summary>
        /// <param name="sqlTxt">要执行的SQL语句</param>
        /// <returns>返回:记录集 DataTable</returns>
        protected DataTable GetDataTable(string sqlTxt)
        {
            SqlCommand Cmd = new SqlCommand(sqlTxt, GetConn());
            Cmd.CommandType = CommandType.Text;
            SqlDataAdapter DA = new SqlDataAdapter(Cmd);
            DataTable DT = new DataTable();
            DA.Fill(DT);
            Cmd.Connection.Close();
            return DT;
        }

        /// <summary>
        /// 通过存储过程,获得数据集 总数
        /// </summary>
        /// <param name="tblName">要查询的表名</param>
        /// <param name="strWhere">查询条件</param>
        /// <returns>返回:记录集数量</returns>
        protected int GetDataCount(string tblName, string strWhere = "")
        {
            SqlCommand Cmd = new SqlCommand("P_Pagination", GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;
            Cmd.Parameters.Add("@tblName", SqlDbType.VarChar).Value = tblName;
            Cmd.Parameters.Add("@strGetFields", SqlDbType.VarChar).Value = "*";
            Cmd.Parameters.Add("@strWhere", SqlDbType.VarChar).Value = strWhere;
            Cmd.Parameters.Add("@OrderSql", SqlDbType.VarChar).Value = "";
            Cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = 0;
            Cmd.Parameters.Add("@PageIndex", SqlDbType.Int).Value = 1;
            Cmd.Parameters.Add("@doCount", SqlDbType.Bit).Value = true;
            int Result = (int)Cmd.ExecuteScalar();
            Cmd.Connection.Close();
            return Result;
        }

        /// <summary>
        /// 执行SQL查询语句,并返回数据集长度
        /// </summary>
        /// <param name="sqlTxt">要执行的SQL语句</param>
        /// <returns>返回:数据集长度</returns>
        protected int GetDataCount(string sqlTxt)
        {
            SqlCommand Cmd = new SqlCommand(sqlTxt, GetConn());
            Cmd.CommandType = CommandType.Text;
            SqlDataAdapter DA = new SqlDataAdapter(Cmd);
            DataTable DT = new DataTable();
            DA.Fill(DT);
            Cmd.Connection.Close();
            return DT.Rows.Count;
        }

        /// <summary>
        /// 执行查询语句,并返回第一行第一列数据
        /// </summary>
        /// <param name="SelectTxt">要执行的查询语句</param>
        /// <returns>返回查询结果集的第一行第一列数据</returns>
        protected object GetOnlyData(string SelectTxt)
        {
            SqlCommand Cmd = new SqlCommand(SelectTxt, GetConn());
            object Result = Cmd.ExecuteScalar();
            Cmd.Connection.Close();
            return Result;
        }

        /// <summary>
        /// 执行语句,并返回受影响的行数
        /// </summary>
        /// <param name="CmdTxt">要执行的 增、删、改 语句</param>
        /// <returns>返回受影响的行数</returns>
        protected int RunSqlCommand(string CmdTxt)
        {
            SqlCommand Cmd = new SqlCommand(CmdTxt, GetConn());
            int ExecuteCount = Cmd.ExecuteNonQuery();
            Cmd.Connection.Close();
            Cmd.Dispose();
            return ExecuteCount;
        }

        /// <summary>
        /// 执行存储过程,并返回存储过程执行结果(字符串)
        /// </summary>
        /// <param name="ProcName">存储过程名称</param>
        /// <param name="DataParas">存储过程参数集</param>
        /// <param name="HasResult">该存储过程是否有返回值</param>
        /// <returns>存储过程返回值</returns>
        protected ProcResultValue ExeProc(string ProcName, DataParameters DataParas, bool HasResult)
        {
            // 此处预留异常处理Try catch, 由Application获取并跳转异常页面。
            // 返回值
            ProcResultValue Result = new ProcResultValue();

            // 创建 Command
            SqlCommand Cmd = new SqlCommand(ProcName, GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;

            // 遍历 存储过程参数集
            foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
            {
                Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[0]).Value = ((object[])obj.Value)[1];
            }

            // 创建返回参数
            if (HasResult)
            {
                Cmd.Parameters.Add("@Result", SqlDbType.NVarChar, -1);
                Cmd.Parameters["@Result"].Direction = ParameterDirection.Output;
            }

            //存储过程默认返回值  存储过程:Return
            Cmd.Parameters.Add("@Return", SqlDbType.Int);
            Cmd.Parameters["@Return"].Direction = ParameterDirection.ReturnValue;

            // 执行存储过程
            Cmd.ExecuteNonQuery();

            // 获得返回值
            if (HasResult)
                Result.ResultValueStr = Cmd.Parameters["@Result"].Value.ToString();
            Result.ReturnValueInt = (Cmd.Parameters["@Return"].Value is int ? (int)Cmd.Parameters["@Return"].Value : -1);

            // 关闭数据库链接
            Cmd.Connection.Close();

            // 在这里执行一些存储过程catch异常的操作
            if(Result.ReturnValueInt == -1)
            {

            }

            // 返回执行结果
            return Result;
        }

        /// <summary>
        /// 执行函数,并返回函数执行结果
        /// </summary>
        /// <param name="FuncName">函数名称</param>
        /// <param name="DataParas">函数参数集</param>
        /// <param name="ResultType">返回值类型</param>
        /// <returns>存储过程返回值</returns>
        protected object ExeFunc(string FuncName, DataParameters DataParas, SqlDbType ResultType)
        {
            // 返回值
            object Result = null;

            // 创建 Command
            SqlCommand Cmd = new SqlCommand(FuncName, GetConn());
            Cmd.CommandType = CommandType.StoredProcedure;

            // 遍历 存储过程参数集
            foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
            {
                Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[0]).Value = ((object[])obj.Value)[1];
            }

            // 创建返回参数
            Cmd.Parameters.Add("@Return", ResultType, -1);
            Cmd.Parameters["@Return"].Direction = ParameterDirection.ReturnValue;

            // 执行存储过程
            Cmd.ExecuteScalar();

            // 获得返回值
            Result = Cmd.Parameters["@Return"].Value;

            // 关闭数据库链接
            Cmd.Connection.Close();

            // 返回执行结果
            return Result;
        }
    }
}

第三步、上面对数据库访问封装方法有一个DataParameters传参对象,你没有想错,这个对象是自己封装的类,调用起来更加方便,请看下面代码

namespace Ant.DAL
{
    /// <summary>
    /// 数据库[存储过程、函数]参数类
    /// </summary>
    public class DataParameters
    {
        private Hashtable HT = new Hashtable(); // 存储过程参数表

        /// <summary>
        /// 数据库[存储过程、函数]参数类 构造函数
        /// </summary>
        public DataParameters()
        {
        }

        /// <summary>
        /// 数据库[存储过程、函数] 参数表
        /// </summary>
        public Hashtable Parameters
        {
            get
            {
                return HT;
            }
        }

        /// <summary>
        /// 添加数据库[存储过程、函数]的参数
        /// </summary>
        /// <param name="ParaName">参数名称</param>
        /// <param name="ParaType">参数类型</param>
        /// <param name="ParaValue">参数值</param>
        public void Add(string ParaName, SqlDbType ParaType, object ParaValue)
        {
            HT.Add(ParaName, new object[] { ParaType, ParaValue });
        }
    }
}

第四步、调用

        /// <summary>
        /// (查询调用)根据条件查询系统操作对象数据
        /// </summary>
        /// <param name="sqlField">查询字段</param>
        /// <param name="sqlWhere">查询条件 注:不要加 Where</param>
        /// <param name="orderBy">排序 注:不要加 Order By</param>
        /// <param name="pageSize">页大小 大于等于 0</param>
        /// <param name="pageIndex">页码 大于等于 1</param>
        /// <returns>返回:SqlDataReader</returns>
        public SqlDataReader GetData(string sqlField, string sqlWhere, string orderBy, int pageSize, int pageIndex)
        {
            return base.GetDataReader("Base_Action", sqlField, sqlWhere, orderBy, pageSize, pageIndex);
        }

        /// <summary>
        /// (存储过程增删改调用)设置单条系统操作对象
        /// </summary>
        /// <param name="editSign">操作标识</param>
        /// <param name="ID">主键ID</param>
        /// <param name="Menu">类型ID(系统菜单ID、公共页面对象ID)</param>
        /// <param name="Name">名称:按钮/链接ID</param>
        /// <param name="Text">描述:按钮/连接名称</param>
        /// <returns>返回:操作结果 空/异常信息</returns>
        public ProcResultValue SetActionInfo(SetActionInfo_EditSign editSign, long ID, long Menu, string Name, string Text)
        {
            DataParameters DP = new DataParameters();
            DP.Add("@EditSign", System.Data.SqlDbType.Int, (int)editSign);
            DP.Add("@ID", System.Data.SqlDbType.BigInt, ID);
            DP.Add("@Menu", System.Data.SqlDbType.BigInt, Menu);
            DP.Add("@Name", System.Data.SqlDbType.VarChar, Name);
            DP.Add("@Text", System.Data.SqlDbType.NVarChar, Text);
            return base.ExeProc("P_Base_Action", DP, true);
        }        

原文地址:https://www.cnblogs.com/EvanYu/p/DatabaseClass.html

时间: 2024-10-08 23:01:19

ASP.NET 一个数据访问层的封装的相关文章

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

一个通用的数据访问层实现类

在java商城开发中以及人事系统开发中我们知道会涉及到很多的数据表,如果每一个数据库都按照我们开发人员所定义的那样一个表,一个实现类,然后是一个数据访问层接口,数据访问层实现类,业务逻辑层接口,业务逻辑层实现类...这样写下去,代码量无疑是很大的. 下面我们就介绍一个基本的数据访问层实现类,至于接口的定义,我想只要明白实现类,接口的定义应该很简单. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

【原创】打造基于Dapper的数据访问层

前言 辞职在家闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回DataTable.DataSet和强类型,同时支持不同类型数据库.目前成熟的ORM框架多不胜数,再写一个出来,并非想证明自己写的有多好,一来认为现有成熟的ORM框架并不能灵活适用于大型ERP项目,二来有感于工作多年有必要写下一些东西.虽然有种重复造轮子的感觉,但相信朋友们和我一样,享受造轮子的过程并把它当成一种乐趣,对吧. 调用示例

微软-创建数据访问层

简介 https://msdn.microsoft.com/zh-cn/cc964016 作为web 开发人员,我们的工作总是在和数据打交道.我们创建数据库来存储数据,编写代码来检索并修改数据,并创建Web 页面来收集和汇总数据.这是探讨在ASP.NET 2.0 中实现这些常用类型的技巧的系列教程中的首篇教程.我们从创建一个 软件架构 开始,包括使用Typed DataSet 的数据访问层(DAL) .实现自定义业务规则的业务逻辑层(BLL) 和共享同一页面布局的ASP.NET 页面组成的表示层

14、抽象工厂获取数据访问层的实例,缓存的使用和反射的使用

工厂类的代码: namespace Shop.DALFactory { /// <summary> /// 抽象工厂.完成数据层中对象的创建(反射对象) /// </summary> public class AbstractFactory { //获取程序集的名称 private static string DalAssemblyPath = ConfigurationManager.AppSettings["DalAssemblyPath"]; //获取程序

asp.net-wingtip学习之创建数据访问层

一. 什么是数据访问层在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的类(class)2. 数据库和存储类成员的数据表(database)3. 上述二者的交互操作. product类: 1 using System.ComponentModel.DataAnnotations; 2 3 namespace WingtipToys.Models 4 { 5 public class Product 6 { 7 [ScaffoldColumn(false)]

企业级应用框架(三)三层架构之数据访问层的改进以及测试DOM的发布

在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.net,EF,linq To Sql,这一点我们实现的不是很完美,仍有很大的改进空间,本文将加以改进. 在此之前我们来看一下我们最新的dom(PS:经过两天的赶工,我们的dom已经相对成熟,其中BLL层已经被我高度抽象化了,并且引进了业务上文文的概念:DAL层除了具体的技术实现尚为完成,其他方面已经相

【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,为了看起来一致. using System; using

数据访问层

DAO 模式:讲解软件开发中的分层开发思想和技术,随着软件规模的扩大和业务的复杂,将一个软件分成多个层次进行开发,化大为小,分而治之,是缩短软件开发时间,提高软件开发效率的一种有效方法,也是目前软件开发一直使用的方法. 数据持久化:很多程序都有保存数据.读取数据的需要.程序运行时,保存在内存中的数据时瞬时的,关机之后将丢失.为了持久保存数据,需要将数据保存到磁盘中,比如保存到数据库或文件中.这样,程序启动时可以从磁盘读取数据,数据发生改变或程序关闭时,保存数据到磁盘,实现了数据的持久保存. 这里