Поддержка сайта

Высокие позиции в поисковой системе, на прямую зависят от развития вашего сайта.

Продвижение сайтов

Эффективность стратегий продвижения подтверждается сотрудничеством с крупными клиентами и отзывами о нашей работе.

Создание сайтов

Мы делаем сайты быстро, недорого и профессионально. От работы с нами, у вас останутся только положительные эмоции.

Изменение объекта Catalog

Заложены основы объектной модели WroxCommerce, назначением которой является абстрагирование прямого доступа к базе данных от уровня представления, что должно исключить нарушение бизнес-правил в приложении.

Выбор в базе данных всех отделов верхнего уровня выполняется по запросу:

 Изменение объекта Catalog

Однако такие вызовы из кода ASP должны быть запрещены, поскольку они нарушают правила трехуровневого проектирования распределенных приложений. Мы хотим абстрагировать код уровня представления (в нашем случае — код ASP) от базы данных, чтобы никто из разработчиков не мог нарушить заложенные в объектную модель бизнес-правила. Вызов должен выполняться способом, который не нарушает корректности бизнес-правил:

 Изменение объекта Catalog

Запрос к базе данных

Доработаем проект Visual Basic. Проверьте, открыт ли проект WroxCommerce.

В следующем упражнении создается функция RunQuery, возвращающая запросы из базы данных. При необходимости она возвращает набор, который можно прокручивать и изменять (если параметр AsKeyset имеет значение True). Кроме того, функция облегчает построение сложных строк SQL, делая это на основе анализа имени таблицы, предоставляемого в параметрах условий Where и Order.

Затем мы добавим в объект Catalog функцию QueryDepartments, упрощающую получение строк из объекта Departments.

Запрос к базе данных

1. Добавьте в объект Database функцию:

 Изменение объекта Catalog

Изменение объекта Catalog

 

2. Добавьте в объект Catalog метод:

 Изменение объекта Catalog

3. Добавьте несколько методов, использующих новую функцию Query-Departments. В объект Catalog введите код:

 Изменение объекта Catalog

4. Для согласованности добавьте в объект Catalog метод GetAllDepartments:

 Изменение объекта Catalog

5. Добавьте в объект Catalog метод, возвращающий сведения об указанном отделе:

 Изменение объекта Catalog

6. Наконец, добавьте в Catalog функцию, возвращающую дочерние отделы для указанного идентификатора родительского отдела:

 Изменение объекта Catalog

 

Описание работы

Функция RunQuery начинается с проверки существования представления (view). Когда мы построим представления, упрощающие распределение данных по нескольким таблицам, RunQuery будет пересылать либо имя таблицы (например, Products), либо имя представления (например, vProducts). По умолчанию функция пытается работать с представлением, если только UseTable не равно True (в этом случае всегда применяется базовая таблица):

If ViewName = "" Or UseTable = True Then

sql = sql & TableName Else

sql = sql & ViewName

End If

Затем идет фрагмент построения базового оператора SQL, состоящего из SELECT * и имени таблицы или представления.

Функция проверяет параметры Where и Order, чтобы выяснить, какое из условий нужно дописать в конец строки SQL:

If Where о "" Then sql = sql & " where " & Where

If Order <> "" Then sql = sql & " order by " & Order

После создания строки SQL нужно выбрать способ ее исполнения, а затем вернуть полученный набор записей. По умолчанию вызывается быстрая версия "чтение только вперед" (forward-only) с использованием метода Execute объекта DB, являющегося стандартным ADO-объектом Connection. Установка AsKeyset в True позволяет сформировать запрос набора записей с возможностью перемещения по отдельным записям, а также с возможностью использования запроса для обновления информации в запросе.

If AsKeyset = False Then

Set RunQuery = DB.Execute(sql) Else

Set RunQuery = New Recordset

RunQuery.Open sql, DB, adOpenKeyset, adLockOptimistic End If

Теперь понятны все преимущества метода RunQuery. Прежде всего мы получаем ссылку на имя таблицы и передаем условия Where и Order в виде необязательных параметров. Заметьте, как устанавливается для Order значение по умолчанию, равное Name (в QueryDepartments),- даже если условие Order будет опущено, по умолчанию мы все равно получим список отделов, упорядоченный по именам:

Private Function QueryDepartments(Optional ByVal Where As String,

Optional ByVal Order As String = "Name",  Optional ByVal AsKeySet As Boolean = False)  As Recordset

Метод RunQuery самостоятельно отвечает за формирование и запуск оператора SQL. Только метод QueryDepartments будет возвращать набор записей (в нашем случае — список всех отделов). Фактически RunQuery вызывает следующий оператор SQL:

SELECT * PROM Departments ORDER BY Name

Такие функции называются примитивами (primitive). Они "видимы" только определенной группе методов и свойств (обычно всем методам и свойствам, принадлежащим объекту, в котором определен примитив). Название этих функций связано с тем, что множество небольших примитивов используется как строительные блоки для создания больших и сложных функций.

Поле DepartmentlDP служит для поддержки ссылок на родительские объекты, формируя структуру отделов в виде дерева. Верхние элементы дерева имеют пустое значение в поле DepartmentlDP. На этом предположении строится условие Where, которое передается в примитив:

Public Function GetDepartments(Optional Byval AsKeyset As Boolean = False)

As Recordset

Set GetDepartments = QueryDepartments("DepartmentlDP is null", ,AsKeyset) End Function

В этой точке RunQuery формирует оператор SQL: SELECT * FROM Departments WHERE DepartmentlDP is null ORDER BY Name

Посмотрим, что произойдет, если опустить условие Where в запросе QueryDepartments функции GetAllDepartments. Будут возвращены все отделы магазина независимо от их местоположения в дереве:

Set GetAllDepartments = QueryDepartments(, , AsKeyset)

Соответствующий оператор SQL:

SELECT * FROM Departments ORDER BY Name

Метод GetDepartment позволяет просмотреть отделы по указанному идентификатору:

Set GetDepartment = QueryDepartments("DepartmentID=" & DepartmentID, ,

AsKeyset)

RunQuery сформирует строку SQL:

SELECT * FROM Departments WHERE DepartmentID=27

Функция GetChildDepartments похожа на GetDepartment, но возвращает список подотделов того отдела, идентификатор которого задан.

Set GetChildDepartments =

QueryDepartments("DepartmentIDP=" & DepartmentID, , AsKeyset)

Указав родительский объект, получаем дочерние:

SELECT * FROM Departments WHERE DepartmentlDP=l ORDER BY Name

Читайте так же:
Not found

Нам доверяют

Интернет магазин