Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
21
Добавлен:
21.11.2019
Размер:
517.3 Кб
Скачать

Компонентыдоступакданнымивизуальныекомпоненты МеханизмыдоступакБд

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

(свойствоProviderName)

Провайдерданных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.