Настройка параметров подключения и параметров уровня команды на уровне доступа к данным (VB)

по Скотт Митчелл

Скачать код или скачать PDF

Адаптеры таблиц в типизированном наборе данных автоматически подключаются к базе данных, выдают команды и заполняют объект DataTable результатами. Однако в некоторых случаях мы хотим самостоятельно принять эти сведения, а в этом учебнике мы рассмотрите, как получить доступ к параметрам подключения к базе данных и на уровне команд в TableAdapter.

Введение

В рамках серии руководств мы использовали типизированные наборы данных для реализации уровня доступа к данным и бизнес-объектов нашей многоуровневой архитектуры. Как обсуждалось в первом учебном курсе, объекты DataTables типизированного набора данных служат в качестве репозиториев данных, тогда как адаптеры таблиц выступают в качестве оболочек для взаимодействия с базой данных для получения и изменения базовых данных. Адаптеры таблиц инкапсулируют сложность работы с базой данных и избавляет от необходимости писать код для подключения к базе данных, выдавать команду или заполнять результаты в таблицу DataTable.

Однако бывают случаи, когда нам нужно бурров в глубину TableAdapter и написать код, который работает непосредственно с объектами ADO.NET. Например, при внесении изменений в базу данных в рамках руководства по транзакциям мы добавили в TableAdapter методы для начала, фиксации и отката ADO.NET транзакций. Эти методы использовали внутренний, вручную созданный SqlTransaction объект, который был назначен SqlCommand объектам TableAdapter.

В этом учебнике мы рассмотрим, как получить доступ к параметрам подключения к базе данных и на уровне команд в TableAdapter. В частности, мы добавим функции к ProductsTableAdapter, которая обеспечивает доступ к базовой строке подключения и параметрам времени ожидания команды.

Работа с данными с помощью ADO.NET

Платформа Microsoft .NET содержит множество классов, предназначенных специально для работы с данными. Эти классы, находящиеся в пространстве именSystem.Data, называются классами ADO.NET . Некоторые классы в области ADO.NET привязаны к определенному поставщику данных. Поставщик данных можно представить как коммуникационный канал, который позволяет передавать данные между классами ADO.NET и базовым хранилищем данных. Существуют обобщенные поставщики, например OleDb и ODBC, а также поставщики, специально разработанные для конкретной системы баз данных. Например, хотя можно подключиться к базе данных Microsoft SQL Server с помощью поставщика OleDb, Поставщик SqlClient гораздо более эффективен, так как он разработан и оптимизирован специально для SQL Server.

При программном доступе к данным обычно используется следующий шаблон:

  1. Установите соединение с базой данных.
  2. Выполните команду.
  3. Для запросов SELECT работает с результирующими записями.

Для выполнения каждого из этих шагов существуют отдельные классы ADO.NET. Для подключения к базе данных с помощью поставщика SqlClient, например, используйте классSqlConnection. Чтобы выдать команду INSERT, UPDATE, DELETEили SELECT в базу данных, используйте классSqlCommand.

За исключением внесения изменений в базу данных в рамках учебника по транзакциям, нам не пришлось писать какой-либо код ADO.NET низкого уровня, так как автоматически созданный код TableAdapter включает функции, необходимые для подключения к базе данных, выполнения команд, получения данных и заполнения этих данных в DataTables. Однако могут возникнуть ситуации, когда нам нужно настроить эти низкоуровневые настройки. В следующих нескольких шагах мы рассмотрим, как коснуться объектов ADO.NET, используемых внутренне адаптерами таблиц.

Шаг 1. изучение свойства Connection

Каждый класс TableAdapter имеет свойство Connection, которое указывает сведения о подключении к базе данных. Этот тип данных свойства и ConnectionString значение определяются параметрами, выбранными в мастере настройки адаптера таблицы. Вспомним, что при первом добавлении TableAdapter к типизированному набору данных этот мастер запрашивает источник базы данных (см. рис. 1). Раскрывающийся список на первом шаге включает в себя базы данных, указанные в файле конфигурации, а также любые другие базы данных в подключениях к данным обозреватель сервера s. Если используемая база данных не существует в раскрывающемся списке, можно указать новое подключение к базе данных, нажав кнопку Создать подключение и указав необходимые сведения о подключении.

первого шага мастера настройки адаптера таблицы

Рис. 1. первый шаг мастера настройки TableAdapter (щелкните, чтобы просмотреть изображение с полным размером)

