<<

стр. 6
(всего 10)

СОДЕРЖАНИЕ

>>

Вывод документа PowerPoint на устройство печати можно осуществить
с помощью метода Printout объекта Presentation, например:
Арр.Presentations.Item(2).Printout().
Если нужно изменить параметры печати, следует указать значения соответст-
вующих (необязательных) параметров метода Printout. В случае PowerPoint
их пять. Первые два параметра указывают номера слайдов, которые должны
быть напечатаны. Третий параметр — представляет собой строку с именем
файла, если вывод происходит в файл вместо принтера. Четвертый параметр
(целое число) указывает, сколько экземпляров документа печатать. Пятый па-
раметр определяет, должен ли быть напечатанный документ разобран по эк-
земплярам, и принимает значения истина (по умолчанию) или Ложь. Так, для
вывода документа с пятого по двадцатый слайды в файл C:\MyOutput.prn
в трех экземплярах можно использовать следующий код:
Арр.Presentations.Item(2) .Printout(5,20,"с:\MyOutput.prn",3) .
Однако, помимо параметров метода Printout, влияющих на то, какой прин-
тер используется и сколько экземпляров печатается, на режим печати пре-
зентации влияет также свойство Printoptions объекта Presentation. Это
свойство представляет собой объект Printoption, имеющий, в свою оче-
редь, набор свойств, влияющих на то, в каком виде печатается презентация
(слайды, выдачи, заметки и др.), печатаются ли рамки вокруг слайдов,
сколько слайдов на странице располагается в случае печати выдач, печатает-
ся ли фон слайдов и др. Указанный набор свойств примерно отражает, что
Использование OLE Automation 179

пользователь PowerPoint может изменить, выбрав пункт Print из меню
PowerPoint (в том числе и имя принтера, имя презентации, и число копий).

Демонстрация слайдов
Для показа слайдов используется метод Run объекта Slideshowsettings, яв-
ляющегося свойством объекта Presentation:
Арр.Presentations.Item(l).SlideShowSettings.Run() .
Для установки режима показа слайдов также используется объект
Slideshowsettings. Его свойство RangeType указывает, какой именно фраг-
мент презентации нужно демонстрировать. Возможные значения этого
свойства следующие:
П 1 — вся презентация;
П 2 — выделенный диапазон слайдов;
П з — именованная демонстрация.
Свойства StartingSlide И EndingSlide объекта SlideShowSettings СОДер-
жат номера первого и последнего слайда демонстрируемого фрагмента. Эти
свойства имеет смысл применять в тех случаях, если свойство RangeType
этого же объекта равно 2.
Свойство AdvanceMode объекта Slideshowsettings указывает, каким обра-
зом производится смена слайдов при демонстрации:
П 1 — ручная смена слайдов;
О 2 — смена слайдов в соответствии с временем показа каждого слайда;
П з — запись времени показа слайдов.
Свойство LoopUntiistopped объекта Slideshowsettings, принимающее зна-
чение истина или ложь, указывает, демонстрируются ли слайды непрерывно
до нажатия пользователем клавиши <Esc>. Это свойство целесообразно
применять, если свойство AdvanceMode объекта Slideshowsettings установ-
лено равным 2. Отметим также, что время показа слайдов, если таковое не
записано пользователем вручную, можно установить программно, с помощью
свойства siideShowTransition объекта slide. В листинге 4.43 приведен
пример использования описанных выше свойств и методов.




Для Номер = 2 по 7 Цикл
Арр.Presentations.Item(I).Slides.Item(Номер).SiideShowTransition.
AdvanceTime = 1;
Арр.Presentations.Item(1).Slides.Item(Номер).SlideShowTrans ition.
AdvanceOnTime = Истина;
180 Глава 4

КонецЦикла;
Арр.Presentations.Item(l).SlideShowSettings.StartingSlide = 2;
App.Presentations.Item(1).SlideShowSettings.EndingSlide = 7;
App.Presentations.Item(1).SlideShowSettings.AdvanceMod = 2;
App.Presentations.Item(l).SlideShowSettings.LoopUntilStopped = Истина;
App.Presentations.Item(l).SlideShowSettings.RangeType = 2;
App.Presentations.Item(l).SlideShowSettings.Run();

В данном фрагменте кода время показа слайдов со второго по седьмой уста-
навливается равным одной секунде, далее указывается, что эти слайды будут
демонстрироваться в соответствии с заданным временем непрерывно до на-
жатия клавиши <Esc>, а затем запускается показ слайдов.
Свойство siideShowTransition объекта slide может быть использовано для
определения анимационных эффектов при смене слайдов. В листинге 4.44
приведен фрагмент кода, иллюстрирующий, каким образом устанавливаются
анимационные эффекты и звуковое сопровождение при смене слайда.

Листинг 4.44. Звуковое сопровождение при смене слайда

App.Presentations.Item (I).Slides.Item (2).SiideShowTransition.EntryEffeet = 770;
App.Presentations.Item(1).Slides.Item(2).SiideShowTransition.SoundEffect.
ImportFromFile("C:\Program Files\NetMeeting\blip.wav");

Различные значения свойства E n t r y E f f e c t можно найти в интерфейсном
модуле или справочном файле системы PowerPoint.
А теперь кратко остановимся на управлении поведением объектов при пока-
зе слайдов. Для управления анимацией объектов на слайдах следует исполь-
зовать свойство AnimationSettings объекта shape. Это свойство возвращает
объект AnimationSettings, свойства которого и отвечают за анимацию дан-
ного объекта. Так, свойство AdvanceMode указывает, каким образом появля-
ется объект, а свойство AdvanceTime — через какое время после показа
слайда появляется объект. Свойство TextLeveiEffeet определяет, до какого
уровня текста происходит анимация объекта. И наконец, свойство Animate
(принимающее значение истина или ложь) указывает, должен ли объект во-
обще отображаться с анимацией. Пример управления поведением объекта
на слайде приведен в листинге 4.45.
г
г " * " " " •
лстинг4.45. Управление поведением объекта на слайде

App.Presentations.Item(l).Slides.Item(3).Shapes.Item(1)
AnimationSettings .AdvanceMode = 2;
App.Presentations.Item(1).Slides.Item(3).Shapes.Item(1)
AnimationSettings .AdvanceTime = 1;
181
Использование OLE Automation

App.Presentations.Item(1).Slides.Item(3).Shapes.Item (1).
AnimationSettings.TextLevelEffect = 16;
App.Presentations.Item(l).Slides.Item(3).Shapes.Item(1).
AnimationSettings.Animate = Истина;

Этот фрагмент кода устанавливает автоматическую анимацию первого объ-
екта на третьем слайде через одну секунду после показа слайда.


Работа с Adobe Photoshop
С помощью OLE-сервера Adobe Photoshop можно автоматизировать выпол-
нение действий, связанных с обработкой растровых изображений.
Для создания объекта приложения Adobe Photoshop используется конструк-
ция, приведенная в листинге 4.46.



// Создание объекта приложения Photoshop
Photoshop = Новый СОМОбъект("Photoshop.Application");
// Установка видимости окна приложения
Photoshop.Visible = Истина;
// Уничтожение объекта приложения
Photoshop.Quit();

Важно отметить то, что OLE-сервер Adobe Photoshop может создать только
один экземпляр приложения, т. е. при попытке создать еще один объект —
установится связь с открытым ранее приложением.
Для открытия существующего файла используется метод Open объекта
Photoshop. В листинге 4.47 приведен пример открытия файла с последую-
щим его закрытием.




