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

ПроблемырусскихбукввInterBase

Вообщето,этипроблемыкасаютсянетолькорусских,авообщелюбыхбукв,отличныхотанглийскогоалфавита.Здесьнужносделатьнесколькозамечаний:

  • Наименованияидентификаторов(названий)таблиц,полей,индексовипроч.вInterBaseнедопустимодаватьрусскимибуквами.

  • ПрисозданиибазыданныхнезабывайтеуказыватькодировкуWIN1251,каккодировкупоумолчанию.

  • ЕсливыподключаетексерверучерезIBConsoleужесуществующуюбазуданных,такженезабывайтеуказыватьэтукодировку.

  • ЕсливыподключаетеклиентскоеприложениекБДчерезBDE,достаточносоздатьпсевдонимБД,вкоторомвкачествеязыковогодрайверауказатьParadoxANSICyrillic,какэтомыделалираньше.

  • ПриподключенииприложениякБДспомощьюмеханизмов"прямогодоступа",такихкакIBX,FIBPlusит.п.,вспискепараметровнужноуказатьдополнительныйпараметркодировки"lc_ctype=WIN1251",безэтоговысможетепросматриватьтаблицысрусскимтекстомвполях,нонесможетедобавлятьновыхзаписей,сделанныхкириллицей.

  • ВInterBaseимеетсявстроеннаяфункцияUPPER,котораяпреобразуетсимволыстроковыхполейвзаглавныебуквы.Этувозможностьнередкоиспользуютдляпоискаданных.Однакоприработескириллицейонабудетработатькорректнолишьвтомслучае,еслистроковоеполебылосозданоскодировкойWIN1251ипорядкомсортировкиPXW_CYRL.Вслучаедругихсочетанийпараметров,функциянесможетправильноотображатьрусскийтекстзаглавнымибуквами.Например,отобразитьтекстполяNazvanieизтаблицыTovarзаглавнымибуквамиможноследующимзапросом:"SELECTUPPER(Nazvanie),StoimostFROMTovar"

  • ЕсливсежевысоздалиполескодировкойWIN1251,нонеуказалисортировкуPXW_CYRL,авамтребуетсявыполнитьпоисксфункциейUPPER,товыможетесменитьпорядоксортировкиявно,прямовзапросе.Например,требуетсянайтизаписьсозначением"Сахар"вполеNazvanie.Приэтоммынезнаем,какпользовательвписалэтоназвание:"САХАР","Сахар"или"сахар".Сделатьпоиск,независящийотрегистраможнозапросом:"SELECT*FROMTovarWHEREUPPER(NazvanieCOLLATEPXW_CYRL)='САХАР'"

dbExpress

ТехнологияdbExpressреализуеттакназываемыйоднонаправленныйкурсор,тоесть,данныеможнобудетлистатьтолькосверху-вниз.Этосущественноускоряетработусбазойданных,новбольшинствеслучаевделаеттехнологиюнеудобнойдляклиентскихприложений.Правда,начинаясшестойверсииDelphi,вdbExpressпоявилсякомпонентTSimpleDataSet,которыйсоздаетдвунаправленныйкурсориснимаетбольшинствоограничений.Втожевремя,программалишаетсяпреимуществаскоростиоднонаправленногокурсора.Всеэтоприводитктому,чтотехнологиюdbExpressнапрактикеиспользуюткрайнередко.Темнеменее,рассмотримподключениепрограммыкбазеданныхспомощьюэтойтехнологии.

Создайтеновоеприложениеиспроектируйтеформутакойже,каквпредыдущемпримере,нобезкомпонентовBDE.Изкомпонентовдоступа,помимоDBNavigatorиDBGridнампонадобятся:DataSourceсвкладкиDataAccess;компонентыSQLConnection,SimpleDataSetиSQLQueryсвкладкиdbExpress.

SQLConnectionпредназначендляподключениякбазеданных,онявляетсяаналогомкомпонентаTDatabaseвBDE.Остальныекомпонентыподключаютсякбазечерезнего.

SimpleDataSetбудетигратьрольтаблицысдвунаправленнымкурсором,аSQLQueryпредставляетсобойобычныйкомпонентзапросов.

ВыделитекомпонентSQLConnection.ВегосвойствеConnectionNameвыберитеизспискавариантовподключенияIBConnection,приэтомавтоматическинастроятсянекоторыесвойства,специфичныедляInterBase.ДалеещелкнитепосложномусвойствуParams-загрузитсяокнопараметров,котороенужнонастроитьтак:

Рис.5.4.ОкнопараметровSQLConnection

ЗдесьнамнужнобудетвручнуювписатьадресиимяфайласбазойданныхвпараметрDatabase.ЗатемуказатьпараметрыServerCharSet(WIN1251)иSQLDialect(3).ПослечегокнопкойОКзакрытьокно.ДалееперевестисвойствоLoginPromptвFalse,чтобыпрограмманезапрашивалаимяипарольпользователя,асвойствоConnectedвTrue,чтобысоединитьсясбазойданных.

ВыделимкомпонентSimpleDataSet.ПереименуйтеегосвойствоNameвTTovar(мывыбралитакоежеимя,какутаблицыизпрошлогопримера,чтобынеменятькоднажатиянакнопку).ВсвойствеConnectionвыберитеSQLConnection1.РаскройтесложноесвойствоDataSet,иоткройтеподсвойствоCommandText.Откроетсяокноредактора,вкоторомнужнобудетсоставитьзапросвыборкивсехданныхизтаблицыTovar:

