
- •Введение.
- •Лекция 1. Введение в клиент-серверные субд.
- •Interbase sql Server. Общие сведения.
- •Платформы
- •Типы приложений
- •Файлы базы данных InterBase
- •Лекция 3. Триггеры и хранимые процедуры
- •Хранимые процедуры (Stored Procedures)
- •Терминаторы
- •Заголовок
- •Тело процедуры
- •Блок кода процедуры
- •Оператор присваивания
- •Условный оператор if… then … else
- •Оператор select
- •Цикл for select и suspend
- •Цикл while … do
- •Операторы insert, update, delete
- •Оператор execute procedure
- •Исключения
- •События и оператор post_event
- •Изменения и удаления хранимых процедур
- •Примеры создания и вызова хранимых процедур
- •Генераторы
- •Увеличение шага генератора
- •Триггеры
- •Переменные new и old
- •Реализация автоинкрементных ключевых полей
- •Лекция 4. Транзакции. Механизм транзакций
- •Атомарность (Atomicity)
- •Согласованность (Consistency)
- •Изолированность (Isolation)
- •Устойчивость (Durability)
- •Неявный и явный старт транзакций
- •Как транзакция работает
- •Уровни изолированности транзакций
- •Параметры транзакций
- •Компонентыдоступакданнымивизуальныекомпоненты МеханизмыдоступакБд
- •ПроблемырусскихбукввInterBase
- •Лекция5. Основы языка php. Функции php для работы с субд История php
- •Возможности php
- •Основнойсинтаксис
- •Разделениеинструкций
- •Комментарии
- •Переменные,константыиоператоры
- •Переменные
- •Константы
- •Операторы
- •Типыданных
- •Типboolean(булевилилогическийтип)
- •Типinteger(целые)
- •Типfloat(числасплавающейточкой)
- •Типstring(строки)
- •Одинарныекавычки
- •Двойныекавычки
- •Типarray(массив)
- •Определениеприпомощиarray()
- •Определениеспомощьюсинтаксисаквадратныхскобок
- •Типobject(объекты)
- •Типresource(ресурсы)
- •Решениезадачи
- •Построениеинтерфейсадлядобавленияинформации
- •Установкасоединения
- •Выборбазыданных
- •Получениеспискаполейтаблицы
- •Отображениеспискаполейвhtml-форму
- •Записьданныхвбазуданных
- •Отображениеданных,хранящихсявMySql
- •Заключение
Компонентыдоступакданнымивизуальныекомпоненты МеханизмыдоступакБд
VCL-библиотекаклассовсредыпроектированияDelphiпредоставляетрядклассов,позволяющихбыстроиэффективноразрабатыватьразличныеприложениябазданных.
Этиклассыпредставленыследующимигруппами:
компонентыдлядоступакданным,реализующие:
доступчерезмашинубазданныхBDE(BorlandDatabaseEngine),предоставляющуюдоступчерезODBC-драйверыиличерезвнутренниедрайверымашиныбазданныхBDE(компонентыстраницыBDE-палитрыинструментов);
доступчерезADO-объекты(ActiveXDataObjects),восновекотороголежитприменениетехнологииOLEDB(компонентыстраницыADO);
доступклокальномуилиудаленномуSQL-серверуInterBase(компонентыстраницыInterBase);
доступпосредствомлегковесныхдрайверовdbExpress;
доступкБДпримногозвеннойархитектуре(компонентыстраницыDataSnap);
визуальныекомпоненты,реализующиеинтерфейспользователя;
компонентыдлясвязиисточниковданныхсвизуальнымикомпонентами,предоставляющимиинтерфейспользователя;
компонентыдлявизуальногопроектированияотчетов.
Основнымимеханизмамидоступакданным,поддерживаемымвDelphi,являются:
ODBC-доступчерезODBC-драйверыБДилиBDE-драйверы;
OLEDB-доступсиспользованиемпровайдеровданных(OLEDB-этометоддоступаклюбымданнымчерезстандартныйCOM-интерфейс);
средстваdbExpress,использующиелегковесныедрайверыБД;
средствадоступакраспределеннымнаборамданныхвмногозвеннойархитектуре.
Самыйпростоймеханизмуправленияданными,использующийODBC-драйверы,можетбытьреализованпоследующейсхеме:
Вмодульданных(иливформу)добавляетсякомпонентнабораданных(объектклассаTDataSet)иустанавливаетсясвязьсисточникомданных,определяемаясвойствомDatabaseName.Связьможетбытьуказанаоднимизтрехспособов:поименибазыданных,каталогуилипсевдониму(способуказаниясвязиможетбытьограничентипомисточникаданных).Списоквсехпсевдонимовдоступеннаэтапепроектирования.
Вмодульданных(иливформу)добавляетсякомпонентисточникаданных(TDataSourse),являющийсяцентральнымсвязующимзвеноммеждунаборомданныхиэлементамиуправления,отображающимиэтиданные.СвойствоDataSetкомпонентатипаTDataSourseуказываетнаборданных,формируемыйкомпонентамитакихклассовкакTTableилиTQuery.Есликомпонентынабораданныхиисточникаданныхрасположенывмодуледанных,тоихследуетдобавитьвпроект(командаменюFile|Useunit).
Вформудобавляютсяэлементыуправлениядляработысданными,такиекакTDBGrid,TDBEdit,TDBCheckbox.Онисвязываютсяскомпонентомисточникомданных,которыйуказываетсясвойствомDataSource.ИмяполянабораданныхопределяетсясвойствомDataField.
ГрафическисхемуработысбазамиданныхдлядвухзвенныхархитектурвсредеDelphiможнопредставитьследующимобразом:
|
||||||
|
|
|
|
|
|
|
МашинабазданныхBDE |
ПровайдерыOLEDB |
dbExpress |
InterBase |
|||
|
|
|
|
|||
TDatabase(необязательный) |
TADOConnection |
TSQLConnection |
TIBDatabase |
|||
|
|
|
|
|||
Невизуальныекомпонентынабораданых |
||||||
TTable,TQuery,TDataSet,TField |
|
TADODataSet,TADOTable,TADOQuery |
|
TSQLDataSet,TSQLQuery,TSQLTable,TSQLStoreProc,TSQLClientDataSet |
|
TIBDataSet,TIBTable,TIBQury |
|
|
|
|
|||
( свойствоDataSet)Компонент"источникданных"-центральныйсвязующийкомпонентTDataSource |
||||||
|
||||||
( свойствоDataSource)ВизуальныекомпонентыдляработысданнымиTDBGrid,TDBEdit,TDBText,TDBMemo,TDBCheckbox,TDBNavigatorидр. |
ДлясохраненияданныхизБДвXML-форматеилидвоичномформате,иобратно,дляформированиянабораданныхизXMLилидвоичногофайлаприменяетсяпровайдерданных.
ГрафическисхемасохраненияданныхизБДвXML-форматеприведенанаследующейсхеме:
|
|||||
|
|||||
Наборданных(TTable,TQueryилидр.) |
|||||
|
(свойствоDataSet) |
||||
КлиентскийнаборданныхTClientDataSet |
|
ПровайдерданныхTDataSetProvider |
|||
(методSaveToFile) |
(методLoadFromFile) |
|
|
||
Файлводномизследующихформатов:двоичныйформат(dfBinary);XML-формат(dfXML);XML-формат,использующийUTF8(dfXMLUTF8) |
|
СоединениеклиентскойпрограммысбазойданныхпроизводитсяспомощьюодногоизмеханизмовуправленияБД.Изстандартнойбиблиотекикомпонентовэто,какправило,BDE,dbExpressиInterBaseExpress(IBX).Нередкоиспользуютикомпонентыстороннихразработчиков,напримерFIBPlus,новданномкурсемынебудемрассматриватьработуснестандартнымикомпонентами.
ЧтокасаетсяADO,тутситуациянесколькосложней.КорпорацияMicrosoftнеоченьжалуетстороннихразработчиков,особеннопопулярных,поэтомусоединитьсясбазойданныхInterBaseчерезмеханизмADOдовольнопроблематично.ВстроенныхвWindowsсредствдляэтогонесуществует,аискатьиустанавливатьдрайверыInterBaseдляODBC-хлопотно.ПоэтомумынебудемрассматриватьспособысоединениясInterBaseчерезADO,темболеечтодляэтогосуществуетнемалодругих,гораздоболееудобныхипрозрачныхинструментов.
Вкратцевсежезаметим,чтодлянормальнойработысInterBaseчерезADOнуженODBC-драйверIntersolv,которыйранеевходилвпоставкуInterBase5.5,5.6илидрайверEasySoft,поставляемыйотдельно.Этидрайверыпозволяютустановитьнауровненастроекнужнуюкодировку,напримерWIN1251.ОтдельнодрайверIntersolvнепродается,непоставляется,иболеенеподдерживаетсясмоментавыходаInterBase6.Авот"устаревший"механизмBDEпозволяетсоединитьсясБДInterBaseбезвсякихпроблем.НаэтойлекциимывкратцерассмотримспособысвязыванияприложениясБДчерезстандартныемеханизмы.
BDE
НапредыдущихзанятияхспомощьюутилитыSQLExplorerмысоздавалипсевдоним(alias)базыданныхFirstIB.Этимпсевдонимоммытеперьивоспользуемся.Убедитесь,чтоонувассуществует,аеслинет-зарегистрируйтеего.СерверInterBaseприэтомдолженбытьвключен.
Приступимксозданиюприложения.ЗагрузитеDelphi.
СвкладкиDataControlsустановитенаформусеткуDBGridинавигаторDBNavigator,атакжеобычнуюкнопку.ДлясвязисбазойданныхнампотребуютсякомпонентыDatabase,TableиQueryсвкладкиBDE,атакжеDataSourceсвкладкиDataAccessдлясвязитаблицыссеткойинавигатором:
Рис.5.1.Формаприложения
Далее,выделитекомпонентDatabase.Здесьнамнужносделатьнекоторыенастройки:
ВсвойствеAliasNameвыберитенашпсевдонимFirstIB.
ВсвойствеDatabaseNameвпишитеназваниебазыданных.Ономожетбытьлюбым,например,DBase1.
СвойствоLoginPromptпереведитевFalse,чтобыпрограммапризапускенезапрашивалаимяпользователяипароль.
РаскройтесложноесвойствоParamsивпишитетудаследующиепараметры:
Рис.5.2.РедактированиесвойстваParams
ТеперьсвойствоConnectedможноперевестивTrue.Есливывсесделалиправильно,тоэтоудастся.Иначепосмотрите,запущенлиувассерверInterBase?
Далее,табличныйкомпонентпереименуйтевTTovar,акомпонентзапроса-вQ1(оннампонадобитсядляслужебныхцелей).УобоихэтихкомпонентоввсвойствеDatabaseNameвыберитетолькочтосозданноеимябазыданныхDBase1.Утаблицы,крометого,всвойствеTableNameвыберитеTOVAR,асвойствоActiveпереведитевTrue.
СеткуинавигаторподключитекDataSource1(черезсвойствоDataSource),аего,всвоюочередь,подключитектаблицеTTovar(черезсвойствоDataSet).Увасвсеткедолжнопоявитьсясодержимоетаблицы.Сохранитепроект,скомпилируйтеизапуститеполученнуюпрограмму.
Теперьпопробуйтедобавитьзаписьприпомощитаблицы,незаполняяполяID(онозаполняетсятриггером).Увасвыйдетошибка:
Рис.5.3.Ошибкаизмененияданныхтаблицы
Каквидите,утверждение,чтотриггерBEFOREINSERTсрабатываетПОСЛЕтого,кактаблицавыполнитметодPOST,подтвердилось.Здесьследуетсделатьоднозамечание.НаштриггервначаледелаетпроверкуназначениеNOTNULLвключевомполе.Есливэтомполебудетзначение,триггерничегоделатьнебудет.Однакозаполнятьавтоинкрементноеполевручнуюнельзя,таккакмынарушимработугенератора.Единственноеисключение-еслимыудалимзапись,азатемпожелаемвставитьнаееместодругуюзаписьстакимжезначениемвключевомполе.Вэтомслучаемыбудемвставлятьзапись,неизменяязначениягенератора;триггервэтомслучаенесработает.
НажмитеOK,апотомвыберитекомандуменюRun->Programreset,чтобызакрытьповисшееприложение.Итак,мыубедились,чтодобавлятьзаписьвтаблицусавтоинкрементнымполемспомощьютабличногокомпонентапроблематично.Затосуществующиезаписиможноредактироватьилиудалять.АдлядобавлениявоспользуемсякомпонентомзапросаQuery(которыйдлякраткостимыпереименоваливQ1).
Сгенерируйтеобработчикнажатиянакнопку"Добавитьзапись",котораянаходитсяподсеткой.Вполученнойпроцедуревпишемследующийкод:
procedureTfMain.Button1Click(Sender:TObject);
var
s:String;
tov,stoim:String;
begin
tov:='';
stoim:='';
//получимданныеотоваре:
ifnotInputQuery('Добавлениетовара',
'Введитеновыйтовар:',tov)thenExit;
ifnotInputQuery('Стоимостьтовара',
'Введитестоимостьтовара:',stoim)thenExit;
//формируемстрокузапроса
s:='InsertIntoTovar(Nazvanie,Stoimost)'+
'Values('+QuotedStr(tov)+
','+stoim+')';
//вписываемивыполняемзапрос:
Q1.SQL.Clear;
Q1.SQL.Add(s);
Q1.ExecSQL;
//обновимтаблицу:
TTovar.Refresh;
end;
ДлядемонстрацииработыBDEмыиспользовалипростейшийинтерфейс,безпроверкивведенныхзначенийнаправильность.ВначалефункциейInputQueryмызапрашиваемнаименованиеновоготовара,здесьвампридетсяследить,чтобывписатьнеболее20символов(длинаполяNazvanie).Затем,вводястоимостьтовара,нужноследитьзатем,чтобысуммавводиласьвформате
xxx.xxx
Тоесть,разделителеммеждуцелойидробнойчастьючисладолжнабытьточка,кактоготребуетсинтаксисInterBase.ВсеткеDBGrid,темнеменее,разделителембудетотображатьсязапятая.Однакосуммаможетбытьибездробнойчасти,еслитовар,например,стоитровно10рублей.
Еслипользовательневведетназваниетовараилиегостоимость,происходитвыходизпроцедуры.
Получивданные,мыформируемстрокузапроса,вроде:
InsertIntoTovar(Nazvanie,Stoimost)Values('Крупапшенная',7.35);
ПослечегоприсваиваемэтустрокусвойствуSQLкомпонентаQ1.Апосколькузапросвыполняемый,товместометодаQ1.OpenмыиспользуемQ1.ExecSQL.ПослечегонамостаетсятолькообновитьотображаемыйнаборданныхвтаблицеTTovar.Теперьновыезаписидобавляютсябезпроблем,аудалениеиредактированиезаписейможноделатьспомощьюкомпонентовDBNavigatorиTable.