// Создание объекта приложения Photoshop
Photoshop = Новый СОМОбъект("Photoshop.Application");
// Открытие картинки
PhotoDoc = Photoshop.Open ("С:\picture.jpg");
// Закрытие документа
PhotoDoc.Close();
// Уничтожение объекта приложения
Photoshop.Quit();
Глава 4
182

Над открытым документом можно производить различные действия, в том
числе и выполнение определенных в Adobe Photoshop операций (Action).
Для выполнения операции над открытым документом необходимо вызвать
метод piayAction объекта Photoshop с указанием в параметре названия вы-
полняемой операции. В листинге 4.48 приведен пример открытия документа
Photoshop с именем "Quadrant colors", выполнение над ним операции
и последующим сохранением документа.




// Создание объекта приложения Photoshop
Photoshop = Новый СОМОбъект("Photoshop.Application");
// Открытие картинки
PhotoDoc = Photoshop.Open("С:\picture.jpg");
// Запуск операции (Action) по имени
Photoshop.PiayAction("Quadrant Colors");
// Сохранение картинки
PhotoDoc.SaveTo("С:\NewPicture.psd");
// Закрытие документа
PhotoDoc.Close();
// Уничтожение объекта приложения
Photoshop.Quit();

Существенный недостаток данного примера состоит в том, что метод SaveTo
не сохраняет автоматически документ, а открывает стандартный диалог со-
хранения файла. Для полной автоматизации всех действий над документом
рекомендуется все операции (Action) заканчивать сохранением файла или
установить отдельную операцию, которая будет сохранять документ в файл
со всеми произведенными изменениями.
Помимо выполнения операции, с указанием ее имени, можно выполнить
все определенные в Adobe Photoshop операции, перебрав коллекцию
Actions объекта Photoshop (листинг 4.49).




// Создание объекта приложения Photoshop
Photoshop = Новый СОМОбъект("Photoshop.Application");
// Открытие картинки
PhotoDoc = Photoshop.Open("С:\picture.jpg");
// Перебор коллекции операций и запуск каждой из них
Использование OLE Automation 183

Для каждого Action из Photoshop.Actions Цикл
КодОтвета = Вопрос("Запустить " + Action.Name +
"?",РежимДиалогаВопрос.ДаНетОтмена,,,"Запустить операцию?");
Если КодОтвета = КодВозвратаДиалога.Да Тогда
Action.Play();
ИначеЕсли КодОтвета = КодВозвратаДиалога.Отмена Тогда
Прервать;
КонецЕсли;
КонецЦикла;
// Закрытие документа
PhotoDoc.Close();
// Уничтожение объекта приложения
Photoshop.Quit();


В данном примере перебираются все элементы коллекции Actions. Для каж-
дой операции (Action) появляется вопрос с просьбой подтвердить ее вы-
полнение, при утвердительном ответе она выполняется.
Глава 5


Использование ADO
Понятие ADO
ADO (Microsoft ActiveX Data Objects) — это набор библиотек, содержащих
СОМ-объекты. Основное их назначение — реализация прикладного про-
граммного интерфейса для доступа к базам данных и использование
в клиентских приложениях. ADO использует библиотеки OLE DB, пре-
доставляющие низкоуровневый интерфейс для доступа к данным. OLE
DB, со своей стороны, обеспечивают доступ к данным с помощью СОМ-
интерфейсов.
OLE DB и ADO являются частью универсального механизма доступа к дан-
ным Microsoft (Microsoft Universal Data Access), который обеспечивает высо-
копроизводительный доступ к различным источникам информации (вклю-
чая реляционные и нереляционные базы данных), в том числе к данным,
хранящимся на мэйнфреймах, данным электронной почты и файловой сис-
темы, текстовым, графическим и др. Для многих современных приложений,
которые используют различную информацию, характерно подобное разно-
образие ее источников. Более того, вполне очевидно, что могут появляться
новые форматы данных и способы их хранения. Поэтому разумным требо-
ванием к универсальному механизму доступа к ним могла бы стать возмож-
ность поддержки не только существующих в настоящее время их форматов
и источников, но и форматов данных, которые будут созданы в будущем.
Назначение универсального механизма доступа к данным фирмы Microsoft —
предоставить доступ к перечисленным их источникам с помощью единой
модели доступа.
Рассмотрим основные компоненты архитектуры универсального механизма
доступа к данным Microsoft и обсудим их более детально.
О Microsoft ActiveX Data Objects (ADO) — представляет собой программный
интерфейс для доступа к данным из приложений. С точки зрения про-
граммирования, ADO и его расширения являются упрощенным высоко-
уровневым объектно-ориентированным интерфейсом к OLE DB.
186 Глава 5

П OLE DB — это низкоуровневый интерфейс для доступа к данным. ADO
применяет OLE DB, но можно использовать OLE DB и напрямую, ми-
нуя ADO.
П Open Database Connectivity (ODBC) — стандартный способ доступа к ре-
ляционным базам данных. Этот компонент универсального механизма
доступа оставлен с целью обеспечения совместимости с прежними версия-
ми программного обеспечения. В современных приложениях применению
ODBC-драйверов предпочитают использование OLE DB-провайдеров.
Для доступа к источнику данных с помощью OLE DB требуется, чтобы на
компьютере, где используется клиентское приложение, был установлен OLE
DB-провайдер для данной СУБД. OLE DB-провайдер представляет собой
динамическую библиотеку DLL, загружаемую в адресное пространство клиент-
ского приложения и используемую для доступа к источнику данных. Для каж-
дого типа СУБД нужен собственный OLE DB-провайдер, так как провайдеры
базируются на функциях клиентских API (Application Programming Interface,
программный интерфейс приложения), разных для различных СУБД.
ADO представляет собой высокоуровневый программный интерфейс для
доступа к OLE DB-интерфейсам. Он позволяет манипулировать данными
с помощью любых OLE DB-провайдеров, входящих как в состав Microsoft
Data Access Components, так и в состав программных продуктов, разрабо-
танных сторонними производителями. ADO содержит набор объектов, ис-
пользуемых для соединения с источником информации с целью чтения, до-
бавления, удаления или модификации предоставляемых им данных.
П Объект connection применяется для установки связи с источником данных.
Он представляет единственную сессию. Этот объект позволяет изменить
параметры соединения с базой данных, а также начать или завершить
транзакцию. Используя объект connection, можно выполнять команды
(например, SQL-запросы) с помощью метода Execute. Если команда воз-
вращает набор данных, то автоматически создается объект Recordset, ко-
торый возвращается в результате выполнения этого метода.
П Объект Error используется для получения сведений об ошибках, возни-
кающих в процессе выполнения приложения.
П Объект command представляет собой команду, которую можно выполнить
в источнике данных. Команда может содержать SQL-предложение или
вызов хранимой процедуры. В последнем случае для определения пара-
метров процедуры может быть использована коллекция Parameters объ-
екта Command.
П Объект Recordset — это набор записей, полученных из источника дан-
ных, и может быть использован для добавления, удаления, изменения,
просмотра записей. Данный объект может быть открыт непосредственно
ИЛИ создан С ПОМОЩЬЮ объектов Connection ИЛИ Command.
Использование ADO 187

П Объект Field — это колонка в наборе данных, представленных объектом
Recordset. Объект может быть использован для получения значений
конкретного поля таблицы, его модификации, извлечения метаданных,
таких как имя колонки и тип данных.
О Объект Record — представляет одну запись внутри объекта Recordset и
может быть использован для работы с гетерогенными и иерархическими
данными (добавлен в библиотеку ADO 2.5, являющуюся составной частью
операционной системы Windows 2000).
П Объект stream представляет двоичные данные, связанные с объектом
Record. Например, если объект Record представляет собой файл, то его
объект stream должен содержать данные внутри этого файла (добавлен
в ADO 2.5).