Давайте рассмотрим код для свойства Connection TableAdapter. Как отмечалось в учебнике Создание уровня доступа к данным , можно просмотреть автоматически созданный код TableAdapter, перейдя в окно Представление классов, выполнив детализацию до соответствующего класса, а затем дважды щелкнув имя этого элемента.

Перейдите в окно представление классов, перейдя в меню Вид и выбрав представление классов (или нажав клавиши CTRL + SHIFT + C). В верхней половине окна представление классов перейдите к пространству имен NorthwindTableAdapters и выберите класс ProductsTableAdapter. Элементы ProductsTableAdapter s будут отображаться в нижней половине представление классов, как показано на рис. 2. Дважды щелкните свойство Connection, чтобы увидеть его код.

Дважды щелкните свойство Connection в представление классов, чтобы просмотреть его автоматически созданный код.

Рис. 2. дважды щелкните свойство Connection в представление классов, чтобы просмотреть его автоматически созданный код.

Свойства Connection TableAdapter и другой код, связанный с соединением, приведены ниже.

Private _connection As System.Data.SqlClient.SqlConnection
Private Sub InitConnection()
    Me._connection = New System.Data.SqlClient.SqlConnection
    Me._connection.ConnectionString = _
        ConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
End Sub
Friend Property Connection() As System.Data.SqlClient.SqlConnection
    Get
        If (Me._connection Is Nothing) Then
            Me.InitConnection
        End If
        Return Me._connection
    End Get
    Set
        Me._connection = value
        If (Not (Me.Adapter.InsertCommand) Is Nothing) Then
            Me.Adapter.InsertCommand.Connection = value
        End If
        If (Not (Me.Adapter.DeleteCommand) Is Nothing) Then
            Me.Adapter.DeleteCommand.Connection = value
        End If
        If (Not (Me.Adapter.UpdateCommand) Is Nothing) Then
            Me.Adapter.UpdateCommand.Connection = value
        End If
        Dim i As Integer = 0
        Do While (i < Me.CommandCollection.Length)
            If (Not (Me.CommandCollection(i)) Is Nothing) Then
                CType(Me.CommandCollection(i), _
                    System.Data.SqlClient.SqlCommand).Connection = value
            End If
            i = (i + 1)
        Loop
    End Set
End Property

При создании экземпляра класса TableAdapter переменная-член _connection равна Nothing. При доступе к свойству Connection сначала проверяется наличие экземпляра переменной-члена _connection. Если это не так, вызывается метод InitConnection, который создает экземпляр _connection и задает для его свойства ConnectionString значение строки подключения, указанное на первом шаге мастера настройки адаптера таблицы.

Свойство Connection также может быть назначено объекту SqlConnection. Это связывает новый объект SqlConnection с каждым из SqlCommand объектов TableAdapter.

Шаг 2. предоставление параметров уровня подключения

Сведения о соединении должны оставаться инкапсулированными в TableAdapter и быть недоступны другим слоям в архитектуре приложения. Однако могут возникнуть ситуации, когда доступ к данным на уровне подключения TableAdapter должен быть доступен или настраиваемым для запроса, пользователя или страницы ASP.NET.

Добавим ProductsTableAdapter в наборе данных Northwind, чтобы включить свойство ConnectionString, которое может использоваться уровнем бизнес-логики для чтения или изменения строки подключения, используемой TableAdapter.

Note

Строка подключения — это строка, указывающая сведения о подключении к базе данных, такие как используемый поставщик, расположение базы данных, учетные данные для проверки подлинности и другие параметры, связанные с базой данных. Список шаблонов строк подключения, используемых различными хранилищами данных и поставщиками, см. в разделе connectionStrings.com.

Как обсуждалось в учебнике Создание уровня доступа к данным , автоматически создаваемые классы типизированного набора данных можно расширить с помощью разделяемых классов. Сначала создайте новую вложенную папку в проекте с именем ConnectionAndCommandSettings под папкой ~/App_Code/DAL.

Добавить вложенную папку с именем Коннектионандкоммандсеттингс

Рис. 3. Добавление вложенной папки с именем ConnectionAndCommandSettings

Добавьте новый файл класса с именем ProductsTableAdapter.ConnectionAndCommandSettings.vb и введите следующий код:

Namespace NorthwindTableAdapters
    Partial Public Class ProductsTableAdapter
        Public Property ConnectionString() As String
            Get
                Return Me.Connection.ConnectionString
            End Get
            Set(ByVal value As String)
                Me.Connection.ConnectionString = value
            End Set
        End Property
    End Class