SELECT*FROMTOVAR:

Рис.5.5.Окноредакторазапросов

ЗатемкнопкойОКзакройтеокно,иможетезакрытьсложноесвойствоDataSet.АвотсвойствоActiveпереведитевTrue,чтобыоткрытьполученныйнаборданных.

ТеперьзаймемсякомпонентомSQLQuery1.СвойствоNameпереименуйтевQ1,всвойствеSQLConnectionвыберитеSQLConnection1.

НапоследоксоединитеDataSource1скомпонентомTTovar,асеткуинавигатор-сDataSource1.Данныеизтаблицыдолжныотобразитьсявсетке.

Коддлякнопкитакойже,каквпредыдущемпримере.Сохранитепроект,скомпилируйтеипопробуйтедобавитьпарунаименованийтовара.Каквидите,реализацияподключениянесколькосложней,чемвпредыдущемпримере,нозатонаклиентскийПКненужноустанавливатьBDE!

InterBaseExpress(IBX)

Этатехнологияявляется"родной"длясервераInterBase,иизстандартныхмеханизмовдоступанаиболееудобна.Азначит,чащевсегоиспользуютименноее.Вбудущихлекцияхмыпоработаемсэтиммеханизмомплотнее,апокавкратцерассмотримработуснимнапримеревсетогожеприложения.

Создайтеновоеприложение,иразместитенаформесеткуDBGrid,навигаторDBNavigatorикнопкутакже,каквпрошлыхпримерах.

НасеткупоместитеодинкомпонентDataSourceсвкладкиDataAccess,исвкладкиInterBaseследующиекомпоненты:IBDatabase,IBTransaction,IBTableиIBQuery.

КомпонентIBDatabaseвыполняетподключениекбазеданных,всеостальныекомпонентывкладкисоединяютсясБДчерезнего.

Вседействиясбазойданныхпроисходятнауровнетранзакций,компонентIBTransactionкакразобеспечиваеттакуютранзакцию.ВприложенииобязательнодолженбытьхотябыодинIBTransaction,соединенныйсIBDatabase.Всложныхмногозвенныхбазахданныхтакихтранзакцийможетбытьнесколько.Вообще,имеетсявозможностьдлякаждогонабораданных(IBTableилиIBQuery)использоватьсобственныйкомпонентIBTransactionсразличныминастройками.Однакоделатьтакнерекомендуется.Обычнонаборыданныхразделяютнагруппы,например,НДтолькодлячтения,НДтолькодлязаписи,НДдлячтения/записисмягкимиилижесткимиусловиямисоединения(обэтомвследующихлекциях).ВэтомслучаедлякаждойгруппынаборовданныхвыделяютсвойкомпонентIBTransaction.

КомпонентыIBTableиIBQueryпочтиничемнеотличаютсяотпростыхTableиQuery.

Итак,выделитекомпонентIBDatabase.ЧерезегосвойствоDatabaseNameнайдитеиподключитефайлFirst.gdb.ДалееоткройтесвойствоParams(откроетсяокноредактора).Вокневпишитеследующиепараметры:

user_name=sysdba

password=masterkey

lc_ctype=win1251

Обратитевниманиенато,чтопробелыпередипослезнака"="недопустимы.Всесловаможновводитьмаленькимибуквами.Каждыйпараметруказывайтенановойстроке.НажмитекнопкуОКизакройтеокноредакторапараметров.СвойствоLoginPromptпереведитевFalse,асвойствоConnectedвTrue-связьсБДустановлена.ВсетевомвариантеобычноLoginPromptоставляютTrue,чтобызнать,какойпользовательнасамомделевошелвбазуданных.

ДалеевыделитекомпонентIBTransactionивегосвойствеDefaultDatabaseвыберитенашуБДIBDatabase1.

ЗатемвыделитетаблицуIBTable1,переименуйтееевTTovar(свойствоName),всвойствеDatabaseвыберитеIBDatabase1.ПриэтомвсвойствеTransactionтаблицыавтоматическидолженпоявитьсякомпоненттранзакцийIBTransaction1.Еслипокакимтопричинамэтогонеслучилось,выберитееговручную.ВсвойствеTableNameустановитетаблицуTovar,асвойствоActiveпереведитевTrue-таблицаоткрыта.

ТеперьвыделимзапросIBQuery1.СвойствоNameпереименуемвQ1,всвойствеDatabaseвыберемIBDatabase1.ИуэтогокомпонентавсвойствеTransactionавтоматическидолжнапоявитьсятранзакцияIBTransaction1.

ОсталосьтолькосвязатьDataSourceстаблицейTTovar,асеткуинавигатор-сDataSource.

Коднажатиянакнопкутакойже,каквпредыдущихпримерах.

Каквидите,работасразличнымимеханизмамидоступаксерверуInterBaseотличаетсялишьвдеталях.МеханизмIBXотличаетсятем,чтовприложенииобязательнодолжнабытьхотябыодинкомпоненттранзакций.Новреальнойпрактикетакихкомпонентовможетбытьнесколько,каждыйизнихобычноимеетсвоинастройки,аразличныенаборыданныхмогутподключатьсякразличнымкомпонентамтранзакций.