Соединение с источником данных
Для установки связи с источником данных используется объект Connection.
Рассмотрим два варианта создания соединения — явного (листинг 5.1)
и неявного (листинг 5.2).



// Создание объекта установки связи с источником данных
Connection = Новый СОМОбъект("ADODB.Connection");


// Подключение к источнику данных
Попытка
Connection.Open(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки() ) ;
Возврат;
КонецПопытки;


// Создание объекта выполнения команды
Command = Новый СОМОбъект("ADODB.Command");
// Указание активного соединения
Command.ActiveConnection = Connection;
// Определение текста команды
Command.CommandText = "SELECT * FROM titles";
// Определение типа команды
Command.CommandType = 1;
188 Глава 5


// Создание объекта набора записей
RecordSet = Новый СОМОбъект("ADODB.RecordSet");
// Выполнение и получение набора данных
RecordSet = Command.Execute();


// Перебор данных
Пока RecordSet.EOF() = 0 Цикл
Сообщить(RecordSet.Fields(0).Value);
RecordSet.MoveNext();
КонецЦикла;


// После того как набор записей уже не нужен, его следует закрыть
RecordSet.Close();
Connection.Close();




// Создание объекта выполнения команды
Command = Новый СОМОбъект("ADODB.Command");
// Указание активного соединения без использования объекта Connection
Command.ActiveConnection = СтрокаПодключения;


// Определение текста команды
Command.CommandText = "SELECT * FROM titles";
// Определение типа команд
Command.CommandType = 1;


// Создание объекта набора записей
RecordSet = Новый СОМОбъект("ADODB.RecordSet");
// Выполнение и получение набора данных
RecordSet.Open(Command);


// Перебор данных
Пока RecordSet.EOF() = 0 Цикл
Сообщить(RecordSet.Fields(0).Value);
RecordSet.MoveNext();
КонецЦикла;
Использование ADO 189


/I После того как набор записей уже не нужен, его следует закрыть
RecordSet.Close ();
Connection.Close();


Из приведенных примеров видно, что основное отличие явного соединения
от неявного заключается в том, что в последнем случае не используется объ-
ект Connection. Для получения более структурированного и понятного кода
рекомендуется использовать явное соединение.
В обоих примерах для описания источника данных использовалась строко-
вая переменная Строкаподключения. Значение данной переменной можно
формировать вручную, либо с помощью программы связи с данными. Про-
грамма связи с данными используется для создания и управления подклю-
чениями между локальным компьютером и хранилищами данных OLE DB.
Запустить программу связи с данными можно двумя способами — вручную
и программно.

|Щ6 Свойства связи с данными

Поставщик данных Подключение j Дополнительно ] Все