End Namespace

Этот разделяемый класс добавляет свойство Public с именем ConnectionString в класс ProductsTableAdapter, который позволяет любому слою считывать или обновлять строку подключения для базового соединения TableAdapter.

Если этот разделяемый класс создан (и сохранен), откройте класс ProductsBLL. Перейдите к одному из существующих методов и введите Adapter а затем нажмите клавишу точка, чтобы открыть IntelliSense. В IntelliSense должно отобразиться новое свойство ConnectionString, означающее, что можно программно считывать или изменять это значение из BLL.

Предоставление доступа ко всему объекту соединения

Этот разделяемый класс предоставляет только одно свойство базового объекта соединения: ConnectionString. Если необходимо сделать весь объект соединения доступным за пределами TableAdapter, можно изменить уровень защиты Connection свойств. Автоматически созданный код, который мы рассматривали на шаге 1, показал, что свойство Connection TableAdapter помечено как Friend, то есть к нему могут обращаться только классы в той же сборке. Однако это можно изменить с помощью свойства ConnectionModifier TableAdapter.

Откройте Northwind набор данных, щелкните ProductsTableAdapter в конструкторе и перейдите к окно свойств. Вы увидите, что ConnectionModifier задано значение по умолчанию Assembly. Чтобы сделать свойство Connection доступным вне сборки типизированного набора данных, измените свойство ConnectionModifier на Public.

уровень доступности свойства подключения s можно настроить с помощью свойства Коннектионмодифиер.

Рис. 4. уровень доступности Connection свойств s можно настроить с помощью свойства ConnectionModifier (щелкните, чтобы просмотреть изображение с полным размером)

Сохраните набор данных, а затем вернитесь к классу ProductsBLL. Как и ранее, перейдите к одному из существующих методов и введите Adapter а затем нажмите клавишу точка, чтобы открыть IntelliSense. В список должен входить свойство Connection, означающее, что теперь можно программно считывать или назначать любые параметры уровня соединения из слоя BLL.

Адаптер таблицы TableAdapter состоит из основного запроса, который по умолчанию содержит автоматически созданные инструкции INSERT, UPDATEи DELETE. Эти основные запросы INSERT, UPDATEи DELETE реализуются в коде TableAdapter s как объект адаптера данных ADO.NET через свойство Adapter. Как и свойство Connection, тип данных Adapter свойства s определяется используемым поставщиком данных. Поскольку в этих учебниках используется поставщик SqlClient, свойство Adapter имеет тип SqlDataAdapter.

Свойство Adapter TableAdapter имеет три свойства типа SqlCommand, которые используются для выписки INSERT, UPDATEи DELETE.

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Объект SqlCommand отвечает за отправку определенного запроса в базу данных и имеет такие свойства, как: CommandText, который содержит специальный оператор SQL или хранимую процедуру для выполнения. и Parameters— коллекция объектов SqlParameter. Как мы видели в учебнике Создание уровня доступа к данным , эти командные объекты можно настроить с помощью окно свойств.

В дополнение к основному запросу TableAdapter может включать переменное число методов, которые при вызове отправляют указанную команду в базу данных. Основной объект команды запроса и командные объекты для всех дополнительных методов хранятся в свойстве CommandCollection TableAdapter.

Давайте взглянем на код, формируемый ProductsTableAdapter в наборе данных Northwind для этих двух свойств и их вспомогательных переменных-членов и вспомогательных методов:

Private WithEvents _adapter As System.Data.SqlClient.SqlDataAdapter
Private Sub InitAdapter()
    Me._adapter = New System.Data.SqlClient.SqlDataAdapter
    
    ... Code that creates the InsertCommand, UpdateCommand, ...
    ... and DeleteCommand instances - omitted for brevity ...
End Sub
Private ReadOnly Property Adapter() As System.Data.SqlClient.SqlDataAdapter
    Get
        If (Me._adapter Is Nothing) Then
            Me.InitAdapter
        End If
        Return Me._adapter
    End Get
End Property
Private _commandCollection() As System.Data.SqlClient.SqlCommand
Private Sub InitCommandCollection()
    Me._commandCollection = New System.Data.SqlClient.SqlCommand(8) {}
    ... Code that creates the command objects for the main query and the ...
    ... ProductsTableAdapter�s other eight methods - omitted for brevity ...
