Однако, к сожалению, хранимые процедуры можно использовать далеко не во всех ситуациях. Это ограничение наводит на мысль воспользоваться еще одним простым принципом определения кратчайшего пути как пути наименьшего сопротивления. В приведенном примере наименьшее сопротивление означает, что следующий уровень над уровнем данных используется для выполнения прикладной логики. Рассмотрим, как в многоуровневом приложении, где клиентский уровень используется только для отображения данных, можно реализовать остальные уровни.
Создание повторно используемых компонентов промежуточного уровня
В этом разделе описано создание простого запроса в виде повторно используемого объекта. Основная цель данного примера — продемонстрировать способ создания функции в одном месте и использования ее сразу в нескольких приложениях. Создайте новый или откройте уже имеющийся проект Visual Basic .NET. Щелкните правой кнопкой мыши на имени проекта в окне Solution Explorer и выберите в контекстном меню команду Add→Add Component. В диалоговом окне Add New Item в текстовом поле Name введите имя нового компонента GetRowCount.vb.
Коды всех примеров в этой и предыдущей главах основаны на решении Novelty1. Пространство имен Novelty1 используется в остальных примерах данной главы.
После создания пустого компонента нужно включить в него код функции GetRowCount, которая возвращает целочисленное значение с количеством записей в таблице tblCustomers базы данных Novelty. В листинге 12.5 приведен полный код этого компонента.
>Imports System.Data
>Imports System.Data.SqlClient
>Public Class GetRowCount
> Inherits System.ComponentModel.Component
> Public Function GetRowCount() As Integer
> Try
> Dim connString As String
> ' Помните обсуждение в главе 11 функции
> ' String.Intern? Если в памяти уже есть строка
> ' с тем же значением, то вместо создания нового
> ' экземпляра будет использована ссылка на нее.
> connString = _
> "server=(local);database=Novelty;TRUSTED_CONNECTION=Yes"
> Dim conn As New SqlConnection(connString)
> Dim cmd As New SqlCommand("select count(*) from tblCustomer", conn)
> conn.Open() Dim dReader As SqlDataReader = _
> cmd.ExecuteReader(CommandBehavior.CloseConnection)
> While dReader.Read
> ' Включить первую и единственную запись
> ' в результирующий набор.
> GetRowCount = dReader.GetValue(0)
> End While
> dReader.Close()
> conn.Close()
> Catch
> System.Console.WriteLine("An error has occurred " & Err.Description)
> End Try
> End Function
>#Region " Component Designer generated code "
> Public Sub New(ByVal Container As System.ComponentModel.IContainer)
> MyClass.New()
> ' Код, созданный конструктором компонентов.
> Container.Add(Me)
> End Sub
> Public Sub New()
> MyBase.New()
> ' Вызов метода, созданный конструктором компонентов.
> InitializeComponent()
> ' Инициализация после вызова метода
> InitializeComponent().
> End Sub
> ' Переопределение метода Dispose для очистки списка компонентов.
> Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)