понедельник, 15 октября 2012 г.

2."Пейджинг" в ASP.NET из БД Oracle (Подготовка слоя доступа к данным)


          Для доступа к данным, находящимся в БД, подготовим группу классов. Классы доступа к БД, извлечения данных и упаковки их в объектное представление разделены на так называемые "слой доступа к данным" (Data Access Layer - DAL) и "слой бизнес - логики" (Business Logic Layer - BLL) . На диаграмме показаны взаимоотношения слоев:

        Рассмотрим слой DAL:
        Его задача - это подключение к БД, извлечение данных и передача их наверх. Не особо заботясь ни о том кто инициировал его работу, ни что произойдет с извлеченными данными далее, слой DAL просто подключается к БД и получает информацию. При проектировании DAL создается абстрактный базовый класс BaseDal:


using System;
using System.Data;
using System.Data.Common;

namespace Paging
{
    /// <summary>
    /// Класс для реализации всех общих задач  приложения
    /// </summary>
    public abstract class BaseDal
    {
 

        //строка подключения к БД

        public BaseDal()
        {
            OracleConnectionString = String.Empty;
        }

        protected string OracleConnectionString { get; set; }

     
        //Для обновления

        protected int ExecuteNonQuery(DbCommand cmd)
        {
            return cmd.ExecuteNonQuery();
        }

        //Для выборки данных
        protected IDataReader ExecuteReader(DbCommand cmd, CommandBehavior behavior)
        {
            return cmd.ExecuteReader(behavior);
        }

        protected IDataReader ExecuteReader(DbCommand cmd)
        {
            return ExecuteReader(cmd, CommandBehavior.Default);
        }

        protected object ExecuteScalar(DbCommand cmd)
        {
            return cmd.ExecuteScalar();
        }

 
    }
}

           В этом классе представлено свойство OracleConnectionString и методы - упаковщики базовых методов объекта DbCommand, который может быть и OracleCommand и SqlCommand. таким образом в этом классе реализованы методы ExecuteNonQuery,ExecuteReader,ExecuteScalar осуществляющие конкретные действия, при чем даже про тип БД разговор пока не ведется.
         Далее создадим класс - наследник BaseDal:


using System;
using System.Collections.Generic;
using System.Web.Configuration;
using System.Data;

namespace Paging
{
    /// <summary>
    /// Сводное описание для OracleProvider
    /// </summary>
    public abstract class JobsProvider: BaseDal
    {
 
        private static JobsProvider _instance;
        public static JobsProvider Instance
        {
            get {
                if(_instance == null)
                {
                    _instance =                        (JobsProvider)Activator.CreateInstance(Type.GetType(TestSection.Section.Jobs.ProviderType));
                    return _instance;
                }
                return _instance;
             
            }
        }

        protected JobsProvider()
        {
            //ссылка на web.config извлекаем строку
             OracleConnectionString = WebConfigurationManager.ConnectionStrings["LocalOracleServer"].ConnectionString;

        }

        protected JobDetails GetJobFromReader(IDataReader reader)
        {
            var job = new JobDetails(
                Convert.ToInt32(reader["JOBID"]),
                reader["JOBNM"].ToString());
            return job; 
        }


        protected List<JobDetails> GetJobListFromReader(IDataReader reader)
        {
            var jobsArr = new List<JobDetails>();
            while (reader.Read())
            {
                jobsArr.Add(GetJobFromReader(reader));
     
            }

            return jobsArr;
        }
        //оболочки SQL команд
        public  abstract List<JobDetails> GetJobs();
        public abstract JobDetails GetJobById(Int32 jobId);

    }
}


Класс JobsProvider несколько конкретизирует направление, которым необходимо заниматься при извлечении данных. Он имеет ссылки на два вспомогательных класса: TestSection и JobDetails. Первый наследуется от ConfigurationSection и является своеобразным упаковщиком настроек, которые должны содержаться в web.config. JobDetails -обыкновенный класс - обертка для полей таблицы Jobs. На обоих этих классах остановимся позднее и я приведу их полное содержимое. А пока остановимся на содержимом класса JobsProvider:
В нем реализовано свойство Instance, т. е. экземпляр класса, который с помощью Type.GetType()
в момент исполнения кода указывает на провайдер данных, указанный в TestSection. Это реализовано для того чтобы ослабить связь между BLL слоем и DAL слоем и исключить создание DAL объектов в BLL слое.
protected JobDetails GetJobFromReader(IDataReader reader) - этот метод "упаковывает" извлеченную из БД строку данных в объект класса JobDetails.
 protected List<JobDetails> GetJobListFromReader - укладывает упакованные объекты в список. тут, я думаю, понятно.
В следующей статье приведу код классов JobDetails и TestSection, чтоб стало понятнее, откуда что берется, а затем рассмотрим класс - поставщик данных.





Комментариев нет:

Отправить комментарий