Загрузить архив: | |
Файл: ref-31901.zip (120kb [zip], Скачиваний: 1) скачать |
МИНИСТЕРСТВО ТРУДА И СОЦИАЛЬНОГО РАЗВИТИЯ РФ Российский Государственный Социальный Университет филиал в г. Сочи Кафедра экономики и АСУ Курсовая работа Технология баз данных ADO в Delphi по дисциплине: «Объектно-ориентированное программирование» Выполнил: Студент 4-го курса гр. 07АСУ Школьников Илья Проверила: к. т.н., доцент Салова Т.Л. г. Сочи 2011 Оглавление Введение 3 Глава 1. Особенности использования компонентов ADO 6 1.1. Базовые компоненты ADO 6 1.2. Компоненты Delphi для поддержки ADO 9 1.3. Установление связи с компонентом ADO. 12 1.4. Связной компонент TADOConnection 19 1.5. Компонент TADOCommand 24 1.6. Компонент TADOQuery 30 Глава 2. Структура и состав электронного учебника 31 2.1. Описание электронного учебника 31 2.3. Код электронного учебника 32 2.3. Сборник задач 40 Заключение 41 Список использованной литературы 42 Введение Начиная с середины 80-х программисты баз данных искали пути к независимости от технологий баз данных. Идея в том, чтобы использовать для доступа к различным источникам данных единый API, что освободило бы разработчиков от зависимости от конкретного процессора баз данных и дало бы возможность быстро приспосабливаться к изменению требований. Поставщики программного обеспечения разработали несколько решений этой проблемы, два наиболее значимых — открытая спецификация доступа к базам данных фирмы Microsoft, Open Database Connectivity (ODBC) и независимый прикладной программный интерфейс фирмы Borland, Independent Database Application Programming Interface (IDAPI), более известный как процессор баз данных Borland, Borland Database Engine (BDE). Технология ADO во многом похожа на BDE. В конце концов, они обе проектировались для решения схожих проблем. Обе технологии поддерживают навигацию по наборам данных, оперирование с наборами данных, обработку транзакций и кэшированные обновления (в ADO они называются пакетными обновлениями), так что концепции и способы работы с ADO весьма похожи на работу с BDE. Несмотря на это, существуют и отличия. ADO — более новая технология, благодаря чему она лучше, чем BDE, отвечает требованиям сегодняшнего дня и не несет с собой множество устаревших обременений. Самое существенное, возможно, то, что ADO более широко интерпретирует понятие «данные». BDE работает только с «прямоугольными» данными, то есть данными, представленными в виде строк и столбцов, что идеально при работе с базами данных. При помощи ADO мы также можем обращаться к таким данным, но, кроме того, существует возможность работы и с непрямоугольными данными, такими как представляющие каталоги структуры, документы, web-узлы и электронная почта. ADO входит в более общее понятие — компоненты доступа к данным Microsoft, Microsoft Data Access Components (MDAC). MDAC объемлет технологии Microsoft доступа к базам данных и включает в себя ADO, OLE DB, ODBC и RDS (Remote Data Services, службы удаленных данных). Зачастую при использовании терминов MDAC и ADO имеют в виду одно и то же (что неверно), так как их номера версий и выпусков в настоящий момент соответствуют друг другу. Поскольку ADO поставляется в составе MDAC, мы будем говорить о выпусках MDAC. Основные выпуски MDAC представлены версиями 1.5,2.0, 2.1, 2.5 и 2.6. Microsoft выпускает MDAC независимо от других продуктов и предоставляет открытый доступ для их загрузки через Интернет и разрешает практически свободное распространение (требования к распространению существуют, но подавляющему большинству Delphi-разработчиков не стоит беспокоиться на этот счет). MDAC также поставляются с большинством продуктов Microsoft, имеющим отношение к базам данных: Windows 98, Windows 2000, Windows Millennium Edition, Такое положение дел приводит к тому, что, во-первых, скорее всего на компьютерах ваших пользователей уже будут установлены компоненты MDAC, во-вторых, независимо от того, какая версия MDAC установлена у ваших пользователей, или до какой версии вы обновили их MDAC, практически, наверное, вы, ваши пользователи или другое прикладное программное обеспечение обновит свои компоненты MDAC до текущего выпуска. Вы не в силах этому воспрепятствовать, поскольку MDAC устанавливаются с такой распространенной программой, как Internet Explorer. Добавьте сюда, что Microsoft поддерживает только текущий и предшествующий ему выпуски MDAC, и вы со всей очевидностью придете к заключению, что ваше приложение должно работать с текущим или предшествующим ему выпуском MDAC. Если начертить график выпусков MDAC, можно увидеть, что новая версия MDAC появляется в среднем каждые 10 месяцев (новый выпуск самой Delphi появляется в среднем каждые 14 месяцев). Как работающий с ADO программист, я регулярно заходжу на страницы MDAC web-узла Microsoft www.microsoft.com/data, откуда можно бесплатно загрузить последнюю версию MDAC. На время написания курсовой работы это версия MDAC 2.6, доступная по адресу www.microsoft.com/data/download_260rtm.htm (5.2 Мбайт), однако сначала следует проверить наличие более свежих версий. Также с этого сайта вы можете загрузить MDAC SDK (13 Мбайт), если вы этого еще не сделали, или Platform SDK (MDAC SDK входит в Platform SDK). MDAC SDK - это ваша библия. Загрузите ее, регулярно изучайте и работайте с ней, чтобы получить ответы на вопросы, касающиеся ADO. Именно сюда следует в первую очередь обращаться за информацией по поводу MDAC. Кроме того, лучше прочитать поставляющиеся вместе с MDAC файлы README, — это все файлы в каталоге Program FilesCommon FilesSystemADO, заканчивающиеся на README.TXT. Наконец, чтобы использовать ADO в Delphi-приложениях, отслеживайте обновления dbGo/ADOExpress/ADO на превосходном узле сообщества Borland (http://community.borland.com), где регулярно выходят неофициальные заплатки, зачастую обязательные в использовании. Например, существует изумительная заплатка к проблеме, возникающей при использовании MDAC-2.6 вместе с библиотекой ADOExpress Delphi 5. Глава 1. Особенности использования компонентов ADO 1.1. Базовые компоненты ADO Базовых объектов семь: Connection, Recordset, Command, Parameter, Field, Error и Property. Компоненты ADO в палитре компонентов Delphi представляют собой надстройки над базовыми объектами, экспонируя большинство их свойств, методов и событий в привычном для Delphi виде. Базовые объекты обычно сопровождаются коллекциями связанных с ними объекты. Например, с Connection может быть связан один или несколько объектов Еrror, фиксирующих ошибки установления связи. С Recordset - набор объектов Field, каждый из которых определяет единственное поле результирующего набора данных. С Command - один или несколько объектов Parameter, конкретизирующих выполнение метода Execute этого объекта, и коллекция объектов Error и т.д. В связи с этим говорят об основных (Connection, Recordset, Command) и вспомогательных (Error, Field, Parameter, Property) объектах ADO. Connection Объект Connection предназначен для установления соединения с данными - это его главная задача. Кроме того, объект обеспечивает механизм транзакций. С объектом связан набор объектов Error, в котором фиксируются все ошибки, связанные с работой Connection. Кроме того, на него может ссылаться произвольное количество объектов Command и Recordset. В этом случае Connection управляет транзакциями этих объектов. Recordset Объект Recordset представляет собой текущий набор данных. Он может быть получен только после выполнения метода Execute какого-либо объекта Command. С объектом автоматически связывается набор объектов Field, в которых описываются все поля НД. Recordset способен хранить нужные записи, перемещаться по ним, добавлять, уничтожать и редактировать записи как в обычном режиме (при одновременном изменении физических ТБД), так и в пакетном режиме (т.е. при кэшировании данных). При создании объекта автоматически создается и связанный с ним курсор, обеспечивающий просмотр, редактирование и изменение записей. Command С помощью объекта Command пользователь может выполнить над данными любую SQL-команду. С ним может быть связан набор объектов Parameter, в котором описываются соответствующие параметры, необходимые для выполнения запроса. Характерной особенностью объекта является возможность асинхронного выполнения связанной с ним команды. При обнаружении ошибки с объектом связывается своя коллекция объектов Error. На заметку. Объекту Commands соответствуют целых четыре компонента Delphi - TADOCommand, TADOQuery TADOTable и TADOStoredProc. Сделано это, судя по всему, в целях унификации с компонентами страницы Data Access, хотя даже в этом случае возможности TADOCommand нельзя считать уникальными по сравнению с возможностями TADOQuery и наоборот. Parameter Объект Parameter определяет единственный параметр, который будет использоваться при выполнении метода Execute объекта Command - его тип, размер и использование (входной, выходной, входной и выходной или только для чтения). При необходимости с Command можно связать коллекцию объектов Parameter для указания множества параметров. Error Коллекция объектов Error хранит все ошибки, связанные с работой остальных объектов и, прежде всего, Connection, Command и Recordset. Field Этот объект хранит всю необходимую информацию об одном поле НД. Поскольку обычно НД содержит несколько полей, с объектом Recordset связана коллекция объектов Field. С любым полем Field можно связать произвольную коллекцию объектов Property, определяющих индивидуальные характеристики поля. Property Объект Property может быть связан с любым другим объектом ADO, кроме объектов Connection и Error. Он может хранить как статические, так и динамические свойства. Статических (т.е. заранее заданных) свойств у объекта всего четыре: Name, Type, Value, Attributes. Остальные свойства - динамически и создаются в ходе выполнения программы. В объекте Property задаются некоторые индивидуальные характеристики связанного с ним объекта ADO. 1.2. Компоненты Delphi для поддержки ADO На основе технологии ADO в Delphi созданы соответствующие компоненты-наборы TADOTable, TADOQuery, TADOStoredProc , повторяющие в функциональном отношении компоненты TTable, TQuery, TstoredProc, но не требующие развертывания и настройки на клиентской машине BDE. Основным достоинством ADO является ее естественная ориентация на создание «облегченного» клиента. На машине сервера данных (это может быть файловый сервер в рамках файл/серверной технологии или машина с сервером данных - в технологии клиент/сервер) устанавливается так называемый провайдер данных - некоторая надстройка над специальной технологией OLE DB, «понимающая» запросы объектов ADO и «умеющая» переводить эти запросы в нужные действия с данными. Взаимодействие компонентов ADO и провайдера осуществляется на основе универсальной для Windows технологии ActiveX, причем провайдер реализуется как СОМ-сервер, а ADO-компоненты - как COM-клиенты. На машине сервера создается и размещается источник данных. В случае файл/серверных систем отдельные таблицы типа dBASE, FoxPro, Paradox и т.п. должны управляться соответствующим ODBC-драйвером,а в роли провайдера используется Microsoft OLE DB Provider for ODBC drivers. Если по каким-либо причинам не найден нужный драйвер файл/серверные таблицы можно перенести в формат MS Access. На их основе создается единый файл, содержащий все необходимые таблицы, индексы, хранимые процедуры и прочие элементы БД. Такой файл управляется машиной баз данных Microsoft Jet 4.0 Database Engine, а в роли провайдера используется Microsoft Jet 4.0 OLE DB Provider. Если используется промышленный сервер данных Oracle или MS SQL Server, данные не нуждаются в какой-либо предварительной подготовке, а в роли провайдера используется соответственно Microsoft OLE DB Provider for Oracle или Microsoft OLE DB Provider for SQL Server. Нетрудно обнаружить и явный недостаток такой технологии: ADO не может использоваться, если для соответствующей структуры данных (в частности, для БД многих популярных серверов - InterBase, Informix, DB2 и пр. не создан нужный провайдер или ODBC драйвер (однако уже существует ODBC драйвер для InterBase – прим. ред.)). Схема связи с объектом ADO в Delphi На машине клиента располагаются связные компоненты TADOConnection и компоненты-наборы данных TADOTable, TADOQuery, TADOStoredProc, а также не показанные на рисунке компоненты-наборы TADODataSet и командные компоненты TADOCommand. Каждый из этих компонентов может связываться с провайдером данных либо с помощью связного компонента TADOConnection, либо минуя его и используя собственное свойство ConnectionString. Таким образом, TADOConnection играет роль концентратора соединений с источником данных компонентов-наборов и в этом смысле подобен компоненту TDatabase в традиционной архитектуре с BDE.Компоненты-наборы TADODataSet в функциональном плане повторяют свойства уже известных из предыдущих версий Delphi компонентов TClientDataSet технологии MIDAS. Командные компоненты TADOCommand предназначены для реализации запросов на языке управления данными DDL (Data Definition Language), т.е. для реализации SQL-запросов, которые не возвращают данные (запросы типа CREATE, DROP, UPDATE и т.п.). Специальный компонент RDSConnection (не показан на рисунке) создан для упрощения связи с MS Internet Explorer и предназначен для разработки интранет-приложений. Компоненты-наборы с помощью хорошо известных по предыдущим версиям Delphi компонентов-источников TDataSource и визуализирующих компонентов TDBGrid, TDBMemo, TDBEdit и т.п. обеспечивают необходимый интерфейс с пользователем программы. Замечание. Ничто не дается бесплатно - эта старая истина во многом относится и к ADO. Скорость доступа к данным с помощью СОМ-средств (а технология ActiveX, являющаяся краеугольным камнем ADO, целиком базируется на СОМ) в общем случае оказывается заметно ниже традиционного для Delphi механизма на основе BDE (для некоторых типичных случаев скорость уменьшается в десятки раз). 1.3. Установление связи с компонентом ADO. Установление связи с объектом ADO является ключевым моментом всей технологии. Как уже отмечалось, каждый компонент НД имеет два свойства, с помощью которых он может установить связь с объектом ADO Connection и ConnectionString. В первое помещается ссылка на специальный связной компонент TAdoConnection, играющий роль концентратора соединения с объектом ADO, во вторую — собственно строка связи. Эти свойства взаимоисключающие, то есть установка значения в одно из них ведет к очистке второго. Структура строки связи Создаваемая тем или иным способом строка связи несет в себе множество (не менее двух) параметров, отделенных друг от друга точкой с запятой. Собственно в технологии ADO используются лишь четыре из них, остальные нужны для идентификации пользователя при доступе к серверным БД и для настройки некоторых параметров ODBC-драйверов. Формирование строки связи При щелчке на кнопке с многоточием в строке свойства ConnectionString компонента TAdoConnection или компонентов-наборов появляется окно, показанное на рис.1. Рис.1. Диалоговое окно для формирования соединения с объектом ADO У программиста есть две возможности: сослаться на специальный связной файл в первой строке или сформировать описание связи во второй. В первом случае можно использовать один и тот же файл сразу для нескольких соединений, поэтому изменение файла отразится на многочисленных связях, причем, возможно, не в одной программе. Изменение содержимого во второй строке окна влияет только на соответствующий компонент-набор или только на те компоненты, которые будут ссылаться на данный связной компонент и только внутри одной программы. Установка переключателя Use Data Link File делает доступной кнопку Browse, щелчок на которой открывает окно, показанное на рис.2. Рис.2.Окно выбора связного файла Установка переключателя Use Connection String позволяете помощью кнопки Build воспользоваться специальным диалоговым окном. Вначале рассмотрим диалоговый способ формирования связи. Диалоговый способ формирования связи Для диалогового способа формирования связи установите переключатель Use Connection String и щелкните на кнопке Build. На экране появится диалоговое окно с четырьмя вкладками. Вкладка Поставщик данных (см. рис.3) используется для выбора механизма, который будет непосредственно взаимодействовать с данными, получая их от клиента и посылая их ему. Рис.3. Настройка связи: выбор провайдера Фактически в списке этой вкладки отображается состав провайдеров OLE DB, установленных на вашей машине. Выбор провайдера является определяющим фактором. Для разных типов данных должны использоваться только строго определенные провайдеры. Например, в файл-серверных БД должен использоваться провайдер Microsoft OLE DB Provider for ODBC driver с предварительной настройкой соответствующего драйвера. Для работы с БД Access выбирается провайдер MicrosoftJet 4.0 OLE DB Provider. Если используется сервер Oracle или MS SQL Server, БД работает совместно соответственно с провайдером Microsoft OLE DB Provider for Oracle или Microsoft OLE DB Provider for SQL Server и т. д. Некоторые типы данных (например, БД InterBase , Informix SQL Server) не имеют провайдеров и поэтому (пока на будут созданы нужные провайдеры) не могут использоваться в технологии ADO. Поскольку большинство других связных параметров зависит от провайдера, содержимое трех других вкладок также зависит от этого фактора. В этом разделе описывается содержимое вкладок при выборе провайдера MicrosoftJet 4.0 OLE DB Provider. Вкладка Подключение определяет необходимые связные параметры для выбранного провайдера (рис.4 ), Рис.4. Вкладка Подключение окна настройки связи с провайдером Microsoft Jet 4.0 DB Provider В строке Выберите или введите имя базы данных требуется указать полный путь доступа к файлу БД (с указанием сетевого каталога). В качестве дополнительной информации на этой вкладке указывается входное имя пользователя и пароль. Для простейшего варианта связи с MicrosoftJet 4.0 OLE DB Provider этих параметров вполне достаточно, поэтому с помощью кнопки Проверить подключение можно протестировать созданную связь. Для других провайдеров может потребоваться задать ряд дополнительных параметров, например имя используемой базы данных, входное имя и пароль для доступа к серверу БД и т. п. Вкладка Дополнительно позволяет задать некоторые дополнительные свойства связи (рис.5). Рис.5. Вкладка Дополнительно окна настройки связи с провайдером Microsoft Jet 4.0 OLE DB Provider Для большей части провайдеров на этой вкладке доступны только флажки Права доступа, определяющие права доступа к данным, и строка Время ожидания подключения, с помощью которой можно определить максимальную паузу в обмене данными между провайдером и клиентом. С помощью флажков можно задать любую комбинацию режимов доступа: Read—только чтение; ReadWrite — чтение и запись; Share Deny None — режим совместной работы невозможен; Share Deny Read — нельзя совместно использовать данные, открытые в режиме чтения; Share Deny Write — нельзя совместно использовать данные, открытые в режиме записи; Share Exclusive — нельзя совместно использовать данные, открытые в режиме чтения и/или записи; Write – только запись На вкладке Все приводятся все параметры связи — как заданные явно, так и назначенные по умолчанию (рис.6). Щелкнувнакнопке Измеиитьзначение, можно отредактировать значение любого параметра. Рис.6. Вкладка Все окна настройки связи с провайдером Microsoft Jet 4.0 OLE DB Provider После щелчка на кнопке OK диалоговое окно формирования параметров связи будет закрыто и в нижней строке окна формирования соединения с объектом ADO появится соответствующий текст. Формирование связного файла Создать и отредактировать связной файл можно с помощью Проводника Windows 98 (в нерусифицированной версии — Windows Explorer). Вызовите Проводник, выберите папку, в которой будет размещаться связной файл, щелкните на содержимом папки правой кнопкой мыши и в подменю Создать контекстного меню выберите команду Microsoft Data Link. Именно этого выбора не предоставляет Windows 2000/XP (вместо этого можно просто создать новый файл и дать ему расширение UDL). После того как файл создан, просто дважды щелкните на нем: по умолчанию связные файлы имеют расширение .UDL, с которым связано диалоговое окно создания и редактирования связи, показанное на рис.3 (вместо двойного щелчка можно выбрать в контекстном меню команду Свойства). Примечание. Поскольку ADO активно использует технологию ActiveX, обмен текстовыми данными с такого рода объектами возможен только в формате WideString (пo два байта на каждый символ) — именно в таком формате и будет создан связной файл. 1.4. Связной компонент TADOConnection Этот компонент осуществляет связь остальных компонентов с ADO. Для этих целей у него имеется строка ConnectionString. После того, как с помощью этой строки связь с данными установлена, на компонент могут ссылаться другие ADO-компоненты, разделяя установленную им связь. Однако компонент TADOConnection может выполнять гораздо более широкую роль, чем простая концентрация соединения. С помощью своих свойств и методов он может осуществлять тонкую настройку соединения, обеспечивать необходимый уровень изоляции транзакций, управлять транзакциями и т.д. Для установления связи нужно с помощью строки ConnectionString сформировать связные параметры и затем установить значение True в свойство Active или вызвать метод Open . Для разрыва связи выполняется метод Close компонента или в его свойство Active устанавливается значение False . Компонент содержит в свойстве ConnectionObject ссылку на базовый ADO-объект, с помощью которого и работает сам компонент. Это свойство открывает возможности детального управления связью, если, разумеется, программист хорошо знаком с техникой ADO . В свойствах CommandCount и DataSetCount содержится количество соответствующих объектов, которые обслуживаются данным компонентом. В сочетании со свойствами Commands и DataSets программист может получить доступ к любому интересующему его объекту. Например: var i: Integer; begin for i := 0 to (ADOConnectionl.DataSetCount) do ADOConnectionl.DataSets[i].Open; end; С помощью методов GetProcedureNames и GetTableNames можно получить список всех хранимых процедур и таблиц. Например: AdoConnectionl.Open; AdoConnectionl.GetTableNames(ListBoxl.Items) Важной особенностью компонента является возможность управления с его помощью транзакциями. Для этого в состав компонента добавлены соответствующие методы и события. С помощью метода BeginTrans стартует новая транзакция, методы CommitTrans и RollbackTrans подтверждают или отменяют ее действие. Разрешается произвольная глубина вложенности транзакций, т.е. после старта одной транзакции может немедленно стартовать следующая и т.д. Уровни разграничения транзакций (свойство IsolationLevel ) несколько отличаются от аналогичных уровней BDE и в некоторых случаях могут не поддерживаться сервером БД. Транзакция, стартующая с помощью компонента TADOConnection , разделяется всеми другими связанными с ним компонентами. С помощью свойства InTransaction программа может определить, завершилась ли ранее начатая транзакция. Основные свойства Свойства Назначение property CommandCount: Integer; Указывает количество командных компонентов, которые ссылаются на него property Commands [Index: Integer]: TADOCommand Открывает индексированный доступ к командным компонентам. property Connected: Boolean; Определяет, связан ли компонент с набором данных. property ConnectionObject: Connection; Содержит ссылку на компонент TADOConnection. property ConnectionString: Wide- String; Содержит связную строку. property ConnectOptions: TConnectOption; Указывает, будет ли связь синхронной (coConnectUnspecified) или асинхронной (coAsyncConnect) property DataSetCount: Integer; количество связанных наборов данных. property DataSets[Index: Integer]: TCustomADODataSet; Открывает индексированный доступ к компонентам-наборам. property Errors: Errors; Содержит коллекцию ошибок, выявленных при работе компонента. property InTransaction: Boolean; Содержит True, если компонент поддерживает хотя бы одну еще незавершенную транзакцию. Основные методы Метод Назначение function BeginTrans: Integer; Инициирует новую транзакцию в связанной БД. Возвращает уровень вложенности вновь начатой транзакции (1, 2 и т.д.). procedure Cancel; Разрывает установленную ранее асинхронную связь. procedure CloseDataSets (All: Boolean = True) ; Закрывает набор данных, с которым установлена связь, но не разрывает связь с БД, Если All имеет значение True, закрываются все НД, в противном случае не закрываются только те из них, для которых на клиентской стороне созданы курсоры. procedure CommitTrans; Подтверждает текущую транзакцию и закрывает ее. procedure GetProcedureNames (List: TStrings) ; В переменной List возвращает список всех зарегистрированных в БД хранимых процедур. procedure GetTableNames (List : TStrings; SystemTables: Boolean = False) ; В переменной List возвращает список всех ТБД. Если SystemTables имеет значение True, в список включаются также служебные таблицы. procedure RollbackTrans; Отменяет текущую транзакцию. Основные события Событие С чем связано property AfterConnect: TNotifyEvent; Возникает после установки связи. property AfterDisconnect: TNotifyEvent; Возникает после разрыва связи. property BeforeConnect: TNotifyEvent; Возникает перед установлением связи. Property BeforeDisconnect: TnotifyEvent; Возникает перед разрывом связи. TExecuteCompleteEvent = procedure (Connection: TADOConnection; RecordsAffected: Integer; const Error: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset) of object; property OnExecuteComplete: TExecuteCompleteEvent read FOnExecuteComplete write FOnExecuteComplete; Возникает после выполнения команды. 1.5. Компонент TADOCommand Этот компонент предназначен, в основном, для реализации SQL-запросов, не возвращающих никаких данных (подмножество Data Definition Language - язык определения данных языка структурированных запросов SQL). К предложениям DDL относятся практически все, которые не начинаются зарезервированным словом select. Замечание. Хотя конкретная реализация транслятора SQL зависит от выбранного провайдера, однако в целом компоненты ADO при реализации этого языка следуют промышленному стандарту SQL-92. Исполнение подобного рода запросов идет несколько иначе, чем запросов select. В BDE-ориентированных компонентах TQuery для реализации запросов select используется метод Open (или свойство Active), в то время как DDL запросы выполняются методом ExecSQL. В ADO для этих целей выделен специальный компонент. Хотя, как мы увидим дальше, он способен при некоторых обстоятельствах возвращать наборы данных, а компонент TADOQuery имеет в своем составе метод ExecSQL, позволяющий ему выполнять DDL запросы. Иными словами, одни и те же запросы в рамках ADO можно выполнять с помощью двух разных компонентов - как TADOCommand, так и TADOQuery. Замечание. На самом деле - даже трех: рассмотренный выше связной компонент TAdoConnection также способен выполнять команду. Например: procedure TForml.ButtonlClick(Sender: TObject); begin AdoConnectionl.ConnectionString := ‘Provider=Microsoft.Jet.OLEDB.4.0;'+ 'Data Source=C:DATAdbdemos.mdb’; AdoConnectionl.Connected := True; AdoDataSetl.RecordSet := AdoConnectionl.Execute ('SELECT * FROM CUSTOMER’) end; Текст исполняемой команды хранится в свойстве CommandText компонента. Компонент способен за один раз исполнять одну и только одну команду. Особенностью TADOCommand является специализированный текстовый редактор, с помощью которого можно сформировать команду. Этот редактор (рис.1) вызывается после щелчка по кнопке в строке свойства CommandText Инспектора Объектов. Все поле редактора поделено на три части. В левой верхней части отображается список таблиц БД, с которой связан компонент, в нижней левой - список полей для выделенной таблицы, всю остальную часть занимает собственно текстовый редактор. Справочные окна в левой части лишь облегчают набор текста, который, в основном, формируется вручную в правом поле. Например, чтобы набрать указанное на рисунке предложение, необходимо вручную ввести слово update, затем щелкнуть по строке customer и нажать кнопку Add Table to SQL, затем вновь вручную ввести SET, щелкнуть по Company, нажать Add Field to SQL и т.д. Как уже говорилось, компонент TADOCommand способен возвращать записи. Для этого в него включены целых три реализации метода Execute, два из которых как раз и предназначены для создания наборов записей. Использование возвращаемого НД возможно с помощью компонента-посредника TADODataSet по следующей схеме: AdoDataSetl.RecordSet := AdoCommandl.Execute; Для создания НД множество ExecuteOptions не должно содержать eoExecuteNo-Records. Рис.1. Редактор команды компонента TADOCommand Свойства Свойство Назначение property CommandObject: _Command; Содержит ссылку на базовый командный объект ADO. property CommandText: WideString; Содержит текст исполняемой команды. property CommandTimeout: integer; Определяет предельное время выполнения команды (в секундах). Умалчиваемое значение равно 30. type TCommandType = (cmdUnknown, cmdText, cmdTable, cmdS toredProc, cmdFile, cmdTableDirect); property CommandType: TCommandType; Определяет тип исполняемой команды: cmdUnknown - неизвестный тип; cmdText-команда представляет собой текст или имя исполняемой процедуры; cmdTable - команда есть имя таблицы; cmdStoredProc - команда есть имя хранимой процедуры; cmdFile - команда есть имя файла, откуда берется набор данных; cmdTableDirect- команда возвращает все содержимое таблицы. property Connection: TADQConnection; Содержит ссылку на связной компонент. property ConnectionString: WideString; Содержит связную строку. Type TExecuteOption = (eoAsync-Execute, eoAsyncFetch, eoAsyncFetch- NonBlocking, eoExecuteNoRecords); TExecuteOptions = set of TExecuteOption; property Execute-Options: TExecuteOptions; Уточняет способ выполнения команды: eoAsyncExecute - выполняется асинхронно; eoAsyncFetch - выполняется асинхронно после наполнения кэша; eoAsyncFetchNonBlocking выполнение происходит без блокирования потока; eoExecuteNoRecords – команда отвергает любые возвращаемые данные. property ParamCheck: Boolean; Содержит True, если список параметров команды должен обновляться при любом изменении текста команды. Property Parameters: TParameters; Открывает доступ к параметрам команды. Property Prepared: WordBool; Если содержит True, исполнение команды предварительно готовится. Property Properties: Properties; Используется для непосредственного доступа к свойствам базового командного ADO-объекта. type TObjectState = (stClosed, stOpen, stConnecting, stExecuting, stretching); TObjectStates = set of TObjectState; property States: TObjectStates; Указывает текущее состояние компонента: stClosed - компонент закрыт и не связан с данными; stOpen - компонент открыт, но не выполняет команду; stConnecting компонент связан с набором данных; stExecuting - компонент выполняет команду; stFetching - компонент наполняет набор данных. Методы Метод Назначение procedure Assign(Source: TPersistent); override; Копирует основные свойства компонента Source в свойства текущего компонента. Копируются; Connection; CommandText; CommandTimeout; CommandType; Prepared; Parameters. Procedure Cancel; Прекращает выполнение асинхронной команды. TExecuteOption = (eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlock-ing, eoExecuteNoRecords) ; TExecuteOptions = set of TExecuteOption; function Execute: _RecordSet; overload; function Execute(const Parameters: OleVariant) : JRecordset; overload function Execute(var RecordsAffected Integer; var Parameters: OleVariant; ExecuteOptions: TExecuteOptions = []): RecordSet; overload; Выполняет команду. _RecordSet - возвращаемый набор записей, если команда создает этот набор; Parameters - набор параметров, необходимых для выполнения команды; RecordsAffected - содержит количество возвращенных записей; ExecuteOptions - уточняющие параметры: eoAsyncExecute - команда выполняется асинхронно; eoAsyncFetch - после заполнения кэша оставшиеся записи формируются асинхронно; eoAsyncFetchNonBlocking - команда выполняется без блокирования потока; eoExecuteNoRecords - команда не должна возвращать записи. 1.6. Компонент TADOQuery В отличие от TADOCommand, этот компонент преимущественно предназначен для получения набора записей из одной или нескольких таблиц БД. На самом деле, фактически он целиком повторяет функциональность компонента TQuery, т.к. в него включен специфичный метод ExecSQL, с помощью которого компонент может выполнять предложения DDL языка SQL. Сам запрос формируется в многострочном свойстве SQL Единственным отличием от BDE-аналога является свойство property RowsAffected: Integer; с помощью которого программист может узнать или указать максимальное количество обновлений, которое сделано (или разрешается сделать) при выполнении запроса. Также как TQuery, TADOQuery имеет свойство DataSource, позволяющее передать параметры запроса от одного компонента другому. Остальные свойства, методы и события унаследованы компонентом от TCustomADODataSet и TDataSet. Глава 2. Структура и состав электронного учебника 2.1. Описание электронного учебника В главном окне программы по краям располагаются три кнопки. Левая кнопка вызывает окно с теоретическими сведениями, правая показывает список задач для самостоятельного решения, вниз открывается окно с описанием компонентов и языка SQL с примерами использования. Также в нижнем окне можно сразу посмотреть как работает запрос, введя его в поле Memo и нажав соответствующую кнопку, результат выполнения запроса можно наблюдать в таблице. В любой момент можно переключиться на другое окно для получения теоретических сведений или для выполения задачи самостоятельно 2.3. Код электронного учебника unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, XPMan, ComCtrls, DB, ADODB, Grids, DBGrids, ToolWin, jpeg; type TMainForm = class(TForm) Label1: TLabel; Label2: TLabel; Panel1: TPanel; RightBtn: TButton; Timer1: TTimer; Panel2: TPanel; LeftBtn: TButton; BottomBtn: TButton; XPManifest1: TXPManifest; Panel3: TPanel; Panel4: TPanel; Label3: TLabel; Memo1: TMemo; LeftRetBtn: TButton; Label4: TLabel; Memo2: TMemo; RightRetBtn: TButton; Label5: TLabel; TopRetBtn: TButton; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Memo3: TMemo; DBGrid1: TDBGrid; ADOConnection1: TADOConnection; DataSource1: TDataSource; ADOTable1: TADOTable; TabControl1: TTabControl; Panel5: TPanel; ADOCommand1: TADOCommand; Memo4: TMemo; Label10: TLabel; Button1: TButton; ADOQuery1: TADOQuery; Button2: TButton; Image1: TImage; procedure RightBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure LeftBtnClick(Sender: TObject); procedure BottomBtnClick(Sender: TObject); procedure LeftRetBtnClick(Sender: TObject); procedure RightRetBtnClick(Sender: TObject); procedure TopRetBtnClick(Sender: TObject); procedure TabControl1Change(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.RightBtnClick(Sender: TObject); var i: integer; begin if not Panel1.Visible then Exit; Panel1.Align := alNone; Panel2.Align := alNone; Panel2.Left := ClientWidth; Panel2.Visible := true; Panel2.Update; for i:=0 to ClientWidth div 5 do begin Panel1.Left := Panel1.Left - 5; Panel2.Left := Panel2.Left - 5; Update; end; Panel1.Visible := false; Panel1.Align := alClient; Panel2.Align := alClient; end; procedure TMainForm.FormCreate(Sender: TObject); var i: integer; begin Panel1.Align := alClient; Panel2.Align := alClient; Panel3.Align := alClient; Panel4.Align := alClient; Panel1.Visible := true; Panel2.Visible := false; Panel3.Visible := false; Panel4.Visible := false; RightBtn.Align := alRight; LeftBtn.Align := alLeft; BottomBtn.Align := alBottom; LeftRetBtn.Align := alLeft; RightRetBtn.Align := alRight; Label5.Align := alNone; TopRetBtn.Align := alTop; Update; Label5.Align := alTop; Label6.Align := alLeft; Label7.Align := alRight; Label8.Align := alRight; Label9.Align := alLeft; Button1.Align := alTop; Button2.Align := alTop; TabControl1.OnChange(self); if FileExists('about.txt') then Memo2.Lines.LoadFromFile('about.txt') else Memo2.Text := Файл не найден; if FileExists('lessons.txt') then Memo1.Lines.LoadFromFile('lessons.txt') else Memo1.Text := Файл не найден; {for i:=1 to ADOTable1.FieldCount-1 do DBGrid1.Columns[i].Width := 100; } end; procedure TMainForm.LeftBtnClick(Sender: TObject); var i: integer; begin if not Panel1.Visible then Exit; Panel1.Align := alNone; Panel3.Align := alNone; Panel3.Left := -ClientWidth; Panel3.Visible := true; Panel3.Update; for i:=0 to ClientWidth div 5 - 5 do begin Panel1.Left := Panel1.Left + 5; Panel3.Left := Panel3.Left + 5; Update; end; Panel1.Visible := false; Panel1.Align := alClient; Panel3.Align := alClient; end; procedure TMainForm.BottomBtnClick(Sender: TObject); var i: integer; begin if not Panel1.Visible then Exit; Panel1.Align := alNone; Panel4.Align := alNone; Panel4.Top := ClientHeight; Panel4.Visible := true; Panel4.Update; for i:=0 to ClientHeight div 5 do begin Panel1.Top := Panel1.Top - 5; Panel4.Top := Panel4.Top - 5; Update; end; Panel1.Visible := false; Panel1.Align := alClient; Panel4.Align := alClient; end; procedure TMainForm.LeftRetBtnClick(Sender: TObject); var i: integer; begin if Panel1.Visible then Exit; Panel2.Align := alNone; Panel1.Align := alNone; Panel1.Left := -ClientWidth; Panel1.Visible := true; Panel1.Update; for i:=0 to ClientWidth div 5 do begin Panel2.Left := Panel2.Left + 5; Panel1.Left := Panel1.Left + 5; Update; end; Panel2.Visible := false; Panel2.Align := alClient; Panel1.Align := alClient; end; procedure TMainForm.RightRetBtnClick(Sender: TObject); var i: integer; begin if Panel1.Visible then Exit; Panel3.Align := alNone; Panel1.Align := alNone; Panel1.Left := ClientWidth; Panel1.Visible := true; Panel1.Update; for i:=0 to ClientWidth div 5 do begin Panel3.Left := Panel3.Left - 5; Panel1.Left := Panel1.Left - 5; Update; end; Panel3.Visible := false; Panel3.Align := alClient; Panel1.Align := alClient; end; procedure TMainForm.TopRetBtnClick(Sender: TObject); var i: integer; begin if Panel1.Visible then Exit; Panel4.Align := alNone; Panel1.Align := alNone; Panel1.Top := -ClientHeight; Panel1.Visible := true; Panel1.Update; for i:=0 to ClientHeight div 5 do begin Panel4.Top := Panel4.Top + 5; Panel1.Top := Panel1.Top + 5; Update; end; Panel4.Visible := false; Panel4.Align := alClient; Panel1.Align := alClient; end; procedure TMainForm.TabControl1Change(Sender: TObject); var s: string; begin s := TabControl1.Tabs[TabControl1.TabIndex]+'.txt'; if FileExists(s) then Memo3.Lines.LoadFromFile(s) else Memo3.Text := Файл не найден; end; procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of 39: if Panel1.Visible then RightBtn.Click else if Panel3.Visible then RightRetBtn.Click; 37: if Panel1.Visible then LeftBtn.Click else if Panel2.Visible then LeftRetBtn.Click; 40: if Panel1.Visible then BottomBtn.Click; 38: if Panel4.Visible then TopRetBtn.Click; end; end; procedure TMainForm.Button1Click(Sender: TObject); begin ADOQuery1.SQL.Text := Memo4.Text; ADOQuery1.Active := true; DBGrid1.Update; end; procedure TMainForm.Button2Click(Sender: TObject); begin ADOCommand1.CommandText := Memo4.Text; ADOCommand1.Execute; end; end. 2.3. Сборник задач 1) Соединится с базой данных с помощью ADO и вывести данные в таблицу 2) Создать приложение, позволяющее добавлять, удалять данные в базе и отображать изменения 3) Создать приложение, выводящее отсортированные по определенному полю данные 4) Создать приложение, позволяющее изменять данные в определенной записи и отображать изменения 5) Создать приложение, позволяющее загружать из базы данных изображения и вывводить их на экран 6) Создать приложение, размеры и положение которого хранятся в базе данных и сохраняются при закрытии 7) Создать приложение, сохраняющее дату открытия и закрытия программы, а также время работы 8) Создать приложение, для поиска максимального и минимального значения в базе данных Заключение В электронном учебнике были рассмотрены основные одни из основных функций используемые в Delphi при работе с ADO. Главной целью являлось знакомство с компонентами TADOConnection и TADOCommand . Это позволило показать легкость и доступность использования компонентов и дало возможность для дальнейшего, более глубокого изучения компонентов. Это, также ещё раз подтвердило, что Delphi является мощным и универсальным инструментом для разработки приложений, и удобной средой за счет большого и расширяемого набора компонент. Результат работы электронного учебника может говорить о простоте и удобности использования компонентов. В то же самое время, компоненты поддерживают работу протоколов и стандартов передачи данных на полнофункциональном уровне. Благодаря использованию технологий ООП (Объектно-Ориентированное Программирование) компоненты ADO имеют простую иерархическую структуру и сходную между собой модель, благодаря которой, изучение компонентов делается ещё более простым. Не смотря на то, что проект является открытым (Open Source), это лишний раз доказывает, что можно и нужно использовать программы или библиотеки из таких проектов. Также можно убедиться, что действительно технологии передачи данных по сетям очень доступны и могут быть использованы на самом высоком уровне в собственных разработках. Список использованной литературы 1. Абрамов А. Г., Трифонов Н. П. Введение в язык Паскаль, - М.-Наука, 1988. 2. Архангельский А. Я., Delphi 2006,-М.-Бином 2006 3. Архангельский А. Я., 100 компонентов общего назначения библиотеки Delphi 5,-М.-Бином,2004 4. Баженова И. Ю. Delphi 6, - М.: Кудиц – образ, 2002 5. Глушаков С. В. Программирование на Delphi 5, - Харьков: ФОЛИО, 2002 6. Гофман В. Э., Хомоненко А. Д. Delphi 6, – СПб.: БХВ - Петербург , 2001 7. Климова Л.М., Delphi 7,-М.-кудиц-образ,2005 8. Культин Н. С. Delphi 6. Программирование на Object Pascal – СПб.: БХВ - Петербург , 2001 . 9. Культин Н. С. Delphi 7. Программирование на Object Pascal – СПб.: БХВ - Петербург , 2001. 10. Марко Кэнту, Delphi 7 для профессионалов,-СПб.-Питер, 2005 11. Попов В.А., Самоучитель Delphi,-СПб.-Питер, 2002 12. Ремнев А.А., Федотова С.В., Курс Delphi для начинающих,-М.-Бином,2004 13. Стивенс Род, Delphi. Готовые алгоритмы,-СПб.-Питер, 2004 14. Сухарев М.В., Основы Delphi. Профессиональный подход,-М.-Бином, 2003 15. Фаронов В. В. Система программирования Delphi. – СПб.: БХВ - Петербург , 2003 . 16. Фаронов В. В. Delphi 5. Учебный курс, - М.: Нолидж, 2001 . 17. Фаронов В. В. Delphi программирвание на языке высокого уровня,- Питер,2010 18. Фленов М.А., Библия Delphi,-М.-Бином, 2018 19. Хомоненко А. Д. и др. Delphi 7 / Под общ. ред. А. Д. Хомоненко. – СПб.: БХВ – Петербург, 2003. 20. Шпак Ю. А., Delphi 7 на примерах,- СПб.: БХВ - Петербург , 2006 21. Юркин А. Г. Задачник по программированию, - СПб.: Питер, 2002 . 22. www. Delphi-Forum.ru 23. www.informatik.kz