•!.. Для подключения к данным SQL Server укажите следующее:
1. Выберите или введите имя сервера:
Обновить
MAVCOMP jj
2. Для входа в сервер использовать:
С учетные сведения Windows NT
: (* следующие имя и пароль пользователя:
mav
Пользователь:

Пароль:
Г* Пустой пароль ** Разрешить сохранение пароля
. - 3 ( Выберите базу данных на сервере:

JNorthwind j^J
С" Подсоединить Файл с базой данных под именем:

Г
Я ФаЙЛй'.




Проверить подключение




Справка
|
| Отмена
! :,0"К
" ':. .




Рис. 5.1. Диалог программы связи с данными
190 Глава 5

Для ручного запуска достаточно создать пустой текстовый файл с расшире-
нием UDL и в любом файловом менеджере запустить его. Этом случае от-
кроется диалог (рис. 5.1), в котором настраиваются параметры соединения,
а после нажатия кнопки ОК сформировавшаяся строка соединения запи-
шется в созданный UDL-файл.
Пример программного запуска утилиты настройки связи с данными приве-
ден в листинге 5.3.




// Программа для формирования и редактирования строки соединения
DataLinks = Новый СОМОбъект("DataLinks");
// Объекту Connection устанавливаем введенное значение строки соединения
Connection.ConnectionString = СтрокаПодключения;
// Открываем диалог программы связи с данными
DataLinks.PromptEdit(Connection);
// Возвращаем новое значение строки соединения
СтрокаПодключения = Connection.ConnectionString;
Сообщить(СтрокаПодключения);

Важно отметить, что при программном запуске утилиты связи с данными
все манипуляции со строкой соединения происходят через объект
Connection. Данная особенность еще раз говорит в пользу того, что лучше
использовать явное соединение с источником данных (см. листинг 5.1).
Например, для доступа к базе данных Microsoft SQL Server строка соедине-
ния будет выглядеть следующим образом:
"Provider=SQLOLEDB.l; Password=erpg; Persist Security Info=True; User
ID=mav; Initial Catalog=Northwind; Data Source=MAVCOMP"
Если же строка соединения записана во внешнем UDL-файле, то строка
соединения будет выглядеть иначе:
"FileName=C:\DataLinks\MyDataLink.udl"
Рассмотрим основные свойства строки соединения.
П Provider — названия поставщика OLE DB.
П User ID — имя пользователя.
О Password — пароль пользователя.
О Persist Security Info — признак сохранения пароля в строке соединения
(True/False).
П Initial Catalog — используемая база данных.
Использование ADO

П Data Source — название источника данных (например, имя сервера, имя
файла и т. п.);
П File Name — полное имя UDL-файла.
Все остальные свойства зависят от конкретного OLE DB-провайдера.
Продолжая рассматривать пример, приведенный в листинге 5.1, стоит оста-
новиться на объекте connection. Это самый важный объект ADO, отвечаю-
щий за связь между приложением и базой данных. У него очень много ме-
тодов и свойств, и одно из них, connectionstring, описанное ранее. Оно
определяет собственно строку инициализации ODBC-соединения.
Рассмотрим основные свойства объекта Connection.
О ConnectionTimeout — задает время в секундах, в течение которого ожи-
дается установление ODBC-соединения. По умолчанию равно 15. Кон-
кретное значение имеет смысл устанавливать в том случае, когда сервер,
вследствие своей загруженности или высокого трафика, не успевает об-
рабатывать запросы. Если установить значение равное 0, то сервер будет
ждать установления соединения бесконечно долго.
П CommandTimeout — задает время в секундах, в течение которого ожидается
исполнение запросов. По умолчанию равно 30.
П! Connectionstring — строка инициализации ODBC-соединения.
П DefauitDatabase — база данных по умолчанию для данного соединения.
П state — определяет состояние соединения (о — закрыто, 1 — открыто).
Рассмотрим основные методы объекта connection.
П open — метод открывает доступ к базе данных и имеет три необязатель-
ных параметра:
• Connectionstring — строка соединения с источником данных, при-
чем если параметр connectionstring не задан, то используется свой-
ство connection . Connectionstring;
• userio — имя пользователя;
• Password — пароль (обычно userio и Password задаются непосредст-
венно в Connectionstring, поэтому их можно не задавать).
П close — разрывает связь с базой данных, при этом закрываются также
все объекты типа Recordset, связанные с данным объектом, однако па-
мять, отведенная под объект connection, не освобождается, т. е. в даль-
нейшем можно снова выполнить команду open для повторного доступа
к базе данных.
О Execute — метод исполняет SQL-запрос или хранимую процедуру и воз-
вращает объект типа Recordset, причем возможно задание трех параметров:
• commantText — строка, содержащая SQL-запрос, имя таблицы, храни-
мой процедуры или прочий исполняемый текст;
192 Глава 5
_ _ _

RecordsAf fected — переменная, в которую возвращается количество

записей в результате исполнения запроса;
• options — определяет тип параметра commandText (полезен для опти-
мизации исполнения запроса) и может иметь значения:
О 1 — SQL-запрос или другое текстовое выражение;
О 2 — таблица;
О 4 — хранимая процедура;
О 8 — тип параметра неизвестен.


Примечание |
Важно отметить, что объект Recordset, созданный с помощью этого метода,
доступен только для чтения и его сканирование может производиться только
вперед по записям. Для того чтобы иметь возможность вставлять или изменять
записи, а также двигаться вперед и назад по ним, необходимо непосредственно
создать этот объект и задать некоторые его свойства до исполнения соответст-
вующего запроса.



Выполнение SQL-запросов
и хранимых процедур
Ранее было сказано, что выполнить SQL-запрос или хранимую процедуру
можно с помощью метода Execute объекта Connection, но наиболее пра-
вильно для этих целей использовать специализированный объект —
command. Это связано с тем, что объект command специально предназначен
для обработки параметров SQL-операторов, а также хранимых процедур и
при возврате объекта Recordset минимизирует количество информации,
которой обмениваются поставщик данных и приложение.
Объект Command описывает команду (запрос или оператор), которая обраба-
тывается источником данных. Благодаря этому объекту обеспечивается про-
стота и эффективность работы с запросами или хранимыми процедурами.
С помощью объекта command можно определить SQL-строку, хранимую про-
цедуру или имя таблицы.
Как и многие другие объекты модели ADO, объект command может быть соз-
дан либо с помощью объекта Connection (листинг 5.1), либо независимо от
него (листинг 5.2).
После того как объект command будет создан и подключен к поставщику
данных, его можно использовать для выполнения процедур и SQL-
операторов, которые будут либо воздействовать на данные в источнике дан-
ных, либо возвращать объект Recordset.
Использование ADO 193

Рассмотрим пример добавления новой записи в таблицу базы данных (лис-
тинг 5.4).



ТекстЗапроса"= "
I INSERT
I INTO Users(Parentld, IsFolder, FIO, Login, Password, Description)
I VALUES (" + 2 + " " + 1 + ", " + Пользователь.Наименование + " , • +
, ' '"
Пользователь.Логин + "','pass','Произвольное описание')";

Command = СоздатьОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = ТекстЗапроса;
.
Command.CommandType = 1;
// Выполнение запроса
RecordSet = Command.Execute();



Примечание ]Д
Отдельно на тексте запроса останавливаться не будем, так как подразумевает-
ся, что читатель знаком с языком SQL

Рассмотрим основные свойства объекта Command.
П ActiveConnection — данное свойство определяет соединение, с которым
работает объект Command, и содержит строку, описывающую соединение
либо указывающую на открытый в данный момент объект connection.
В первом случае создается новое соединение, предназначенное специально
для объекта Command и объекта Recordset, который также создается.
П CommandText — это свойство определяет SQL-оператор, имя хранимой
процедуры либо имя таблицы, с которой будет работать объект command.
Как правило, оно содержит вызовы хранимых процедур или SQL-
операторов, кроме этого может включать и специфические команды,
поддерживаемые поставщиком данных.
П commandTimeout — данное свойство предназначено для определения ин-
тервала времени ожидания объектом Command результатов обращения
к поставщику данных. По истечении этого периода объект command отме-
няет попытку установить соединение и генерирует сообщение об ошибке.
Стандартное значение данного свойства равно 30 секундам. Однако оно
может быть и больше, если предполагается, что процесс загрузки данных
поставщиком занимает много времени.
7 Зак. 722
Глава 5
194

О commandType — данное свойство используется для оптимизации процесса
обработки объекта command поставщиком данных. При указании кон-
кретного типа команды, определенной свойством CommandText объекта
command, поставщик данных освобождается от распознавания типа вы-
полняемой команды. Аналогично аргументу Option метода Execute объ-
екта connection, данное свойство может принимать следующие значения:
• 1 — SQL-запрос или прочее текстовое выражение;
• 2 — таблица;
• 4 — хранимая процедура;
• 8 — тип параметра неизвестен.
П state — свойство возвращает множество значений сумм одной или не-
скольких констант objectstateEnum. Эти константы описывают — явля-
ется ли объект Command открыт, закрыт, в соединении и т. п. Возможные
значения:
• о — объект закрыт;
• 1 — объект открыт;
• 2 — соединяется;
• 4 — выполняется;
• 8 — выбран.
Рассмотрим основные методы объекта command.
О Execute — метод исполняет SQL-запрос или хранимую процедуру. Воз-
вращает объект типа Recordset.
П CreateParameter — данный метод используется для создания новых объ-
ектов Parameter, которые добавляются в семейство Parameters объекта
command до того, как будет выполнен запрос. Объект Parameter описывает
параметр, передаваемый в SQL-оператор или хранимую процедуру, кото-
рая указана В СВОЙСТВе CommandText объекта Command.
Рассмотрим более подробно использование параметров, передаваемых в хра-
нимые процедуры. Для передачи параметров процедуре необходимо выпол-
нить следующие действия.
1. Вызвать метод CreateParameter И создать новый объект Parameter.
2. Добавить Объект В семейство Parameters объекта Command.
3. Воспользовавшись методом Execute объекта command, получить объект
Recordset.
Рассмотрим пример выполнения перечисленных действий (листинг 5.5).
Использование ADO 195




11 Создание нового объекта Command
Command = Новый СОМОбъект("ADODB.Command");
// Организация связи с поставщиком данных для объекта Command
Command.ActiveConnection = Connection;
// Задание хранимой процедуры
Command.CommandText = "SP_GET_AUTHOR_INFO";
// Применение метода CreateParameter объекта Command для
// создания нового объекта Parameter, который будет
// использован при выполнении хранимой процедуры.
Parameter = Command.CreateParameter("SUSERNAME", 200, 1, 12, "MAV"};
// Добавление в семейство Parameters объекта Command нового параметра
Command.Parameters.Append(Parameter);
// Получение объекта Recordset
Recordset = Command.Execute();

Метод CreateParameter применяется следующим образом:
CreateParameter(Name, Type, Direction, Size, Value).
Рассмотрим параметры этого метода.
П Name — строковое значение, определяющее имя создаваемого параметра.
П Туре — тип параметра, передаваемого в объект command. Хотя тип значе-
ния параметра, передаваемого методу CreateParameter, является вари-
антным, включение этого необязательного аргумента часто влияет на
операцию, выполняемую поставщиком данных. Все возможные значения
перечислены в табл. 5.1.
О Direction — если вам не приходилось использовать хранимые процедуры,
то вам не известен тот факт, что они могут как принимать параметры,
так и возвращать их. Например, если применяется хранимая процедура
для вычисления значений, получаемых при обмене валюты, она будет
возвращать результат вычислений в выходном параметре. Данный аргу-
мент определяет способ использования параметров хранимой процедуры:
для ввода данных, для вывода значений, или же и для того и для другого.
Все возможные значения перечислены в табл. 5.2.
П size — если объекту Parameter передаются данные переменной длины,
то прежде чем добавить этот объект в семейство Parameters, нужно за-
дать значение его свойства size, иначе произойдет ошибка.
П value — этим аргументом устанавливается значение параметра, переда-
ваемого объекту Connection (ADO позволяет задавать для данного аргу-
Глава 5
196

мента длинные двоичные значения). Например, если требуется
получить значение, возвращаемое хранимой процедурой — необходимо
добавить параметр С именем Return: ReturnParameter =
Command. CreateParameter ("Return", 3 , 4 ) • Соответственно результат,
возвращенный хранимой процедурой, будет находиться в свойстве
ReturnParameter.Value.

Таблица 5.1. Типы параметров, используемые в объектах ADO

Значение Описание
Константа ADO
8-байтовое целое со знаком
20
adBiglnt

Двоичное значение
128
adBinary

Булево значение
11
adBoolean

Символьная строка, заканчивающаяся симво-
adBSTR 8
лом Null (в кодировке Unicode)
129
adChar Строковое значение
Денежная сумма (8-байтовое целое со знаком,
adCurrency 6
кратное 10000)
Дата
1
adDate
133 Дата (в формате "ггггммчч")
adDBDate

Время (в формате "ччммсс")
134
adDBTime

Точная дата и время (в формате "гггг_мм_
135
adDBTimeStamp
чч_чч_мм_сс" плюс тысячные доли секунды)
Десятичное число с фиксированными разме-
14
adDecimal
рами целой и дробной частей
Значение с плавающей точкой двойной точно-
adDouble 5
сти
Значение не определено
0
adEmpty

32-битовый код ошибки
10
adError
72
adGUID Полностью уникальный идентификатор (QUID)
Указатель на интерфейс IDispatch OLE-объекта
adIDispatch 9

4-байтовое целое со знаком
adlnteger 3

Указатель на интерфейс lUnknown OLE-объекта
13
adIUnknown

Длинное двоичное значение (только для объек-
205
adLongVarBinary
та Parameter)
adLongVarChar 201 Длинное строковое значение, заканчивающее-
ся символом Null (только для объекта
Parameter)
Использование ADO 197

Таблица 5.1 (окончание)
Константа ADO Значение Описание
adLongVarWChar 203 Длинное строковое значение (только для объ-
екта Parameter)
131
adNumeric Десятичное число фиксированной точности
4
adSingle Значение одинарной точности с плавающей
точкой
2
adSmalllnt 2-байтовое целое со знаком
1 -байтовое целое со знаком
16
adTinylnt
21 8-байтовое целое без знака
adUnsignedBiglnt
19
adUnsignedlnt 4-байтовое целое без знака
18
adUnsignedSmalllnt 2-байтовое целое без знака
17 1 -байтовое целое без знака
adlnsignedTinylnt
132
adUserDef ined Переменная, определяемая пользователем
Двоичное значение (только для объекта
adVarBinary
Parameter)
200 Строковое значение (только для объекта
adVarChar
Parameter)

Вариантная переменная OLE-автоматизации
12
adVariant
202 Символьная строка Unicode, заканчивающаяся
adVarWChar
символом Null (только для объекта Parameter)
Символьная строка Unicode, заканчивающаяся
130
adWChar
символом Null

Таблица 5.2. Допустимые значения аргумента Direction метода Crea teParameter

Значение Описание
Константа ADO
adParamUnknown Назначение параметра не определено
adParamlnput Входной параметр (по умолчанию) — использу-
ется для передачи информации в хранимую
процедуру
adParamOutput Выходной параметр — применяется для полу-
чения данных из хранимой процедуры посред-
ством SQL-параметра OUTPUT
adParamlnputOutput Входной и выходной параметр— используется
как для передачи информации в хранимую про-
цедуру, так и для получения от нее значений
Возвращаемое значение — применяется для пере-
adParamReturnValue
хвата кода завершения хранимой процедуры
198 Глава 5


Обращение к результатам запроса
Ранее очень часто встречалось использование объекта Recordset. Объект
типа Recordset представляет таблицу — результат запроса к базе данных.
Экземпляр объекта создается командой:
Новый СОМОбъект("ADODB.RecordSet") .
Для перемещения по строкам, или записям, таблицы, объект использует
курсор, указывающий на текущую запись. При открытии объекта курсор
указывает на самую первую запись. Для удобства работы можно разбивать
таблицу на страницы, варьируя их размер. По умолчанию, если не задано
свойство CursorType, перемещаться по записям можно только вперед.
Для того чтобы определить список полей таблицы, используется коллекция
Fields объекта Recordset. Каждый элемент коллекции представляет собой
объект типа Field. Чтобы вывести список полей таблицы, можно использо-
вать следующий код (листинг 5.6).

нг 5.6. Вывод списка полей, входящих в Recordset

// Создание объекта выполнения команды
Command = Новый СОМОбъект("ADODB.Command");
// Указание активного соединения
Command.ActiveConnection = Connection;
// Определение текста команды
Command.CommandText = "SELECT * FROM titles";
// Определение типа команды
Command.CommandType = 1;


// Создание объекта набора записей
RecordSet = Новый СОМОбъект("ADODB.RecordSet");
// Выполнение и получение набора данных
RecordSet = Command.Execute();


// Перебор полей RecordSet
Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл
Сообщить("Имя колонки" + RecordSet.Fields.Item(НомерКолонки).Name);
КонецЦикла;


Использовать данный прием очень удобно в том случае, когда заранее неиз-
вестен состав полей выборки.
Использование ADO 199

Рассмотрим следующий пример, в котором демонстрируется вывод всех
значений полей всех записей, причем состав полей, как и в предыдущем
примере, заранее неизвестен (листинг 5.7).



// Перебор записей выборки
КоличествоПолей = RecordSet.Fields.Count;
Пока RecordSet.EOF() = 0 Цикл
// Перебор полей выборки
Для НомерКолонки = 0 По КоличествоПолей-1 Цикл
ИмяПоля = RecordSet.Fields.Item(НомерКолонки).Name;
Значение = RecordSet.Fields(ИмяПоля).Value;
Сообщить("Поле: " + ИмяПоля + " = " + Значение);
КонецЦикла;
// Переводим курсор на следующую запись
RecordSet.MoveNext();
КонецЦикла;


Для большего понимания данного примера и возможностей объекта
RecordSet рассмотрим свойства данного объекта.
П ActiveConnection — объект типа Connection, к которому привязан дан-
ный Recordset.
П source — строка-источник запроса, т. е. SQL-выражение, имя таблицы
или хранимой процедуры.
П Filter — фильтр, т. е. та часть SQL-запроса, которая находится в составе
WHERE.

О CursorType — тип курсора. Значениями свойства, которые можно изме-
нять только до открытия объекта, могут быть:
• о — является значением по умолчанию (Forward only-курсор) и позво-
ляет перемещаться только вперед по записям таблицы (является наи-
более оптимальным в тех случаях, когда нужно провести лишь единст-
венный проход по записям);
• i — определяет подобие динамическому курсору (Keyset-курсор) за
исключением того, что вы не можете видеть записи таблицы, добав-
ленные другими пользователями базы данных;
• 2 — позволяет любые перемещения по таблице, а также добавление,
изменение и удаление записей, которые видны всем пользователям
базы данных (Динамический курсор);
200 Глава 5

• з — позволяет производить поиск по таблице и создавать отчет (Ста-
тический курсор — копия таблицы), причем добавления, изменения и
удаления, проведенные другими пользователями, невидимы (полезен,
например, при постраничном выводе таблицы с возможностью пере-
мещаться вперед или назад по страницам).
П state — определяет состояние объекта:
• о — закрыт;
• 1 — открыт/
П BOF — логическая величина (истина или ложь). Определяет факт того, что
курсор находится перед первой записью таблицы.
П EOF — логическая величина. Определяет, что курсор находится за по-
следней записью таблицы.
П EditMode — определяет состояние редактирования текущей записи (про-
веден ли метод update для сохранения текущих изменений). Свойство
может принимать следующие значения:
• о — показывает, что редактирование не проводилось;
• 1 — показывает, что данные в текущей записи редактировались, но
изменения еще не сохранены;
• 2 — показывает, что текущая запись добавлена с помощью метода
AddNew, но до сих пор не сохранена.
П RecordCount — определяет количество записей в таблице (доступно,
ТОЛЬКО еСЛИ CursorType = 3).
П AbsoiutePosition — перемещает курсор на новую запись под данным
номером. Должен иметь значение в интервале от 1 до RecordCount (дос-
тупно, ТОЛЬКО еСЛИ CursorType = 3).
П Bookmark — закладка в виде числа. Никак не связана с номером записи.

^ Примечание
Можно при сканировании по таблице запомнить значение Bookmark в некото-
рой временной переменной, а затем вернуться обратно на данную запись (дос-
тупно, только если CursorType = 3).

О Pagesize — задает число записей таблицы на странице. По умолчанию
равен ю (доступно, только если CursorType = з).
П Pagecount — определяет количество страниц. Автоматически пересчиты-
вается при изменении Pagesize (доступно, только если CursorType = з);
П AbsoiutePage — перемещает курсор на начало данной страницы (доступ-
но, только если CursorType = 3).
Использование ADO 201

Помимо перечисленных свойств, объект Recordset имеет ряд методов.
О Open — исполняет запрос и открывает таблицу-результат. Общий формат
вызова: RecordSet.Open(Sourse, ActiveConnection, CursorType), при-
чем необязательные параметры Source, ActiveConnection И CursorType
здесь обозначают то же, что и соответствующие свойства объекта
Recordset. Кроме того, параметр ActiveConnection может быть не толь-
ко объектом типа Connection, но и просто строкой инициализации —
ConnectionString.
О close — закрывает объект.
О Requery — заново пересчитывает таблицу. Эквивалентен последователь-
ному исполнению методов close и Open.
О clone — возвращает объект типа Recordset (копию исходного объекта).
Полезен в случаях, когда нужно использовать одновременно несколько
записей из одной таблицы.
О MoveFirst, MoveLast, MoveNext, MovePrevious — перемещают курсор на
первую, последнюю, следующую или предыдущую запись таблицы соот-
ветственно.
П Move — перемещает курсор на новое положение. Общий формат вызова:
Recordset.Move(NumRecords, Start), причем NumRecords здесь — КОЛИ-
чество записей, на которые нужно переместить курсор. Положительное
значение означает перемещение вперед, отрицательное — назад по запи-
сям. Параметр start определяет точку отсчета, откуда нужно переместить
курсор.

Примечание
НЬ
ЬМИ
Я МММ^В^Ш
^^ ^^ МММММ— «»-|
В « ^ 4Н| I




Может быть либо закладкой, либо одним из возможных значений: о — значе-
ние по умолчанию, точка отсчета — текущая запись; 1 — отсчет идет от пер-
вой записи таблицы; 2 — отсчет идет от последней записи таблицы.

П AddNew — добавляет запись. Можно сначала добавить запись, затем опре-
делить значение полей. А можно это сделать и одной командой:
RecordSet.AddNew(Fields, Values). Здесь Fields — ИМЯ ИЛИ Массив
имен полей, которые нужно определить, values — значение или массив
значений этих полей (чтобы сохранить добавленную запись, необходимо
ВЫПОЛНИТЬ МеТОД Update).
П Delete — удаляет текущую запись или группу записей в зависимости от
параметра. Формат записи: Recordset.Delete(AffectRecords), где пара-
метр Af fectRecords может принимать одно из возможных значений:
• 1 — (значение по умолчанию) удаляет только текущую запись;
• 2 — удаляет записи, удовлетворяющие свойству Filter, которое долж-
но быть задано заранее.
202 Глава 5

П update — сохраняет изменения в текущей записи. Изменения в записи
можно произвести предварительно или непосредственно в команде:
Recordset.Update(Fields, V a l u e s ) . Параметр Fields определяет здесь
имя или массив имен полей, которые нужно определить, параметр
values — значение или массив значений этих полей. Если курсор пере-
мещен с добавленной или измененной записи, сервер автоматически вы-
полнит метод Update.
П Canceiupdate — отменяет любые изменения или добавления записей,
проведенные до использования метода update.


Работа со структурой базы данных (ADOX)
Для работы со структурой базы данных существует технология ADO Exten-
sions for Data Definition and Security (ADOX). ADOX — представляет собой
набор объектов, позволяющих манипулировать метаданными в базах данных
и управлять объектами, отвечающими за безопасность.
ADOX предоставляет более универсальный способ манипуляции метадан-
ными, не требующий знания SQL для того, чтобы получить структуру базы
данных или даже создать новые объекты.

К^ Примечание
Обратите внимание на то, что ADOX работает далеко не со всеми базами дан-
ных— его функциональность ограничена Microsoft Access и Microsoft SQL
Server, а также несколькими другими СУБД.

ADOX обладает собственной объектной моделью, состоящей из следующих
объектов:
П Catalog — представляет всю схему базы данных;
П Table — представляет таблицу в базе данных;
П Column — представляет колонку в таблице;
П index — представляет индекс внутри таблицы;
П! Key — представляет первичный или внешний ключ;
П Group — представляет группу пользователей;
П user — представляет индивидуального пользователя базы данных внутри
группы;
О Procedure — представляет хранимую процедуру внутри базы данных;
П view — является представлением (view) внутри базы данных.
Иерархия объектов ADOX начинается с объекта catalog. Этот объект со-
держит коллекции таблиц, представлений, процедур, пользователей и групп
Использование ADO 203

и может быть использован для открытия существующей базы данных (с по-
мощью объекта ADO Connection), а также для создания новой. Имея объект
catalog, можно работать с таблицами, процедурами и представлениями.
Например, просматривая коллекцию Tables, можно узнать, какие таблицы
имеются в базе данных, а также получить более детальные сведения о таб-
лицах, изучив коллекции Columns, indexes и Keys объекта Table. Изучая
свойства объектов базы данных, можно получить сведения о метаданных и,
в частности, сохранить их в отдельном файле или куда-либо перенести. Ис-
пользуя коллекции users и Groups, можно манипулировать правилами дос-
тупа к данным, создавая отдельных пользователей или группы пользовате-
лей базы данных.

Чтение структуры базы данных
Рассмотрим пример вывода информации о таблицах, представлениях и про-
цедурах базы данных (листинг 5.8).
__.. ˜, :__.




истинг 5.8. Вывод информации о таблицах, представлениях


// Начальная инициализация
Catalog = Новый СОМОбъект("ADOX.Catalog");
Catalog.ActiveConnection = СтрокаПодключения;

// Выводим таблицы
Для НомерТаблицы = 0 По Catalog.Tables.Count-1 Цикл
ИмяТаблицы = Catalog.Tables.Item(НомерТаблицы).Name;
Сообщить("Таблица: " + ИмяТаблицы);
КонецЦикла;


// Проверка текущего источника данных на поддержку коллекции Views
Попытка
КоличествоПредставлений = Catalog.Views.Count;
ПредставленияДоступны = Истина;
Исключение
ПредставленияДоступны = Ложь;
КонецПопытки;

Если ПредставленияДоступны Тогда
// Выводим представления
Для НомерПредставления = 0 По Catalog.Views.Count-1 Цикл
204 Глава 5

ИмяПредставления = Catalog.Views.^ет(НомерПредставления).Name;
Сообщить("Представление: " + ИмяПредставления);
КонецЦикла;
КонецЕсли;

// Выводим процедуры
Для НомерПроцедуры = 0 По Catalog.Procedures.Count-1 Цикл
ИмяПроцедуры = Catalog.Procedures.Item(НомерПроцедуры).Name;
Сообщить("Процедура: " + ИмяПроцедуры);
КонецЦикла;

В приведенном примере имеются три цикла для просмотра коллекций
Tables, views и Procedures объекта Catalog. Отметим, что перед циклом
просмотра коллекции views следует выполнить проверку того, доступны ли
представления для текущего источника данных с помощью конструкции
попытка...исключение...конецПопытки. Это делается, чтобы избежать ошибок и
исключительных ситуаций, которые могут возникнуть, если ADOX не под-
держивает коллекцию views для текущего источника данных.
Коллекция Tables содержит один или более объектов Table, свойствами
которых являются коллекции columns, indexes и Keys, и их также следует
просмотреть (листинг 5.9).



// Начальная инициализация
Catalog = Новый СОМОбъект("ADOX.Catalog");
Catalog.ActiveCdnnection = СтрокаПодключения;


// Выводим таблицы
Для НомерТаблицы = 0 По Catalog.Tables.Count-1 Цикл
Table = Catalog.Tables.Item(НомерТаблицы);
ИмяТаблицы = Table.Name;
Сообщить("Таблица: " + ИмяТаблицы);


// Выводим поля таблицы
Если Table.Columns.Count > 0 Тогда
Для НомерПоля = 0 По Table.Columns.Count-1 Цикл
Column = Table.Columns.Item(НомерПоля);
'ИмяПоля = Column.Name;
ТипПоля = Column.Type;
Использование ADO 205

ДлинаПоля = Column.DefinedSize;
Сообщить("Имя поля: " + ИмяПоля);
Сообщить("Тип поля: " + ТипПоля);
Сообщить("Длина поля: " + ДлинаПоля);
КонецЦикла;
КонецЕсли;


// Выводим индексы таблицы
Если Table.Indexes.Count > 0 Тогда
Для НомерИндекса = 0 По Table.Indexes.Count-1 Цикл
Index = Table.Indexes.Item(НомерИндекса);
ИмяИндекса = Index.Name;
Сообщить("Имя индекса: " + ИмяИндекса);
КонецЦикла;
КонецЕсли;


//. Выводим ключи таблицы
Если Table.Keys.Count > 0 Тогда
Для НомерКлюча = 0 По Table.Keys.Count-! Цикл
Key = Table.Keys.Item(HoMepKruo4a) ;
ИмяКлюча = Key.Name;
Сообщить("Имя ключа: " + ИмяКлюча);
КонецЦикла;
КонецЕсли;
КонецЦикла ;


В данном примере в цикле выборки полей таблицы свойство column.Type
возвращает число, соответствующее типу, определенному в табл. 5.1. Ниже
будет приведен полный список свойств объекта column.
П Attributes — содержит характеристики поля.
П DefinedSize — содержит максимальный размер поля.
П NumericScale — содержит сведения о положении десятичной точки для
числового поля.
О Parentcatalog — указывает на имя каталога, к которому принадлежит поле.
П Precision — содержит максимальную точность данных в поле.
CJ ReiatedCoiumn — для ключевых полей содержит имя связанного поля.
П Sortorder — указывает порядок сортировки в данных для поля.
П туре — содержит тип данных, хранящихся в поле.
206 Глава 5

Объект index содержит следующие свойства.
П clustered — указывает, является ли индекс кластерным.
П indexNuiis — указывает, как обрабатываются значения Null.
П PrimaryKey — указывает, реализует ли данный индекс первичный ключ.
О unique — указывает, должен ли быть уникальным ключ, реализованный
в данном индексе.
И наконец, рассмотрим список свойств объекта Key.
П DeieteRuie — указывает, каким образом обрабатывается удаление запи-
си, содержащей первичный ключ.
П RelatedTable — для внешнего ключа указывает имя связанной таблицы.
О туре - содержит тип ключа.
П updateRuie — указывает, как производится обновление записи, содер-
жащей первичный ключ.

Создание баз данных и их объектов
Первый шаг при создании новой базы данных — создание нового экземп-
ляра объекта Catalog. Это позволяет определить не только тип создаваемой
базы данных (с помощью OLE D В-провайдера), но и местоположение файла
базы данных. В листинге 5.10 показано, как это можно сделать для базы
данных Microsoft Access.



// Описание переменных подключения
ИмяФайла = "C:\demo.mdb";
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.О;Data Source=" +
ИмяФайла;
// Создадим экземпляр объекта ADOX Catalog
Catalog = Новый СОМОбъект("ADOX.Catalog");
// Создадим новый MDB-файл
Catalog.Create(СтрокаПодключения);

В приведенном выше примере создается новая база данных заданного типа в
заранее заданном каталоге. Затем можно добавить в эту базу данные таблиц
и поля. Чтобы сделать это, необходимо:
1. Создать новый экземпляр объекта Table и добавить его в коллекцию Ta-
bles объекта Catalog.
2. Создать новый экземпляр объекта Column и добавить его в коллекцию
Columns объекта Table.
Использование ADO 207

Следующий пример (листинг 5.11) показывает, как можно реализовать эту
последовательность действий.



// 1. Создать новый экземпляр объекта Table
Table = Новый СОМОбъект("ADOX.Table");
// Имя новой таблицы
ИмяТаблицы = "NewTable";
Table.Name = ИмяТаблицы;
// Добавление новой таблицы
Catalog.Tables.Append(Table);

// 2. Создать новый экземпляр объекта Column
// Имя новой колонки
ИмяПоля = "NewColumn";
// Добавление нового поля (3-adInteger)
Catalog.Tables(ИмяТаблицы).Columns.Append(ИмяПоля, 3);

Теперь рассмотрим работу с индексами и ключами. Для того чтобы создать
ключ, используется объект лоох.кеу. Под объектами Key подразумеваются
первичные (Primary key) И внешние (Foreign key) КЛЮЧИ.
Приведем пример созданий внешнего ключа (листинг 5.12).




ForeignKey = Новый СОМОбъект("ADOX.Key");
ForeignKey.Name = "CustOrder";
ForeignKey.Type = 1; // adKeyForeign

// Далее указывается ссылка на связанную таблицу
ForeignKey.RelatedTable = "Customers";
// Определяем имя ключевого поля
ForeignKey.Columns.Append("Customerld");
// Определяем имя поля в связанной таблице
ForeignKey.Columns("Customerld").RelatedColumn = "Customerld"
// Определяем правила контроля за каскадными обновлениями
ForeignKey.UpdateRule = adRICascade;

// Добавляем ключ в коллекцию ключей
Catalog.Tables("NewTable").Keys.Append(ForeignKey);\
208 Глава 5

В данном примере свойство ForeignKey.Type может принимать следующие
значения:
П 1 (adKeyPrimary) — первичный ключ;
П 2 (adKeyForeign) — внешний КЛЮЧ;
П 3 (adKeyUnique) — уникальный КЛЮЧ.
Свойство ForeignKey.updateRule может принимать следующие значения:
П о (adRiNone) — никаких действий каскадно не производится (использует-
ся по умолчанию);
П 1 (adRicascade) — произвести каскадное обновление поля;
О 2 (adRisetNuii) — значение внешнего ключевого поля выставляется в Null;
П з (adRisetDefauit) — значение внешнего ключевого поля выставляется
в значение по умолчанию.
Подобным же образом осуществляется работа с управлением индексами.

^ Примечание
Можно особо отметить следующую особенность — у таблицы есть коллекция
индексов, а уже у каждого индекса есть коллекция полей, входящих в этот ин-
декс. Для простых индексов, состоящих из одного поля, в коллекции колонок
содержится одна колонка, для составных индексов в коллекции колонок индек-
са содержатся колонки, входящие в этот индекс.

Приведем пример добавления к таблице составного индекса, состоящего из
двух полей: Fieldl И Filed2 (ЛИСТИНГ 5.13).

Листинг 5.13. Создание составного индекса

Index = Новый СОМОбъект("ADOX.Index");


// Зададим параметры индекса
Index.Name = "Indexl"
Index.Columns.Append("Fieldl");
Index.Columns.Append("Field2");


// Добавляем индекс в коллекцию
Catalog.Tables("NewTable").Indexes.Append(Index);


Удаление объектов базы данных
Для удаления объектов базы данных используется метод Delete. Приведем
пример удаления индекса, ключа, поля и таблицы (листинг 5.14).
Использование ADO 209




ИмяТаблицы = "NewTable";
// Удаление индекса
Catalog.Tables(ИмяТаблицы).Indexes.Delete(ИмяИндекса);
// Удаление ключа
Catalog.Tables(ИмяТаблицы).Keys.Delete(ИмяКлюча);
// Удаление поля
Catalog.Tables(ИмяТаблицы).Columns.Delete(ИмяПоля);
// Удаление таблицы
Попытка
Catalog.Tables.Delete(ИмяТаблицы);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;


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


Доступ к данным Microsoft Excel
через OLE DB
Достаточно часто требуется сформировать отчет и вывести его не только на
печать, но и выгрузить в таблицу Microsoft Excel. Также иногда возникает
необходимость импортировать данные Excel в систему "1С:Предприятие".
Этого можно добиться двумя способами, либо используя технологию OLE
Automation, описание и примеры использования которой рассматривались
в главе 4, либо через объекты ADO.
Использование технологии ADO, при работе с таблицами Microsoft Excel,
практически ничем не отличается от доступа к другим источникам данных.
Для подключения к Excel можно использовать код:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\file.xls;
Extended Properties="Excel 8.0;HDR=NO;".
210 Глава 5

Параметр HDR здесь обозначает наличие заголовка в первой строке таблицы,
причем YES — определяет присутствует заголовока; NO — нет.
Для выгрузки данных в таблицы Microsoft Excel необходимо создать файл
с расширением XLS. Это можно сделать вручную, либо программно с по-
мощью технологии ADOX. Рассмотрим пример создания файла Microsoft
Excel через объекты ADOX (листинг 5.15).

ние MS Excel файла средствами ADOX

// Определение имени файла и строки соединения
ИмяФайла = "C:\ExcelDemoFile.xls";
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source»
ИмяФайла + " Extended Properties=""Excel 8.0;HDR=NO; '
; ;

// Начальная инициализация
Catalog = Новый СОМОбъект("ADOX.Catalog");
Catalog.ActiveConnection = СтрокаПодключения;

// Создание новой таблицы
Table = Новый СОМОбъект("ADOX.Table");
// Имя таблицы
Table.Name = "TestTable";

Для Ном = 1 По 5 Цикл
// Создание новой колонки
Column = Новый СОМОбъект("ADOX.Column");
// Имя колонки
Column.Name = "Col" + Ном;
// Тип данных колонки
Если Ном = 2 Тогда
Column.Туре = 202; // adVarWChar
Иначе
Column.Type =5; // adDouble
КонецЕсли;

// Присоединение колонки к таблице
Table.Columns.Append(Column);
Column = Неопределено;
КонецЦикла;

// Присоединение созданной таблицы (листа) к книге Excel
Catalog.Tables.Append(Table);
211
Использование ADO

В данном примере создается файл C:\ExcelDemoFile.xls, в который добавля-
ется лист с именем TestTabie и инициализируются пять колонок. Свойство
Туре объекта column определяет тип колонки. Для источника данных
Microsoft Excel это свойство может принимать всего шесть значений, опи-
санных в табл. 5.3.

Таблица 5.3. Допустимые значения свойства туре объекта Column для MS Excel

Константа ADO Значение Описание
adDouble 5 Значение с плавающей точкой двойной точности
adDate 7 Дата
adCurrency 6 Денежная сумма (8-байтовое целое со знаком,
кратное 1 0 000)
adBoolean 11 Булево значение
adVarWChar 202 Символьная строка Unicode, заканчивающаяся
СИМВОЛОМ Null
adLongVarWChar 203 Длинное строковое значение


После того как файл Excel создан, можно выполнять действия по добавле-
нию данных в какой-либо лист книги Excel. Данные действия можно вы-
полнять двумя способами, либо через метод AddNew объекта Recordset (лис-
тинг 5.16), либо через SQL-запросы, используя конструкцию INSERT
(листинг 5.17).
...
Листинг 5.16. Запись данных в лист MS

// Создание соединения ADO для работы с книгой Excel
ConnectionExcel = Новый СОМОбъект("ADODB.Connection");
ConnectionExcel.Open(СтрокаПодключения);


// Создание объекта набора записей
RecordsetExcel = Новый СОМОбъект("ADODB.Recordset");
RecordsetExcel.Open("Select * from TestTabie", ConnectionExcel, 1, 3)


Для Ном = 1 По 10 Цикл
// Добавление новой записи
RecordsetExcel.AddNew();
RecordsetExcel.Fields(0).Value = 11;
RecordsetExcel.Fields(1).Value = "Строка №" + Ном;
212 Глава 5
RecordsetExcel.Fields(2).Value = 2.30;
RecordsetExcel.Fields(3).Value = Ном;
RecordsetExcel.Fields(4).Value = Ном * 2.2;


// Обновление изменений в книге Excel
RecordsetExcel.UpDate();
КонецЦикла;


// Закрываем соединение
ConnectionExcel.Close();
ConnectionExcel = Неопределено;


В данном примере метод AddNew добавляет очередную строку в лист Excel.
Важно отметить, что в один лист невозможно добавить более 65 000 строк —
это ограничение приложения Microsoft Excel. Еще одна важная особенность
добавления информации в ячейки листа заключается в том, что Excel
не поддерживает автопреобразование типов значений ячеек. То есть, если
с помощью свойства туре объекта Column для колонки соответствующей
ячейки был определен числовой тип, то при попытке записать в эту ячейку
строку — возникнет ошибка. Так же нельзя использовать для записи колонки,
которые не были созданы, т. е. если было создано всего пять колонок, то
можно записывать информацию только в первые пять колонок, хотя при
открытии таблицы в приложении Microsoft Excel пользователю будут видны
большое количество колонок.
Рассмотрим пример добавления записей, используя SQL-запросы (листинг 5.17).
, --—, _ _ _ _ „ .
1нг 5.17. Запись данных в лист MS Excel через SQL-запросы

// Создание объекта установки связи с источником данных
Connection = Новый СОМОбъект("ADODB.Connection");


// Подключение к источнику данных
Попытка
Connection.Open(СтрокаПодключения);
Исключение

<<

стр. 6
(всего 10)

СОДЕРЖАНИЕ

>>