VBA для чайников - Стив Каммингс
Шрифт:
Интервал:
Закладка:
* Visual Basic (не VBA). Visual Basic- это восхитительный инструмент для разработки баз данных. Написанный вами код на Visual Basic может через ADO подключаться к базам данных, как и при использовании VBA, однако формы Visual Basic напрямую поддерживают работу с базами данных, точно так же, как и формы Access. Программа, созданная с помощью Visual Basic, обладает двумя значительными преимуществами перед программой, созданной с помощью VBA-приложения, такого как Word или Excel. Во-первых, она быстрее работает, так как программы, написанные на Visual Basic, компилируются, а не интерпретируются при каждом выполнении, как программы, созданные с помощью VBA. Во-вторых, вы можете свободно распространять программы: конечным пользователям не понадобится базовое VBA-приложение с помощью которого оно было создано.
Программирование баз данных с помощью Access
Прежде чем вы приступите к программированию базы данных в Access, вам следует ознакомиться со всеми отличиями Access от остальных VBA-приложений. Эти различия осложняют перевод программы, созданной с помощью Access, в другое VBA-приложение.
* Формы Access несовместимы со стандартными пользовательскими формами VBA и формами Visual Basic. Если вы решите, что ваша программа будет лучше работать в другом VBA-приложении, вам придется создавать все формы заново.
* Access включает полностью независимую систему программирования баз данных с помощью VBA, которая базируется на использовании объекта DoCmd. Объект DoCmd содержит все команды, доступные в меню Access. Используя этот объект, вы сможете открывать таблицы, выполнять запросы и отчеты, отображать формы, забавляться с пользовательским интерфейсом... другими словами, выполнять все действия, доступные пользователю, сидящему перед компьютером.
Если вы опытный пользователь Access, но не имеете ни малейшего опыта программирования, объект DoCmd позволит вам постепенно перейти к использованию VBA. Однако этим объясняется и определенная проблема: объект DoCmd жестко привязывает вас к Access. Если же вы изучите стандартный VBA, вы сможете очень легко перейти к другим средам разработки Visual Basic.
Даже если вы выберете "чистый" VBA, вы все равно не обойдетесь без объекта DoCmd при создании программ в рамках Access. Возможно, в связи с тем, что формы Access не являются стандартными формами VBA, для отображения формы в VBAпрограмме Access вам придется использовать не стандартный метод Show, а метод OpenForm объекта DoCmd.
Написание кода базы данных с помощью ADO
Хотя проектирование правильных SQL-инструкций может оказаться сложным, написание кода базы данных с помощью ADO оказывается совсем несложной задачей. Вам необходимо освоить работу всего с тремя объектами: Connection, Recordset и Command; их методы и свойства реализованы достаточно логично.
Обработка ошибок
Из-за ограниченного объема главы я не могу подробно остановиться на рассмотрении такого чрезвычайно важного вопроса, как обработка ошибок. Однако очень важно включить код обработки ошибок в каждую процедуру базы данных. Подробные сведения о написании кода обработки ошибок на VBA изложены в главе 9.
Добавление ссылки на ADO
Прежде чем вы сможете использовать ADO и ее объекты в VBA-программе, вы должны сначала добавить в своем проекте ссылку на библиотеку объектов ADO. В окне редактора Visual Basic выберите команду Tools=References, после чего установите флажок напротив Microsoft ActiveX Data Objects 2.x Library (на момент написания книги последней версией была 2.5).
Вашей первоочередной задачей при необходимости доступа к источнику данных (базе данных или другому репозитарию данных) станет установка соединения с ним. Для организации подключения между вашей программой и данными предназначен объект Connection.
Это очень важно! Если вы используете Access для написания ADO-кода для ядра базы данных Jet, вам не нужно создавать объект Connection для работы с базой данных Jet, уже открытой в Access, так как Access автоматически выполняет подобные действия за вас. Для обращения к базе данных используйте свойство Connection объекта Current Project программы Access. Это позволяет сделать, например, приведенный ниже фрагмент кода:
Dim conADOConnection As Connection
Set conADOConnection = Current Project.Connection
Кроме того, вы можете легко установить подключение с базой данных SQL Server в проекте Access, если вы пишете код VBA в этом же проекте. В этом случае вам необходимо использовать свойство BaseConnectionString объекта Current Project, как показано ниже:
Dim conADO Аз New Connection
conADO.Cor.nectionString = _
CurrentProject.BaseConnectionString
В других ситуациях вам придется создавать объекты Connection самостоятельно. Для создания объекта Connection просто объявите имя переменной для объекта, после чего откройте подключение. Метод Open получает в качестве аргумента строку подключения, содержащие различные параметры, которые определяют используемое средство доступа OLE DB Provider и источник данных, с которым вы работаете. Либо же, вы можете сначала задать свойства объекта Connection, соответствующего элементам строки подключения, после чего уже использовать метол Open. Изучите приведенные ниже примеры эквивалентных инструкций, которые создают объект Connection для одной базы данных Jet:
‘ Пример 1
Dim. conADOConnection As New Connection, strConnect As String
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0; " _
& "Data Source=C:DataToys"
conADOConnection.Open strConnect
‘ Пример 2
Dim conADOConnection As New Connection
With conADOConnection
.Provider= "Microsoft.Jet.OLEDB.4.0;"
.Properties("Data Source") = "=C:DataToys"
. Open
End With
Параметры, необходимые методу Open, зависят от используемого вами средства доступа OLE DB Provider; обратитесь к справочной системе, Web-узлу компании Microsoft или документации по Office Developer для получения подробных сведений. Ниже приведен соответствующий пример для SQL Server:
Dim conADOConnection As New Connection
Dim strConnect As String
strConnect = "Provider=SQLOLEDB; Data Source* Hecate;" _
& "Initial Catalog = toys; User ID = sa; Password =;"
conADOConnection.Open strConnect
Если вы работаете в Access, ADO нельзя назвать универсальным решением по управлению данными. Проекты Access могут взаимодействовать только с базами данных SQL Server, но ни с какими другими средствами доступа OLE DB Provider. Кроме того, использование Access VBA для создания подключений к базе данных SQL Server требует различных параметров, используемых в других средах разработки. В Access свойству Provider должно быть присвоено значение MSDataShape, а свойству DataProvider следует присвоить значение SQL0LILD3.
ADO позволяет вам работать с объектами баз данных, обходясь без предварительного создания объекта Connection: вы можете связать эти объекты с подключением только тогда, когда придет время заполнить их реальными данными. Либо же вы можете создать подключение неявно в процессе определения объекта Recordset или Command. Однако создание объекта Connection явным образом упрощает ваш код и позволяет связывать одно подключение с несколькими другими объектами.
Работа с объектами Recordset
Давайте поближе познакомимся с объектами Recordset: вы используете при выполнении фундаментальных операций с данными. Объект Recordset - это контейнер, содержащий данные, полученные из источника данных. Как и положено контейнеру, один объект Recordset может содержать различные записи в разное время.
После того как вы объявили переменную для объекта Recordset, вы можете немедленно приступить к работе с его свойствами. Однако, в этот момент он существует только "виртуально". Для заполнения пустого контейнера реальными данными прибегните к одному из следующих приемов:
* собственный метод Open объекта Recordset;
* метод Execute объекта Command;
* метод Execute объекта Connection.
Простейший способ создания объекта Recordset - использование метода Open этого самого объекта. Метод Open хорошо работает в том случае, если вы используете простые инструкции Select для получения необходимых записей. Следующий фрагмент кода демонстрирует настройку объекта Recordset с помощью метола Open:
Dim conman As New Connection
Dim rstMan As Recordset
Dim strSQL As String
...(здесь содержится код, используемый для создания объекта подключения conMan) strSQL = "SELECT * FROM Toys" ' выбор всей таблицы Toys
Set rstMan.ActiveConnection = conman
rstMan.Open strSQL,, adOpenForwardOnly, adLockReadOnly, _
adCmdText
Обратите внимание на то, что приведенный выше фрагмент кода связывает подключение с объектом Recordset с помощью свойства ActiveConnection последнего. Кроме того, обратите внимание на то, что параметры, управляющие поведением объекта, указаны в качестве аргументов метода Open.
Инструкции SELECT языка SQL подходят далеко не всегда. В приложениях клиент/сервер эффективность очень часто диктует необходимость создания объектов Recordset путем выполнения процедур (запросов). Если подобной процедуре требуются определенные параметры, в этой ситуации оказывается удобным использование объекта Command для создания объекта Recordset.
Прежде всего настройте объект Command, присвоив его свойству ActiveConnection значение, соответствующее необходимому подключению. После этого вы можете уделить внимание и объекту Recordset. В этом случае вы должны сначала определить параметры этого объекта как свойства. После этого вы наполняете объект Recordset записями, пользуясь результатами выполнения метода Execute объекта Command. Соответствующий пример приведен ниже: