Content


I-1: Версия от 19.08.2002

 Конференция:  fido7.ru.delphi.db

I-2: Введение

 FAQ  для  конференции  fido.ru.delphi.db,  основано  на  FAQ  от  Алексея  Махоткина.
 В  основном  сохраняется  вся  политика  по  ведению  данного  FAQ

I-3: Копирайты

 Copyright  (C)  Alexey  Mahotkin  1997-1999
 
 Portion  Copyright  (C)  Anatoly  Podgoretsky,  2001
 
 Ответы  на  вопросы  Copyright  (C)  авторы  ответов

I-4: Преамбула

 Пожалуйста,  воздержитесь  от  задавания  вопросов  в  этой  иерархии,  до  того,  как  прочтете  этот  документ,  правила  иерархии,  ознакомитесь  со  списком  рекомендованной  литературы  и  проведете  самостоятельные  исследования  вопроса.  Это  поможет  всем  нам  сохранить  на  должном  высоком  уровне  соотношение  полезной  и  бесполезной  информации.

I-5: О поле Subject:

 Правилами  иерархии,  в  частности,  регламентируется  содержание  поля  Subject:  ваших  писем.  Дело  в  том,  что  довольно  большое  количество  "потенциально  полезных  вам  индивидумов"  читают  эхи  методом  "по  сабджектам",  сознательно  не  тратя  время  на  письма  под  заголовком  "Help!",  "Проблема"  или  "Вопрос  чайника".  В  данном  случае  использование  комбинации  клавиш  Shift-1  лишь  усугубляет  ваше  положение.  Подумайте  об  этом.

I-6: Здесь не приветствуется

 *  обсуждение  вопросов,  не  относящихся  к  базам  данных,  для  этого  специально  существует  другие  конференции  RU.DELPHI,  RU.DELPHI.INTERNET,  RU.DELPHI.REPORTS.  К  сожалению,  мотивация  типа  "мой  аплинк/провайдер  не  получает  эту  эху/ньюсгруппу"  в  данном  случае  не  принимается,  потому  что  за  продолжительное  время,  прошедшее  с  момента  создания  RU.DELPHI.DB,  следовало  бы  подумать  в  первую  очередь  о  себе  и  создать  для  себя  необходимое  количество  каналов  поступления  информации.
 
 *  обсуждение  вашей  совершенно  новой  и  безумно  свежей  идеи  о  том,  что  эху  пора  разделить  на  две/три/больше  частей,  потому  что  читать  ее  нет  никаких  сил.  Вы  даже  не  в  первой  сотне  придумавших  и  успешно  высказавших  сие.  От  себя  могу  посоветовать  пользоваться  хорошими  программами  для  чтения  эхо-конференций.
 
 *  обсуждение  тем,  не  связанных  с  собственно  Delphi:  алгоритмы,  общие  вопросы  программирования  под  Win32,  общие  организационные  вопросы,  связанные  с  разработкой  программного  обеспечения,  etc.
 
 *  общая  неспособность  получать  информацию  из  окружающей  реальности.  Прочтите  книгу  об  эффективной  коммуникации  и  должном  отношении  ко  всему.

I-7: Доступность этого FAQ

 Этот  документ  регулярно  изменяется  в  результате  отслеживания        происходящего  в  RU.DELPHI.DB.  Вы  можете  поучаствовать  в  составлении  документа,  прислав  по  адресу  
 lv.t@rambler.ru  сформулированный  вариант  вопроса,  ответ  или  дополнение  или  исправление  к  ответу.  Довольно  важным  критерием  отбора  ответов  является  размер.  Я  не  хочу  публиковать  большие  куски  кода,  предпочитая  давать  указание  на  источник  дополнительной  информации  или  направление  самостоятельных  разработок.  В  любом  случае,  вы  можете  обратиться  к  авторам  сопутствующих  проектов,  список  которых  приведен  ниже.
       
 Разрешается  свободное  распространение  и  использование  этого  документа  при  соблюдении  определенной  вежливости  по  отношению  к  автору  и  читателям,  основной  составляющей  чего  является  соблюдение  целостности  документа.  Hе  очень  приветствуется  выкладывание  копий  этого  документа  на  сайт:  подумайте,  нужны  ли  вам  непрерывные  усилия  по  синхронизации?
 
 Если  же  вы  вынуждены  использовать  этот  документ  на  сайте,  для  того,  чтобы  создать  его  содержимое,  подумайте,  нужен  ли  вообще  ваш  сайт?
       
 Свежая  версия  этого  документа  находится  на  домашней  странице  Анатолия  Подгорецкого  http://www.podgoretsky.com  (http://nps.vnet.ee)  (доступны  исходные  тексты  движка,  движок  FaqMaker.exe  и  последнии  версии  баз)
 Альтернативный  источник  http://faq.delphiplus.org  -  более  быстрый  хостинг
 
 Оригинальная  версия  от  Махоткина  на  домашней  странице  автора  http://alexm.here.ru.  
 Остерегайтесь  подделок.

I-8: Контрибуторы

 Список  людей,  внесших  свой  вклад  в  создание  этого  F.A.Q.,  в  алфавитно-случайном  порядке:  
 
 Akzhan  Abdulin  (2:5040/55),  
 Alexey  Tomin  (alex(at)soniir.smr.ru),  
 Anthony  Buntyakov  (antosha(at)metcombank.ru),
 Arthur  Aseev  (2:5030/465.2),  Andrey  Grigoriev  (2:5061/24.20),  
 Alex  Konshin  (2:5030/217),  Alexander  Lokshin  (2:5020/529),  
 Alexander  Petrosyan  (2:5020/468.8),  Alex  Petin  (2:5000/97.8),  
 Alexey  Solodovnikov  (2:5030/257.15),  
 Andrey  Ruckoy  (2:5047/7),  
 Andrey  Sarinkov  (2:5040/33.121),  
 Alexey  Sinutin  (2:5022/12.16),  
 Andrew  Verigo  (2:452/23.32),  
 Alexey  Yashin  (2:5020/62.31),  
 Boris  Loboda  (2:461/256),
 Boris  Podchezertseff  (2:5020/656.20),  
 Dmitry  Kryloff  (2:5054/9.20),
 Dmitry  Shikhman  (2:468/13.32),  
 Edward  Shigapov  (2:5051/22.8),  
 Eugene  Kopko  (2:464/196),  
 Evgeny  Levashoff  (2:5022/31.7),  
 Eugene  Mayevski  (2:463/209),  
 Eugeny  Sverchkov  (2:5031/12.23),  
 Ilya  Andreev  (2:5030/55.28),  
 Ivan  Gudym  (2:4642/2213.9),  
 Igor  Slusarev  (2:5020/118.18),  
 Juris  Bekins  (2:5100/35),  
 Max  Vystropov  (2:5020/1412),  
 Oleg  Belousov  (oberon(at)nvart.ru),  
 Pavel  Shklovsky  (2:5011/18),  
 Roman  Procopovich  (2:5030/254.201),  
 Roman  Rechmakov  (2:5020/952.26),  
 Stanislav  Babin  (2:5030/356.7),  
 Serge  Korolev  (2:5020/104),  
 Sergey  Mazunov  (2:5083/30.20),  
 Sergey  Maznichenko  (2:5061/26.45),  
 Sergey  Okhapkin  (ex-2:5020/47),  
 Serg  Vostrikov  (2:5053/15.3),  
 Sergey  Arkhipov  (2:5054/88.10),  
 Sergey  Belov  (sbelov(at)aha.ru),  
 Victor  Babkin  (2:463/279.6),  
 Vlad  Sharnin  (vlad(at)nplks.rb.ru),  
 Victor  Ishikeev  (ivi(at)ufanet.ru),  
 Vladimir  Vornichescu  (2:469/101.24),  vsbelashov(at)obs.omsk.ru.
       
 Если  по  какой-то  причине  вас  нет  в  этом  списке,  тогда  как  вы  считаете,  что  должны  там  находиться,  прошу  извинить  и  уведомить  об  этом  прискорбном  факте.  Я  также  позволил  себе  не  сопоставлять  некоторые  ответы  с  именами  авторов  этих  ответов.  Если  вас  не  устраивает  такая  ситуация  --  напишите  об  этом.
 
 PS:  информация  оставлена  по  старой  модели  FAQ  и  в  дальнейшем  изменяться  не  будет,  может  за  исключение  особых  случаев.

I-9: Источники информации

 Прежде  всего,  конечно  же,  книги.  Как  бы  это  странно  ни  звучало,  но  зайдите  в  книжный  магазин  и  купите  себе  там  какую-нибудь  книгу,  даже  если  она  уже  у  вас  есть.  Следует  сразу  предупредить,  что  специфика  современного  российского  книгоиздания  такова,  что  существует  довольно  большое  количество  книг,  не  стоящих  своих  денег.  Вероятно,  вам  следует  положиться  на  собственное  чутье  и  тщательно  изучить  предлагаемую  продукцию.
       
 Список  литературы  на  все  интересующие  темы,  рекомендованный  к  прочтению,  находится  в  неофициальном  FAQ.  эхоконференции  RU.BOOKS.COMPUTING.  Свежие  версии  этого  FAQ.  регулярно  публикуются  в  соответствующей  эхоконференции,  а  также  доступны  на  домашней  странице  автора.
       
 Учтите,  что  кроме  книг  по  Delphi  вас  могут  интересовать  также  издания,  посвященные  программированию  под  Windows  и  проектированию  баз  данных.  Delphi,  в  сущности,  является  обычным  компилятором  для  Windows,  и  довольно  большое  количество  вопросов,  которые  у  вас  возникнут,  будут  не  столь  уж  сильно  ориентированы  именно  на  Delphi.
       
 Само  собой,  хотелось  бы  увидеть  у  активного  участника  конференции  определенные  знания  языка  программирования  Object  Pascal,  являющегося  основой  Delphi,  а  также  знаний  в  области  программирования  вообще,  программирования  под  Windows  в  частности,  а  также  предметной  области  своей  собственной  задачи.  Без  всякого  сомнения,  вы  можете  общаться  и  задавать  вопросы  на  любом  уровне,  но  ожидайте  соответствующей  реакции  извне.
       
 Hаучитесь  также  пользоваться  системой  помощи,  поставляемой  вместе  с  Delphi.  Как  это  ни  прискорбно,  весьма  ощутимый  процент  задаваемых  в  эхе  вопросов  легко  снимается  нажатием  кнопки  F1  и  поиском  примерного  перевода  вопроса  на  английский  язык.  Примером  тому  может  являться  сакраментальный  вопрос  о  получении  короткого  имени  файла  из  длинного  и  ответ:  GetShortPathName.  Да,  скорее  всего  вам  придется  восполнить  свои  пробелы  в  школьном  образовании  и  изучить  некоторое  подмножество  английского  языка,  без  коего  вы  имеете  не  столь  много  шансов  успешно  функционировать  в  выбранной  области.
       
 Учтите  наличие  в  поставке  Delphi  большого  количества  разнообразных  примеров.  Возможно,  ознакомившись  с  ними,  вы  приобретете  дополнительные  знания.  Изучите  исходные  тексты  Visual  Component  Library,  поставляемой  вместе  с  Delphi  Professional  и  Delphi  Client/Server,  а  также  хорошие  образцы  кодирования  и  проектирования,  например,  исходники  rxLib.
       
 Возможно,  вам  следует  приобрести  тем  или  иным  способом  ту  частьMicrosoft  Developer  Network  (MSDN),  что  содержит  в  себе  документацию.  Это  диски  с  названиями  "Platform  SDK",  "Additional  SDKs  and  Tools"  и  "DDKs".  В  них  содержится  более  свежая,  более  полная  и  обширная  информация  по  всем  аспектам  программирования  под  Windows.  Подписка  на  эту  часть  MSDN  (это  первый  уровень)  стоит  не  столь  дорого  и  вы  имеете  все  шансы  купить  ее,  например,  для  своей  организации.  Более  того,  на  http://msdn.microsoft.com  можно  получить  доступ  к  львиной  доле  документации  из  MSDN.
       
 Множество  качественной  информации,  относящейся  к  программированию  под  Windows  95/NT,  можно  получить  на  http://www.sysinternals.com.  Hа  http://www.iarchitect.com  находится  большой  ресурс,  посвященный  вопросам  построения  пользовательского  интерфейса.
       
 Если  вам  требуется  работать  с  нестандартным  железом,  подумайте  о  написании  драйвера.  Это  удобнее,  проще  и  гибче.  Соответствующая  информация  находится  в  DDK  (Device  Driver  Development  Kit).  Самая  известная  фирма,  занимающаяся  поддержкой  писателей  драйверов  --  Vireo.  http://www.vireo.com.  Отдельно  стоит  упомянуть,  что  если  вы  всего  лишь  желаете  работать  с  последовательными  портами,  то  вам  следует  приобрести  библиотеку  Async  Professional  фирмы  Turbo  Power.  Hа  http://www.entechtaiwan.com/tools.htm  лежат  TVicHW32  и  TVicPort.  Hа  http://www.bluewatersystems.com  есть  WinRT,  а  у  все  той  же  Vireo  Software:  Driver::Agent.  Это  все  попытки  избавить  пользователя  от  написания  драйверов.
       
 Традиционно  обитатели  RU.DELPHI.*  питают  заслуженную  любовь  и  уважение  к  библиотеке  rxLib.  Это  большая  библиотека  компонент  для  Delphi  всех  версий  и  C++Builder,  распространяемая  по  системе  freeware  с  полными  исходными  текстами  и  файлами  помощи  на  русском  языке.  Выяснено,  что  эта  библиотека  способна  покрыть  очень  большое  количество  запросов  программистов  на  Delphi  самого  разного  уровня,  и  в  частности,  именно  на  нее  будут  даваться  обильные  ссылки  далее  по  тексту.
       
 По  возможности  фидошные  обитатели  RU.DELPHI.*  помещают  интересные  файлы  в  так  называемые  файлэхи.  Официальной  файлэхой  RU.DELPHI  является  WDEVDELPHI.  Ценным  ресурсом  являются  файлэхи  группы  FED*  (модератор  --  Акжан  Абдулин,  2:5040/55).  Если  вы  читаете  RU.DELPHI  из  Фидо,  то  подпишитесь  на  эти  файлэхи  и  научитесь  пользоваться  файловыми  запросами  (FReq'ами),  так  как  многие  узлы  хранят  файлы,  проходившие  по  файлэхам,  в  течение  довольно  долгого  времени.  Обратитесь  к  вашему  боссу  в  случае  затруднений.  Если  же  вы  из  Интернета,  то  поисковые  машины,  такие  как  http://www.altavista.com,  http://ftpsearch.lycos.com,  а  также  крупнейший  архив  ньюсгрупп  http://www.google.com,  станут  вашими  лучшими  помощниками.  Вам  следует  также  заметить,  что  существует  определенное  количество  FTP-архивов,  содержащих  вышеупомянутые  файлэхи,  например,  ftp://bbs.ogo.ru.
       
 Само  собой,  Интернет  переполнен  ресурсами,  посвященными  Borland  Delphi.
       
 Очень  полезным  ресурсом  является  Delphi  Bug  List,  лежащий  по  адресу  http://www.dataweb.net/~r.p.sterkenburg.  Это  список  ошибок  во  всех  известных  версиях  Delphi,  адекватно  обновляемый.
       
 В  FIDO  вы  можете  подписаться  на  дружественные  эхи,  такие  как:
       
 RU.CBUILDER  -  Borland  C++Builder;
 SU.WINDOWS.PROG  -  общие  вопросы  программирования  под  MS  Windows;
 SU.WIN32.PROG  -  вопросы  программирования  для  Win32  API;
 SU.WIN95.PROG  -  вопросы  программирования  под  MS  Windows  95;
 SU.DBMS  -  базы  данных;
 SU.DBMS.SQL  -  SQL-базы  данных;
 SU.DBMS.BORLAND  -  базы  данных  фирмы  Borland;
 SU.DBMS.INTERBASE  -  SQL  сервер  фирмы  Borland  (  см.  также  http://www.ibase.ru  )
 SU.SOFTW  -  общие  вопросы  разработки  программ;
 RU.ALGORITHMS  -  вещи,  не  зависящие  от  фамилии  президента  IBM  и  текущего  номера  сервиспака  к  NT;
 SU.FLAME  -  обсуждение  превосходства  Borland  Delphi  над  всеми  прочими  средствами  разработки.

Q-10: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать?

 Для  DBD  5.0  в  файл  c:\windows\pdoxwin.ini  вставить  в  секцию
       
 [Properties]
 SystemFont=Arial  Cyr
 
 Для  DBD  7.0  нужно  исправить  реестр:  ключ
       
 HKCU\Software\Borland\DBD\7.0\Preferences\Properties\SystemFont="Fixedsys"
 
 Если  такой  ключ  не  существует,  его  следует  создать.  Впрочем,  для  просмотра  таблиц  все  равно  можно  порекомендовать  rx  Database  Explorer  --  у  него  это  получается  очень  хорошо

Q-11: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251.

 Hе  получается  открыть  таблицу,  созданную  в  InterBase  с  DEFAULT  CHARACTER  SET  WIN1251.  Оно  говорит,  что  "WIN1251  undefined".
       
 (AA):  Ставьте  Interbase  в  каталог  с  путем,  соответствующим  DOS-овским  соглашениям  об  именах  (8+3).
 
 См.  также  http://www.ibase.ru/
       

Q-12: После логина в базу данных возникает "EExternalError 0xC0000008".

 WindowsNT  4.0  +  Delphi  2.01  C/S  +  Oracle  Client  7.3  +  Oracle  Server  7.3.  После  логина  в  базу  данных  возникает  "EExternalError  0xC0000008".  Что  делать?
       
 (IA,  SK):  Снести  Oracle  Trace  Collection  Services.

Q-13: После работы программы не сохраняются изменения в базе Paradox. Что делать?

 Где-нибудь  при  закрытии  главной  формы  выполните  нижеследующие  куски  кода:
       
 Для  Delphi  3:  Table.FlushBuffers  при  открытой  таблице.
       
 Для  прочих:  Table.Open;  Check(dbiSaveChanges(Table.Handle));  Table.Close;

Q-14: Как мне упаковать Paradox или DBF таблицу?

 Функция  PackTable(Table)  из  модуля  BdeUtils  RXLib
 
 См.  также:  BDE  Online  Reference  (bde.hlp).  DbiPackTable;  DbiDoRestructure
 Example  2:  Pack  a  Paradox  (with  DbiDoRestructure)  or  dBASE  table.
       
 Для  перегенерации  индексов:
       
 Table1.Exclusive  :=  True;
 Table1.Open;
 Check(dbiRegenIndexes(Table1.Handle);

Q-15: Почему при в некоторых запросах возникает ошибка Cannot modify a read-only dataset?

 Почему  при  добавлении/изменении  записей  в  некоторых  запросах  возникает  ошибка  Cannot  modify  a  read-only  dataset?
       
 Во-первых,  должно  быть  RequestLive  :=  True;  во-вторых,  чтобы  запрос  был  редактируемым,  он  должен  удовлетворять  требованиям,  изложенным  в  помощи  при  поиске  по  "live  result  sets".

Q-16: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных?

 Смотри  в  FAQ  по  Interbase  на  http://www.ibase.ru/

Q-17: Hе получается вставить в таблицу записи со строками на русском языке

 В  Database  Desktop  поставьте  правильный  Language  Driver  у  таблицы,  например,  Pdox  ANSI  Cyrr.
 
 --------------
   Это  простой  вопрос  в  том  случае,  если  база  уже  создана  на  диске.
   Если  мы  создаем  базу  динамически  из  программы,  то  как  потом  поставить
   русский  язык  без  Database  Desktop'а?
 
   Оказывается  это  не  так  просто.  Я  перерыл  весь  инет  и  так  и  не  нашел.
   В  итоге  пришлось  потрудится  и  получилась  следующая  функция:
 
 {Устанавливает  русский  LANGDRIVER  для  таблицы  BDE  (Paradox  или  dBASE)}
 {  Таблица  должна  уже  существовать  на  диске  
     Если  вы  создаете  таблицу  динамически,
     не  забудьте  вызвать  Table.CreateTable  }
 
   procedure  SetTableRussianLanguage(Table:  TTable);
   var
       Props:  CURProps;
       hDb:  hDBIDb;
       TableDesc:  CRTblDesc;
       OptDesc:  FLDDesc;
       OptData:  array  [0..250]  of  Char;
       S:  string;
   const      //  Define  propertly  table  type  &  codepage  from  list  below
       LDName  =  'ancyrr';      //  Paradox  ANSI  Cyrillic  
       //  LDName  =  'cyrr';    //  Paradox  Cyrr  866
       //  LDName  =  'DB866ru0';  //  dBASE  RUS  cp866  
 
   begin
   //  Get  handle  (if  table  still  not  opened)
       Table.Open;
       //  Get  the  table  properties  to  determine  table  type...
       Check(DbiGetCursorProps(Table.Handle,  Props));
 
       //  Blank  out  the  structure...
       FillChar(TableDesc,  sizeof(TableDesc),  0);
       FillChar(OptDesc,  SizeOf(OptDesc),  #0);
       //  Get  the  database  handle  from  the  table's  cursor  handle...
 
       Check(  DbiGetObjFromObj(hDBIObj(Table.Handle),  objDATABASE,
                     hDBIObj(hDb)));
 
       {  If  table  name  contain  cyrillic  or  other  native  character,
             convert  name  to  OEM  }
 
       SetLength(S,  Length(Table.TableName));
       CharToOEM(PChar(Table.TableName),  @S[1]);
 
       //  Put  the  table  name  in  the  table  descriptor...
       StrPCopy(TableDesc.szTblName,  S{Table.TableName});
       //  Put  the  table  type  in  the  table  descriptor...
       StrPCopy(TableDesc.szTblType,  Props.szTableType);
       //  Set  the  Pack  option  in  the  table  descriptor  to  TRUE...
 
       StrCopy(OptDesc.szName,  'LANGDRIVER');
       OptDesc.iLen:=Length(LDName)+1;
       TableDesc.iOptParams:=1;
       TableDesc.pfldOptParams:=@OptDesc;
       TableDesc.pOptData:=@OptData;
       StrPCopy(OptData,  LDName);
 
       //  Close  the  table  so  the  restructure  can  complete...
       Table.Close;
       //  Call  DbiDoRestructure...
       Check(DbiDoRestructure(hDb,  1,  @TableDesc,  nil,  nil,  nil,  False));
   end;
 
   Sergey  Korostel                                                mailto:ksv@tut.by

Q-18: Error initializing database engine

 Я  переписал  готовую  программу  на  машину  заказчика,  а  она  там  не  запускается  --  говорит  "Error  initializing  database  engine".  Что  делать?
       
 Прочитать  X:\DELPHI\DOC\deploy.txt.

Q-19: Как правильно соединяться с базой данных под Personal Oracle?

 user/password@2:  Это  так  для  Oracle  SQL  Plus,  и  более  других  его  утилит.  А  в  BDE  надо  оставить  все  как  для  соединения  с  сетевым  сервером,  (протокол  TNS,  имя  пользователя,  кодировку,  интерфейсную  DLL)  только  вместо  имени  сервера  написать  "2:".  Это  годится  и  для  случая,  когда  на  одной  машине  и  сетевой  сервер  и  приложение.

Q-20: Большой сетевой трафик

 У  меня  в  программе  происходит  очень  большой  запрос  --  в  районе  нескольких  тысяч  или  десятков  тысяч  записей.  Соответственно,  большой  сетевой  трафик,  программа  тормозит  и  так  далее.  Можно  ли  как-нибудь  оптимизировать  это  все?
       
 Постарайтесь  изменить  логику  приложения  так,  чтобы  таких  запросов  не  возникало.  Обычно  подобные  вещи  свидетельствуют  о  несколько  неверной  архитектуре  приложения.

Q-21: Подскажите хорошую литературу по базам данных.

 1)  Мартин  Грабер  "Понимание  SQL"  (highly  recommended)
 2)  Мартин  Грабер  "SQL:  справочное  руководство"  (recommended)
 
 См.  также  Q-46  "Список  рекомендованной  литературы"
 

Q-22: Как проверить установлен ли BDE?

 var  
     reg:  TRegistry;
 ...
     reg:=TRegistry.Create;
     reg.rootkey:=HKEY_LOCAL_MACHINE;
     if  not  reg.keyexists('\SOFTWARE\Borland\Database  Engine')  then  begin
         showmessage('Для  работы  программы  R6  необходимо  установить  Borland  Database  Engine.');
         halt;
     end;
 
 в  вин95  и  вин98  работает  отлично.
 но  в  нт  говорит,  что  бде  не  установлено.  хотя  это  нет  так.
 этот  ключ  в  нт  называется  как-то  подругому?
 
 ed  sherbakoff  
 
 ----------------------------
 
   uses  bde;
   ...
   try
       dbiInit(nil);
   except
       showmessage('BDE  не  установлено!')
   end;
 
 Alex  Gorkusha  
 
 ----------------------------
 
   Uses
       bde;
   
   Var
       SV  :  SysVersion;
   ..
       If  (dbiGetSysVersion(SV)<>DBIERR_None)  or
             (SV.iVersion<400)  then  {  большая  ругань  }
 
 Вот  эти  строчки  проверяют  и  установленность  BDE  и  его  версию.
 
 Dimitry  Sibiryakov  

Q-23: Как скопировать BDE таблицу?

 Данный  пример  копирует  таблицу,  достаточно  только  указать  каталог,  имя
 исходной  таблицы  и  имя  каталога  куда  копировать  остальное  сделает  BDE,
 скопирует  таблицу,  все  индексы  и  связанные  файлы.
 
   uses  
       DB,  DBTables,  DbiProcs,  DbiErrs,  DbiTypes;
   
   procedure  CopyTable(FromDir,  SrcTblName,  ToDir,  DestTblName:
   String);
   var
       DBHandle:  HDBIDB;
       ResultCode:  DBIResult;
       Src,  Dest,  Err:  Array[0..255]  of  Char;
       SrcTbl,  DestTbl:  TTable;
   begin
       SrcTbl  :=  TTable.Create(Application);
       DestTbl  :=  TTable.Create(Application);
       try
           SrcTbl.DatabaseName  :=  FromDir;
           SrcTbl.TableName  :=  SrcTblName;
           SrcTbl.Open;
           DBHandle  :=  SrcTbl.DBHandle;
           SrcTbl.Close;
           ResultCode  :=  DbiCopyTable(DBHandle,false,
               StrPCopy(Src,FromDir  +  '\'  +  SrcTblName),  nil,
               StrPCopy(Dest,ToDir  +  '\'  +  DestTblName));
           if  ResultCode  <>  DBIERR_NONE  then
           begin
               DbiGetErrorString(ResultCode,Err);
               raise  EDatabaseError.Create('While  copying  '  +
                   FromDir  +  '\'  +  SrcTblName  +  '  to  '  +
                   ToDir  +  '\'  +    DestTblName  +  ',  the  '
                   +  '  database  engine      generated  the  error  '''
                   +  StrPas(Err)  +  '''');
           end;
       finally
           SrcTbl.Free;
           DestTbl.Free;
       end;
   end;
 
 Источник:  "David  S.  Becker"

Q-24: Как удалить BDE таблицу?

 Данный  пример  удаляет  таблицу,  достаточно  только  указать  каталог  и  имя
 таблицы,  остальное  сделает  BDE,  удалит  таблицу,  все  индексы  и  связанные
 файлы.
 
   uses
       DB,  DBTables,  DbiProcs,  DbiErrs,  DbiTypes;
   
   procedure  DeleteTable(Dir,  TblName:  String);
   var
       DBHandle:  HDBIDB;
       ResultCode:  DBIResult;
       tbl,  Err:  Array[0..255]  of  Char;
       SrcTbl:  TTable;
   begin
       SrcTbl  :=  TTable.Create(Application);
       try
           SrcTbl.DatabaseName  :=  Dir;
           SrcTbl.TableName  :=  TblName;
           SrcTbl.Open;
           DBHandle  :=  SrcTbl.DBHandle;
           SrcTbl.Close;
           ResultCode  :=  DbiDeleteTable(DBHandle,
               StrPCopy(Tbl,Dir  +  '\'  +  TblName),  nil);
           if  ResultCode  <>  DBIERR_NONE  then
           begin
               DbiGetErrorString(ResultCode,Err);
               raise  EDatabaseError.Create('While  deleting  '  +
                   Dir  +  '\'  +  TblName  +  ',  the  database  '  +
                   'engine  generated  the  error  '''  +  StrPas(Err)  +  '''');
           end;
       finally
           SrcTbl.Free;
       end;
   end;
 
 Источник:  "David  S.  Becker"

Q-25: Как получить номер записи в dBASE / Paradox

   function  FindRecordNumber  (aDataSet  :  TDataSet):  longint;
   var
     cP:  CurProps;
     rP:  RECProps;
     DBRes:  DBiResult;
   begin
     {Return  0  if  dataset  is  not  Paradox  or  dBase}
     Result  :=  0;
   
     with  aDataset  do
       begin
         if  state  =  dsInactive  then  exit;
   
         {we  need  to  make  this  call  to  grab  the  cursor's  iSeqNums}
         DBRes  :=  DBiGetCursorProps(Handle,cP);
         if  DBRes  <>  DBIERR_NONE  then  exit;
   
         {synchronize  the  BDE  cursor  with  the  dataset's  cursor}
         UpdateCursorPos;
   
         {fill  rP  with  the  current  record's  properties}
         DBRes  :=  DBiGetRecord(Handle,DBiNOLOCK,nil,@rP);
         if  DBRes  <>  DBIERR_NONE  then  exit;
   
         {what  kind  of  dataset  are  we  looking  at?}
         case  cP.iSeqNums  of
           0:  result  :=  rP.iPhyRecNum;  {dBase}
           1:  result  :=  rP.iSeqNum;        {Paradox}
         end;
       end;
   end;
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml

Q-26: Как уменьшить дату в Paradox

 В  Local  SQL  для  Paradox  имеется  ошибка,  вместо  вычитания  происходит
 сложение  даты  с  константой.
 
 //  Это  добавляет  единицу!
 UPDATE  SAMPLE.DB  SET  DT  =  DT  -  1
 
 //  а  данное  выражение  даст  правильный  результат:
 UPDATE  SAMPLE.DB  SET  DT  =  DT  +  (-1)
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml
 

Q-27: Как скопировать текущую запись

 Ниже  приведенный  код  копирует  текущую  запись
 
 {************************************************
 //  procedure  AppendCurrent
 //
 //  Written  By:  Steve  Zimmelman
 //  6/4/96
 //
 //  Version:  Delphi  2.0
 //
 //  Will  append  an  exact  copy  of  the  current
 //  record  of  the  dataset  that  is  passed  into
 //  the  procedure  and  will  return  the  dataset
 //  in  edit  state  with  the  record  pointer  on
 //  the  currently  appended  record.
 ************************************************}
   Procedure  AppendCurrent(Dataset:Tdataset);
   Var
       aField  :  Variant;
       i            :  Integer;
   Begin
       //  Create  a  variant  Array
       aField  :=  VarArrayCreate(
                                 [0,DataSet.Fieldcount-1],
                                                             VarVariant);
       //  read  values  into  the  array
       For  i  :=  0  to  (DataSet.Fieldcount-1)  Do  Begin
             aField[i]  :=  DataSet.fields[i].Value  ;
       End;
       DataSet.Append  ;
       //  Put  array  values  into  new  the  record
       For  i  :=  0  to  (DataSet.Fieldcount-1)  Do  Begin
             DataSet.fields[i].Value  :=  aField[i]  ;
       End;
   End;
 
 Источник:  Steve  Zimmelman

Q-28: Как создать dBase таблицы в runtime

 Данная  процедура  полезна  для  создания  временных  таблиц  :
 
   procedure  MakeDataBase;
   begin
       with  TTable.Create(nil)  do
       begin
           DatabaseName    :=  'c:\temp';    (*  alias  *)
           TableName          :=  'test.dbf';
           TableType          :=  ttDBase;
           with  FieldDefs  do
           begin
               Add('F_NAME',  ftString,20,false);
               Add('L_NAME',  ftString,30,false);
           end;
           CreateTable;
           {  create  a  calculated  index  }
           with  IndexDefs  do
           begin
               Clear;
               {  don't  forget  ixExpression  in  calculated  indexes!  }
               AddIndex('name','Upper(L_NAME)+Upper(F_NAME)',[ixExpression]);
           end;
       end;
   end;
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml

Q-29: Какой SQL командой можно создавать новых пользователей в InterBase

 Например,  использование  Server  Manager:  (Tasks  |  User  Security).
 ---
 Вместе  с  IB  всегда  поставляется  утилита  командной  строки  GSEC,
 которая  предназначена  для  менеджмента  пользователей  IB.
 Полное  описание  GSEC  приведено  в  Operations  Guide.
 
 Кроме  того,  всегда  можно  воспользоваться  InterBase  API  для
 этих  целей.  Функции  isc_add_user(  ),  isc_delete_user(  ),  isc_modifiy_user(  )
 работают  во  всех  версиях  IB/FB  (Firebird)
 (в  отношении  4.Х  -  не  уверен,  я  не  работал  с  ним)
 
 Для  IB  версии  6  и  выше  (а  так  же  FB),  для  архитектуры  SuperServer
 имеется  новый  API  -  "InterBase  Services  API".
 Эту  же  задачу  можно  решить  испульзуя  его.
 isc_service_start(  )  с  параметрами
         isc_action_svc_display_users
         isc_action_svc_add_user
         isc_action_svc_delete_user
         isc_action_svc_modify_user
 
 К  тому  же  в  последних  версия  IB  и  FB  вообще  отсутствует  Server  Manager.
 Вместо  него  сейчас  поставляется  IBConsole.
 Свежую  версию  можно  взять  со  страницы  автора  IBX
 http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=102
 
 Что  же  касается  Server  Manager  и  других  утилит  с  GUI  (IBConsole,  IBAdmin,
 IBExpert  и  п.т.),  то  все  они  используют  тот  или  иной  способ  из  числа  описанных
 выше.
 
 Alex  Cherednichenko.  E-mail:  cherednichenko@wo.cz

Q-30: Текущая дата на разных серверах

 Это  один  из  случаев  где  ORACLE  и  InterBase  различаются.
 
 //  Сделать  SQL  зависимым  от  типа  DBMS
 
   if  AppLibrary.Database.DriverName  =  'ORACLE'  then
       SQL.Add  ('and  entry_date  <  SYSDATE')
   else
       SQL.Add  ('and  entry_date  <  "TODAY"');
   end;
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml

Q-31: Какие индексы лучше для InterBase

 1)  Создавайте  индексы  для  всех  колонок  которые  используются  в  выражение  where  или  join,  за  исключением  полей,  для  которых  задано  ограничение  foreign  key,  т.к.  в  этом  случае  InterBase  автоматически  создаёт  соответствующий  индекс  и  дублировать  его  ещё  одним  нежелательно.
 Кроме  того,  если  по  такому  полю  уже  есть  индекс  созданный  пользователем,  то  создать  foreign  key  не  удастся.
 
 2)  Если  используется  выражение  в  ORDER  BY,  то  создавйте  составной  индекс  в
 том  же  самом  порядке  как  это  определено  в  конструкции  ORDER  BY.
 Если  часто  используется  SELECT  MAX()  по  какому-либо  полю,  то  желательно  создать  DESCENDING  индекс  по  этому  полю  (или  ASCENDING  для  SELECT  MIN()  ).
 
 3)  Если  вы  объединяете  несколько  условий  с  помощью  OR,  то  создавайте  отдельные  индексы  для  каждого  условия
 
 select  *  from  t  where  col1  =
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml
 Дополнения:  Alex  Cherednichenko.  E-mail:  cherednichenko@wo.cz
 
 См.  также  http://www.ibase.ru/

Q-32: Как узнать версию BDE

   program  BDEVersion;
   
   uses
       Forms,
       DB,
       BDE,
       Dialogs,
       SysUtils;
   
   {$R  *.RES}
   
   var
       ThisVersion  :  SYSVersion;
   begin
       DbiGetSysVersion(ThisVersion);
       ShowMessage('BORLAND  DATABASE  ENGINE  VERSION  =  '  +
   IntToStr(ThisVersion.iVersion));
   end.
 
 Check  the  BDE  version  in  your  application
 Sometimes  you  may  want  to  have  your  application  check  that  the  proper  BDE
 version  is  installed.
 Use  the  following  code,  provided  by  Richard  C  Haven:
 
 program  BDEVersion;
 
 uses
     Forms,
     DB,
     BDE,
     Dialogs,
     SysUtils;
 
 {$R  *.RES}
 
 var
     ThisVersion  :  SYSVersion;
 begin
     DbiGetSysVersion(ThisVersion);
     ShowMessage('BORLAND  DATABASE  ENGINE  VERSION  =  '  +
 IntToStr(ThisVersion.iVersion));
 end.
 
 Источник:  Richard  C  Haven:
 
 ----------------------------
 uses
     DbiTypes,  DbiProcs,  DbiErrs;
 ....
 function  fDbiGetSysVersion(SysVerList:  TStringList):  SYSVersion;
 begin
     Check(DbiGetSysVersion(Result));
     if  SysVerList  <>  nil  then
     begin
         with  SysVerList  do
         begin
             Clear;
             Add(Format('ENGINE  VERSION=%d',  [Result.iVersion]));
             Add(Format('INTERFACE  LEVEL=%d',  [Result.iIntfLevel]));
             Add(Format('VERSION  DATE=%s',  [DateToStr(Result.dateVer)]));
             Add(Format('VERSION  TIME=%s',  [TimeToStr(Result.timeVer)]));
         end;
     end;
 end;
 {from  BDE32.hlp}

Q-33: Как можно отфильтровать поле типа lookup в dataset?

 Вы  не  можете  использовать  lookup  поле  в  строке  фильтрации,  но  это
 можно  обойти  с  помощью  обработчика  события  OnFilterRecord.
 
 Источник:  http://www.delphifaq.com/fq/q0044.shtml

Q-34: Как можно узнать текущую дату/время в InterBase? (версия 5.0)

 InterBase  четыре  литерала  для  DATE.  Это:  'today',  'yesterday',
 'tomorrow'  и  'now'
 Использовать  совместно  с  cast.
 
 insert  into  mytable  values(cast('now'  as  DATE),  'Test')
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml
 
 См.  также  http://www.ibase.ru/

Q-35: Как избавиться от ошибки BDE '2B04 Too many open files'

 Открыть  'BDE  Administrator'  и  выбрать  закладку  'Configuration'.
 Затем  выбрать  'System'  и  далее  'INIT'.
 Изменить  'MaxFileHandles'  (по  умолчанию  48).
 
 Источник:  http://www.delphifaq.com/fq/q0048.shtml

Q-36: Проблемы с MDAC в W2K

 После  установки    последнего  MDACа
 http://a103.ms.a.microsoft.com/f/103/1611/2h/download.microsoft.com/download/dasdk/SP/2.61.7326.6/WIN98Me/RU/MDAC_TYP.EXE
 на  Win2000  поимел  неприятность.  Что  делать?
 
 Необходим  ADO  Update  с  сайта  http://www.borland.com
 
 А.Л.Тенцер

Q-37: Про DOA

 
 http://www.ash.hut.ru/cgi-bin/publish.pl?cat=delphi_db&article=1002379588
 
 "oraLab"  

Q-38: Как объявлять в Interbase внешние функции, написанные в Дельфи?

 Сервер  вылетает  при  попытке  вызова  функции:
 function  DatePart(AMode:  PChar;  ADate:  PChar):  integer;  StdCall;
 
 Вместо  stdcall  использовать  CDECL.  Читать  статью:
 
 http://www.ibase.ru/devinfo/udf_ok.htm
 
 Alex  Cherednichenko.  E-mail:  cherednichenko@wo.cz
 Dmitry  Kuzmenko,  Epsylon  Technologies.
 Viacheslav  Mizin.    E-mail:  mizinvv@pisem.net

Q-39: Как создать таблицу DBASE IV с полями NUMERIC(n,m)?

 Таблицу  с  нужными  полями,  рабочую  или  пустую,  используем  как  шаблон:
 
 {дизайнтайм}
   Table.TableType  :=  ttDbase;
   Table.TableName  :=  NewTableName;  //  можно  задать  имя  файла  и  путь                                                                  
 {рантайм}
   Table.CreateTable;  //  cоздается  пустая  копия  таблицы  той  же  структуры.
 
 При  указаниии  Level=7  вновь  создаваемые  таблицы  будут  иметь  этот  уровень
 вне  зависимости  от  Level  источника.
 
 Anatoly  Podgoretsky  (anatoly@podgoretsky.com)
 
 ------------------
 Создание  таблицы  DBASE/FOXPRO  с  полями  Numeric(n,  m)
 
 Общие  моменты  (для  компонента  TTable):
 1.  Поле  Numeric(n,  m)  выражается  в  Delphi  полем  ftBCD(Precision,  Size)  -  именно  так:
 Precision=n
 2.  Нулевая  величина  Size  в  коллекции  FieldDefs  в  dfm  не  записывается,  а  по  умолчанию  восстанавливается  величина  4.  Если  хочется  иметь  поля  типа  Numeric(n,  0),  описывать  поля  в  дизайнтайме  нужно  только  через  коллекцию  Fields.
 3.  Использование  драйвера  FOXPRO  всегда(?)  дает  поля  по  умолчанию  Numeric(20,  4).
 4.  Стандартные  средства  VCL  для  создания  таблиц  пользуются  назначениями  языка  драйвера,  игнорируя  попытки  изменить  их  только  для  вашей  таблицы.
 
 Способы  создания  таблиц:
 1.  С  использованием  установок  дравера  LEVEL  и  LANGDRIVER
 а)  Описать  поля  TTable  (с  учетом  "общие  моменты,  2"),  вызвать  метод
       CreateTable  (из  дизайнтайма,  рантайма,  TBatchMove).
 б)  Выполнить  запрос  типа
 
   CREATE  TABLE  "employee.dbf"
   (
     name  CHAR(15),
     salary  NUMERIC(10,2),
   )
 
 2.  С  параметром  LEVEL  не  зависящим  от  установок  драйвера
 Только  из  рантайм.  В  программе  нужно  перед  созданием  таблицы  написать
 
   Table.TableLevel  :=  4  //  или  другой,  устраивающий  вас  уровень
 
 3.  С  параметрами  LEVEL  и  LANGDRIVER  не  зависящими  от  установок  драйвера
 Только  из  рантайм.  Изучать  исходники  TTable.CreateTable.  ;)
 Пример  (личный,  переделка  TTable.CreateTable):
 
   procedure  CreateDBFTable(Tbl  :  TTable;  ADir,  AName  :  string);
   const
       idLang='db866ru0';
       idLevel=4;
   var
       TableDesc:  CRTblDesc;
       FieldDescs:  TFieldDescList;
       LvlFldDesc:  packed  array  [1..2]  of  FLDDesc;  {по  количеству  используемых  параметров}
       {для  неизвестного  количества  парметров  взять  динамический  массив}
       LOptions  :  DBINAME;
       hDb  :  hDbiDb;
   
       procedure  InitTableSettings;
       var
           PTblType:  PChar;
       begin
           FillChar(TableDesc,  SizeOf(TableDesc),  0);
           with  TableDesc  do
           begin
               AnsiToNative(Tbl.Locale,  AName,  szTblName,  SizeOf(szTblName)  -  1);
               PTblType  :=  szDBASE;
               StrCopy(szTblType,  PTblType);
                   iOptParams  :=  2;
                   StrCopy(LvlFldDesc[1].szName,  szCFGDRVLEVEL);
                   LvlFldDesc[1].iLen  :=  Length(IntToStr(idLevel));
                   LvlFldDesc[1].iOffset  :=  0;
                   StrCopy(LvlFldDesc[2].szName,  szCFGDRVLANGDRIVER);
                   LvlFldDesc[2].iLen  :=  StrLen(idLang)  +  1;
                   LvlFldDesc[2].iOffset  :=  LvlFldDesc[1].iLen;  {начало  второго  параметра}
   
                   LOptions  :=  IntToStr(idLevel)  +  #0  +  idLang  +  #0;
                   pOptData  :=  @LOptions;
                   pfldOptParams  :=    @LvlFldDesc;
           end;
       end;
   
       procedure  InitFieldDescriptors;
       var
           I:  Integer;
           TempFieldDescs:  TFieldDescList;
       begin
           with  TableDesc  do
           begin
           {содержание  InitFieldDefsFromFields  взять  из  исходников  VCL
             необходимо  для  заполнения  FieldDefs,  который  лучше  очистить
             в  дизайнтайме  из  Fields  см.  общие  замечания  2}
               InitFieldDefsFromFields;
               iFldCount  :=  Tbl.FieldDefs.Count;
               SetLength(TempFieldDescs,  iFldCount);
               for  I  :=  0  to  Tbl.FieldDefs.Count  -  1  do
               with  Tbl.FieldDefs[I]  do
               begin
                   {содержание  EncodeFieldDesc  взять  из  исходников  VCL}
                   EncodeFieldDesc  (  TempFieldDescs[I],  Name,  DataType,  Size,
                                                       Precision);
                   if  Required  then  Inc(iValChkCount);
               end;
               SetLength(FieldDescs,  iFldCount);
               pFldDesc  :=  BDE.PFLDDesc(FieldDescs);
               Check(  DbiTranslateRecordStructure(nil,  iFldCount,
                             BDE.PFLDDesc(TempFieldDescs),
                   szDBASE,  nil,  pFLDDesc,  False));
           end;
       end;
   
   begin
       Check(DbiOpenDatabase(  nil,  nil,  dbiREADWRITE,  dbiOPENEXCL,
                                                     nil,  0,  nil,  nil,  hDb));
       try
           Check(DbiSetDirectory(hDb,  PChar(ADir)));
           InitTableSettings;
           InitFieldDescriptors;
           Check(DbiCreateTable(hDb,  True,  TableDesc));
   {следующие  четыре  строки  я  использую  для  автоматического  подключения  TTable  к  созданой    таблице}
           Tbl.DatabaseName  :=  ADir;
           Tbl.TableName  :=  AName;
           Tbl.TableType  :=  ttDBase;
           Tbl.TableLevel  :=  4;
       finally
           Check(dbiCloseDatabase(hDb));
       end;
   end;
 
 Если  использовать  правильный  LANGDRIVER  вся  работа  по  локализации  таблицы  выполняется  Delphi  автоматически:  конвертирует  текстовые  данные  в  cp866  и  обратно  и  отображает  их  правильно  вне  зависимости  от  установок  драйвера.
 Если  вы  получаете  левый  DBF,  в  котором  может  быть  некорректно  прописана  кодировка,  можно  использовать  DbiDoRestructure  (пример  заполнения  параметров  приведен  в  процедуре  InitTableSettings).
 
 Андрей  Бахтин    andrew@udmnet.ru

Q-40: Как установить FireBird?

 Устанавливаем  FB  в  папку  C:\FB\  (для  примера)
 
 УСТАНОВКА  "AS  APPLICATION"
 ==========================
 Минимально  необходимый  набор  файлов  сервера:
 
 C:\FB\BIN\ibserver.exe
 C:\FB\INTL\gdsintl.dll
 C:\FB\interbase.msg
 C:\FB\isc4.gdb
 
 и  ключи  в  реестре:
 
 ==начало  файла  app.reg===
 REGEDIT4
 
 [HKEY_LOCAL_MACHINE\SOFTWARE\Borland\InterBase\CurrentVersion]
 "RootDirectory"="C:\\FB\\"
 
 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
 "InterBaseServer"="C:\\FB\\BIN\\ibserver.exe  -a"
 ==конец  файла  app.reg===
 
 Это  получилась  установка  "как  приложение".  В  Win9x  это  единственно
 возможная  установка,  и  обеспечивает  хоть  локальный,  хоть  сетевой
 доступ.  Но  под  WinNT,  W2K  такая  установка  даст  только  локальный  доступ.
 Для  сетевого  доступа  в  WinNT,  W2K  надо  ставить  FB  "как  сервис".
 
 УСТАНОВКА  "AS  SERVICE"  ПОД  WinNT,  W2K
 =====================================
 Набор  файлов  сервера:
 
 C:\FB\BIN\ibserver.exe
 C:\FB\BIN\ibguard.exe
 C:\FB\INTL\gdsintl.dll
 C:\FB\interbase.msg
 C:\FB\isc4.gdb
 
 ==начало  файла  srv.reg===
 REGEDIT4
 
 [HKEY_LOCAL_MACHINE\SOFTWARE\Borland\InterBase\CurrentVersion]
 "Version"="WI-T6"
 "DefaultMode"="-r"
 "RootDirectory"="C:\\FB\\"
 "GuardianOptions"="1"
 "ServerDirectory"="C:\\FB\\BIN\\"
 
 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InterBaseGuardian]
 "Type"=dword:00000110
 "Start"=dword:00000002
 "ErrorControl"=dword:00000001
 "DisplayName"="InterBase  Guardian"
 "ObjectName"="LocalSystem"
 "ImagePath"="C:\\FB\\BIN\\ibguard.exe"
 
 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InterBaseServer]
 "Type"=dword:00000110
 "Start"=dword:00000003
 "ErrorControl"=dword:00000001
 "DisplayName"="InterBase  Server"
 "ObjectName"="LocalSystem"
 "ImagePath"="C:\\FB\\BIN\\ibserver.exe"
 ==конец  файла  srv.reg===
 
 Можно  автоматизировать  установку:
 
 1.  Сворачиваем  необходимые  файлы  в  саморазворачивающийся  архив  fb.exe  и  кладем  его  на  дискету  (все  входит  на  1  дискету).
 2.  На  ту  же  дискету  кладем  батничек:
 
 ===начало  файла  install.bat===
 md  c:\fb
 copy  fb.exe  c:\fb\fb.exe
 c:
 cd  c:\fb
 fb.exe
 regedit  /s  app.reg
 cd  c:\fb\bin
 ibserver.exe  -a
 ===конец  файла  install.bat===
 
 Это  все.  Даже  не  нужна  перезагрузка  компьютера  после  установки.
 
 P.S.  Во  всех  случаях  клиент  -  это  всего  один  файл  -  gds32.dll
 в  папке  с  приложением,  или  в  WINDOWS\SYSTEM\
 
 Виталий  Бармин      barmin@udm.ru

Q-41: Как установить BDE?

 Для  начала  надо  прочитать:
 
 {BDE}\bdeinst.txt
 {BDE}\bdereadme.txt
 {BDE}\Readlink.txt
 {DELPHI}\deploy.txt
 
 Распространить  одну-две  копии  BDE  проще  всего  с  компакта  Delphi,  с  помощью  выборочной  установки  только  BDE.
 
 Для  массовых  установок  фирма  Борланд  рекомендует  использовать  сертифицированные  инсталляторы,  такие  как:  Install  Shield(Express),  Wise.
 Install  Shield  Express  поставляется  в  Delphi  2-5
 
 См.  также  статью:
 Merging  the  configuration  file  has  failed  
 http://community.borland.com/article/0,1410,18727,00.html  
 
 Существует  нелицензионный  путь  через  bdeinst.dll,  но  это  без  алиасов  и  SQLLink.
 
 Заметим,  что  достаточно  распространенные  методы,  связанные  с  прямым  копированием  файлов  BDE,  чреваты  многочисленными  проблемами,  которые  могут  возникнуть  как  в  текущей  работе,  так  и  при  будущих  обновлениях.

Q-42: Как установить BDE с помощью bdeinst.dll?

 Желательно  скопировать  bdeinst.dll  в  папку  WINDOWS,  упрощается  процесс  установки  как  в  первый  раз,  так  и  при  последующих  инсталляциях.
 
 Выполнить  из  командной  строки:
 
   regsvr32.exe  bdeinst.dll
   
   bdeinst.dll  находится  в  файле  bdeinst.cab,  каталог  BDE
   bdeinst.dll  распаковывается  из  bdeinst.cab  командой  extract.exe  
 
 Воробьев  Дмитрий  vorobjov@veritas.dp.ua
 A.Fionik
 
 ---
 В  папке  \Program  Files\Borland  Shared\BDE\  есть  архив  bdeinst.cab,
 распаковать  из  него  bdeinst.dll  с  помощью  extract.exe
 Скачать  Inno  Setup  http://www.jordanr.dhs.org/
 
 Hаписать  скрипт  к  нему  такого  содержания:
 
 ¦=-==    BDE.ISS    ==-=¦
 
 ;  Инсталляция  BDE  5.0  из  D4
 ;
 
 [Setup]
 Bits=32
 AppName=BDE
 AppVerName=BDE  5.0
 AppCopyright=Copyright  Inprise
 DefaultDirName={tmp}
 DefaultGroupName=BDE
 MinVersion=4,3.51
 CompressLevel=9
 DiskSpanning=1
 
 [Files]
 Source:  "BdeInst.Dll";  DestDir:  "{app}";  Flags:  regserver
 
 ¦=-==    BDE.ISS    ==-=¦
 
 Получится  полная  инсталляция  BDE  размером  около  3Мб.
 
 Создание  алиасов  программным  путем:
 
     Session1.  Active  :=  True;
     if  not  Session1.  IsAlias  ('garant')  then  begin
         Session1.  AddStandardAlias  ('garant',  ExtractFileDir  (ParamStr  (0)),  '');
         Session1.  SaveConfigFile;
         ShowMessage  ('Псевдоним  `garant`  успешно  создан!');
     end;
 
 Alexander  Trunov  (Alexander.Trunov@p1.f10.n5069.z2.fidonet.org)  

Q-43: Как добавлять алиасы и дополнительно конфигурировать BDE?

 Список  примеров:
 
 Пример  #1  создает  и  конфигурирует  алиас  (Alias)  для  использования  стандартных  баз  (.DB,  .DBF).  Алиас  затем  используется  компонентом  TTable.
 
 Пример  #2  создает  и  конфигурирует  алиас  (Alias)  для  использования  стандартных  баз  (.DB,  .DBF).  В  данном  примере  демонстрируется  как  получить  информацию  от  пользователя  для  конфигурирования  алиаса  в  run-time.
 
 Пример  #1:  Использется  базы  формата  .DB  or  .DBF  (STANDARD)
 
 1.    Создать  новый  проект.
 2.    Поместить  на  форму  следующие  компоненты:
           -  TDatabase,  TTable,  TDataSource,  TDBGrid,  и  TButton
 3.    Двойным  щелчком  по  компоненте  TDatabase  или  выбрать  Database  Editor  из  TDatabase  SpeedMenu  для  запуска  редактора  свойств  (Database  Property  editor).
 4.    Установить  свойство  DatabaseName  в  'MyNewAlias'.  Данное  имя  будет  использоваться  как  алиас  для  установки  свойств  в  компонентах  TTable,  TQuery,  TStoredProc.
 5.    Выбрать  STANDARD  для  Driver  Name.
 6.    Щелкнуть  по  кнопке  Defaults.  Это  автоматически  добавит  (при  Parameter  Overrides)  PATH=  в  секции.
 7.    Установить  PATH=  в  C:\DELPHI\DEMOS\DATA  (PATH=C:\DELPHI\DEMOS\DATA)
 8.    Щелкнуть  по  кнопке  OK  для  закрытия  диалога.
 9.    Установить  свойство  Table1.DatabaseName  в  'MyNewAlias'.
 10.  Установить  свойство  DataSet1.DataSource  в  'Table1'.
 11.  Установить  свойство  DBGrid1.DataSource  в  'DataSource1'.
 12.  Поместить  следующий  код  внутри  обработчика  Button1.OnClick:
 
   procedure  TForm1.Button1Click(Sender:  TObject);
   begin
       Table1.Tablename:=  'CUSTOMER';
       Table1.Active:=  True;
   end;
 
 13.  Запустить  приложение.
 
 ***  Если  вам  нужен  альтернативный  путь  для  шагов  3  -  11,  то  разместите  следующий  код  внутри  обработчика  Button1.OnClick.
 
   procedure  TForm1.Button1Click(Sender:  TObject);
   begin
       Database1.DatabaseName:=  'MyNewAlias';
       Database1.DriverName:=  'STANDARD';
       Database1.Params.Clear;
       Database1.Params.Add('PATH=C:\DELPHI\DEMOS\DATA');
       Table1.DatabaseName:=  'MyNewAlias';
       Table1.TableName:=  'CUSTOMER';
       Table1.Active:=  True;
       DataSource1.DataSet:=  Table1;
       DBGrid1.DataSource:=  DataSource1;
   end;
 
 Пример  #2:  Конфигурация,  определяемая  пользователем.
 
 Данный  пример  выводит  запрос  для  пользователя  и  получает  от  него  ответ  по  определению  папки  с  базой  для  конфигурирования  алиаса.
 
 Directory,  ServerName,  Path,  Database  Name,  и  другие  нужные  параметры  конфигурации  могут  быть  получены  с  помощью  диалога  от  пользователя  или  прочитаны  из  .INI  файла.
 
 1.  Выполните  шаги  (1-11)  из  примера  #1.
 2.  Поместите  следующий  код  в  обработчике  Button1.OnClick.
 
   procedure  TForm1.Button1Click(Sender:  TObject);
   var
       NewString:  string;
       ClickedOK:  Boolean;
   begin
       NewString  :=  'C:\';
       ClickedOK  :=  InputQuery('Database  Path',  
  'Path:  -->  C:\DELPHI\DEMOS\DATA',  NewString);
       if  ClickedOK  then
           begin
             Database1.DatabaseName:=  'MyNewAlias';
             Database1.DriverName:=  'STANDARD';
             Database1.Params.Clear;
             Database1.Params.Add('Path='  +  NewString);
             Table1.DatabaseName:=  'MyNewAlias';
             Table1.TableName:=  'CUSTOMER';
             Table1.Active:=  True;
             DataSource1.DataSet:=  Table1;
             DBGrid1.DataSource:=  DataSource1;
         end;
   end;
 
 3.  Запустите  приложение.
 
 См  также:  Delphi  On-line  help:  Database  Properties  Editor;  TDatabase
 
 Reid  Roman  (rkroman@home.com)
 
 ---
 См.  также:
 
 How  to  change  NET  DIR  programmatically  so  it  persists?
 http://community.borland.com/article/0,1410,23231,00.html

Q-44: Десктопный MSSQL Server.

   MSDE  1.0  -Microsoft  SQL  Server  Desktop  Engige-  несколько  огpаниченный  MSSQL  7.0,  но  менее  требовательный  к  ресурсам.  Работает  неплохо  как  на  NT,  так  и  на  win9x.
   Форматы  файлов  баз  данных  на  100%  совместимы  с  MSSQL  7.0.
   Максимальный  pазмеp  базы  около  2Гб.  Подpобности  на  http://msdn.microsoft.com/vstudio/msde/
   В  поставке  нет  GUI  tools,  но  подходят  от  MSSQL  7.0.
   Бесплатен  для  владельцев  MS  Visual  Studio  6.0  или  любого  сpедства  pазpаботки  из  комплекта  -  VC++,VB,VFP  и  Access.  
 
   Dmitri  Zakharov 2:5004/5.53
   Тенцер  А.Л. tolik@katren.nsk.ru

Q-45: Как установить клиента InterBase?

 1.  Для  Yaffil  или  FireBird  последних  билдов  -  ничего  не  надо,  кроме  gds32.dll  в  директориях  поиска  библиотек.
 
 2.  Для  IB5,  IB6  или  старого  FB  первых  билдов  -  надо  дополнительно  прописать  в  файле  services  строчку  "gds_db  3050/tcp"  {файл  должен  завершаться  пустую  строкой}.
 
 3.  Для  IB5,  дополнительно  к  п.2.,  добавить  в  ключ  реестра:
 
 HKLM\SOFTWARE\InterBase  Corp\InterBase\CurrentVersion\RootDirectory
   
 строковое  значение  -  имя  папки,  в  которой  лежит  файл  ib_license.dat
 
 4.  В  случае  медленного  подключения  клиентов  в  сети  TCP/IP  попробуйте  прописать  адреса  IB    серверов  в  файле  HOSTS.
 
 Виталий  Бармин      barmin@udm.ru

I-46: Список рекомендуемой литературы

 1.  М.  Грабер.  SQL.  Изд.  Лори,  2001.  -644с.
 {Переработанный  вариант  "Введения  в  SQL".  На  нем  еще  написано  "бестеллер  N1"}
 
 2.  М.  Грабер.  SQL  Справочное  руководство.  Изд.  Лори,  2001.
 {Переиздание,  включает  комментарии  по  SQL99.  Полезный  справочник}
 
 3.  К.  Дж.  Дейт.  Введение  в  системы  баз  данных.  7-е  издание,  Изд.  дом  "Вильямс",  2001.  -1070с.
 {Самая  правильная  книга}
 
 4.  Дейв  Энсор,  Йен  Стивенсон.  Oracle.  Проектировние  баз  данных.  К.:  Издательская  группы  BHV,  2000.  -560с.  ISBN  966-552-019-9
 
 5.  Хендерсон  К.  Руководство  разработчика  баз  данных  в  Delphi  2.  К.:  Диалектика,  1996.  -544с.,  ил.  ISBN  966-506-041-4(рус.)
 
 6.  Лишнер  Р.  Delphi.  Справочник.  СПб:  Символ-Плюс,  2001.  -640с.,  ил.  ISBN  5-93286-019-7
 {Включает  отдельные  главы  по  БД}      
 
   -  Из  электронной  библиотеки  Анатолия  Подгорецкого  http://www.podgoretsky.com
 
 1.  Alexandr  Panfilov.  Справочник  по  инструкциям  и  функциям  InterBase  SQL
 
 2.  Грачев  А.Ю.    Введение  в  СУБД  Informix
 
 3.  Краткое  практическое  руководство  разработчика  информационных  систем  на  базе  СУБД  ORACLE
 
 4.  Степанов  Ю.Л.  Разработка  приложений  баз  данных  для  СУБД  Sybase  SQL  Anywhere
 
 5.  В.В.Кириллов,  Г.Ю.Громов.  Структуризированный  язык  запросов  (SQL)
 
 --
 В  списке  отсутствует  ряд  хороших  книг  по  причине  недостаточности  выходных  данных.
 Замечания,  исправления  или  дополнения  можно  mailto:lv.t@rambler.ru

Q-47: Где найти компоненты прямого доступа к Oracle?

 SQLDirect  Component  Library  версия  2.9.2  -  библиотека  компонет  для  доступа  к
 Centura  SQLBase,  IBM  DB2,  Informix,  Interbase,  Oracle,  MS  SQL  Server,  MySQL,
 PostgreSQL,  Sybase  servers  и  ODBC  datasources.
 
 http://www.sqldirect-soft.com/
 
 Andrew  Holubovski      news@delphiplus.org
 

Q-48: Как запустить по таймеpу хpанимую пpоцедуpу InterBase6?

 Непосредственной  возможности  нет.
 Вместо  этого  пишется  программа,  которая  по  таймеру  запускает  процедуру.
 Программа  помещается  на  сервер,  где  установлен  IB.
 
 Еще  вариант,  более  универсальный:
 Пишется  скрипт  с  запуском  процедуры,  и  по  AT  (или  cron  в  unix)  на  сервере  запускается
 isql  -i  yourscript.sql.
 
 Dmitry  Kuzmenko,  Epsylon  Technologies,  www.demo.ru.

Q-49: Lock file has grown too large

 Эта  проблема  специфична  для  таблиц  форматат  Paradox,  относится  как  16
 битным,  так  и  32  битным  версиям  BDE,  и  может  встречается  при  выполнении
 одного  из  следующих  условий:
 
     1.  Исполняемый  файл  приложения  находится  в  той  же  папке,  что  и  таблица.
     2.  Некорректно  установлен  (неустановлен)  параметр  Private  Directory.
     3.  Открытая  в  TTable  таблица  Paradox  участвует  в  запросах  TQuery.
     4.  Параметр  LOCAL  SHARE  установлен  в  True  (BDE  Administrator,  закладка  "System")
 
 Для  решения  проблемы  необходимо  выполнить  следующие  шаги:
 
     1.  В  папке  с  исполняемым  файлом  приложения  создайте  три  новых  папки:
           TABLES,  PRIV  и  NET  (длина  пути  NetDir  не  должна  привышать  31  символа).
           Поместите  все  таблицы  приложения  в  папку  Tables
 
     2.  Во  время  исполнения  Ваше  приложение  должно  устанавливать  значения:
 
           Session.PrivateDir  :=  ExtractFilePath(ParamStr(0))  +  'PRIV';
           Session.NetFileDir  :=  ExtractFilePath(ParamStr(0))  +  'NET';
 
     3.  Убедитесь,  что  значение  LOCAL  SHARE  установлено  в  False
           (BDE  Administrator,  закладка  "System")
 
 Эти  рекомендации  позволяют  избежать  ошибки  "Lock  File  Too  Large".
 
 Источник:
 http://community.borland.com/article/0,1410,15256,00.html
 
 --
 Примечание:  данные  рекомендации  справедливы  для  локальных  баз,  в  случае  сетевых  баз  и/или  размещения  программы  на  сетевом  устройстве  или  при  доступе  из  нескольких  программ,  можно  поступись  следующим  образом:
 
     1.  Не  размещайте  базу  и  программу  в  одной  папке,  тем  более,  что  программу  желательно  поместить  в  защищенную  от  записи  папку.
     2.  Приватный  каталог  надо  разместить  в  персональной  папке,  желательно  для  каждой  запущенной  копии  приложения  отдельный,  подходящее  место  персональная  папка  TEMP\SessionID\
     3.  Сетевой  каталог  NETDIR  -  выделить  отдельную  папку  на  сети  исключительно  только  для  этой  цели  и  единную  для  всех  приложений  BDE
     4.  LOCAL  SHARE  -  TRUE,  можно  попробовать  и  FALSE,  если  это  не  будет  приводить  к  порче  индексов.
 
 Anatoly  Podgoretsky  

I-50: Информация о программе

 FAQ  создан  с  помощью  FAQ  Maker  ver.  1.5
 от  Анатолия  Подгорецкого
 
 Доступен  на  http://www.podgoretsky.com  или  http://nps.vnet.ee
 
 Альтернативный  источник  http://faq.delphiplus.org  -  более  быстрый  хостинг,  FAQ  центр,  хранятся  всевозможные  FAQ,  не  только  из  иерархии  FIDO7.RU.DELPHI.*