End Sub
Protected ReadOnly Property CommandCollection() As System.Data.SqlClient.SqlCommand()
    Get
        If (Me._commandCollection Is Nothing) Then
            Me.InitCommandCollection
        End If
        Return Me._commandCollection
    End Get
End Property

Код для свойств Adapter и CommandCollection точно имитируется в свойстве Connection. Существуют переменные элементов, которые содержат объекты, используемые свойствами. Методы доступа Get свойства начинаются с проверки, является ли соответствующая переменная-член Nothing. Если это так, вызывается метод инициализации, который создает экземпляр переменной-члена и назначает основные свойства, связанные с командой.

Шаг 4. предоставление параметров на уровне команд

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

Так как TableAdapter имеет только одно свойство Connection, код для предоставления параметров уровня соединения довольно прост. При изменении параметров на уровне команды это немного сложнее, так как TableAdapter может иметь несколько командных объектов: InsertCommand, UpdateCommandи DeleteCommand, а также переменное число объектов Command в свойстве CommandCollection. При обновлении параметров на уровне команды эти параметры необходимо распространить на все командные объекты.

Например, представьте, что в TableAdapter были определенные запросы, выполнение которых заняло слишком много времени. При использовании TableAdapter для выполнения одного из этих запросов может потребоваться увеличить CommandTimeout свойствакомандного объекта. Это свойство указывает количество секунд ожидания выполнения команды, по умолчанию — 30.

Чтобы разрешить настройку свойства CommandTimeout BLL, добавьте следующий метод Public в ProductsDataTable с помощью файла разделяемого класса, созданного на шаге 2 (ProductsTableAdapter.ConnectionAndCommandSettings.vb):

Public Sub SetCommandTimeout(ByVal timeout As Integer)
    If Me.Adapter.InsertCommand IsNot Nothing Then
        Me.Adapter.InsertCommand.CommandTimeout = timeout
    End If
    If Me.Adapter.DeleteCommand IsNot Nothing Then
        Me.Adapter.DeleteCommand.CommandTimeout = timeout
    End If
    If Me.Adapter.UpdateCommand IsNot Nothing Then
        Me.Adapter.UpdateCommand.CommandTimeout = timeout
    End If
    For i As Integer = 0 To Me.CommandCollection.Length - 1
        If Me.CommandCollection(i) IsNot Nothing Then
            Me.CommandCollection(i).CommandTimeout = timeout
        End If
    Next
End Sub

Этот метод можно вызвать из слоя BLL или представления, чтобы задать время ожидания команды для всех команд, решаемых этим экземпляром TableAdapter.

Note

Свойства Adapter и CommandCollection помечаются как Private, то есть доступ к ним можно получить только из кода в TableAdapter. В отличие от свойства Connection эти модификаторы доступа не настраиваются. Поэтому, если необходимо предоставить свойства на уровне команд другим слоям в архитектуре, необходимо использовать описанный выше подход к разделяемому классу, чтобы предоставить Public метод или свойство, считывающее и записывающее данные в объекты команд Private.

Сводка

Адаптеры таблиц в типизированном наборе данных служат для инкапсуляции сведений о доступе к данным и сложности. С помощью адаптеров таблиц нам не нужно беспокоиться о написании кода ADO.NET для подключения к базе данных, выдаче команды или заполнении результатов в DataTable. Все это автоматически обрабатывается для нас.

Однако иногда требуется настроить низкоуровневые ADO.NET, например изменить строку подключения или значения по умолчанию для соединения или времени ожидания команды. TableAdapter автоматически создает Connection, Adapterи CommandCollection свойства, но по умолчанию это Friend или Private. Эта внутренняя информация может быть предоставлена путем расширения TableAdapter с помощью разделяемых классов для включения Public методов или свойств. Кроме того, модификатор доступа к свойству TableAdapter Connection можно настроить с помощью свойства ConnectionModifier TableAdapter.

Поздравляем с программированием!

Об авторе

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998. Скотт работает как независимый консультант, преподаватель и модуль записи. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа. Он доступен по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Специальная благодарность

Эта серия руководств была рассмотрена многими полезными рецензентами. Потенциальные рецензенты для этого руководства были Бурнадетте Леигх, S REN Джейкоб Лауритсен, Терезой Мерфи и Хилтон Жеисенов. Хотите ознакомиться с моими будущими статьями MSDN? Если это так, расположите строку в mitchell@4GuysFromRolla.com.