faqs.org.ru

 Главная > Программирование > Языки Pascal/Delphi >

RU.DELPHI.DB FAQ

Секция 1 из 2 - Предыдущая - Следующая

From: Leonid Troyanovsky <lv.t@eco-pro.ru>
Date: Mon, 19 Aug 2002 07:02:11 +0000 (UTC)
Subj: fido7.ru.delphi.db FAQ Оглавление

++++++++++++++++++
 Start Of Content
 Date: 19.08.02
++++++++++++++++++
I-1   Версия от 19.08.2002
I-2   Введение
I-3   Копирайты
I-4   Преамбула
I-5   О поле Subject:
I-6   Здесь не приветствуется
I-7   Доступность этого FAQ
I-8   Контрибуторы
I-9   Источники информации
Q-10  Database Desktop показывает содержимое таблиц шрифтом без русских
      букв. Что делать?
Q-11  Не получается открыть таблицу, созданную в InterBase с DEFAULT
      CHARACTER SET WIN1251.
Q-12  После логина в базу данных возникает "EExternalError 0xC0000008".
Q-13  После работы программы не сохраняются изменения в базе Paradox.
      Что делать?
Q-14  Как мне упаковать Paradox или DBF таблицу?
Q-15  Почему при в некоторых запросах возникает ошибка Cannot modify a
      read-only dataset?
Q-16  Почему не работает сортировка и функция UPPER() в Interbase'овской
      базе данных?
Q-17  Не получается вставить в таблицу записи со строками на русском
      языке
Q-18  Error initializing database engine
Q-19  Как правильно соединяться с базой данных под Personal Oracle?
Q-20  Большой сетевой трафик
Q-21  Подскажите хорошую литературу по базам данных.
Q-22  Как проверить установлен ли BDE?
Q-23  Как скопировать BDE таблицу?
Q-24  Как удалить BDE таблицу?
Q-25  Как получить номер записи в dBASE / Paradox
Q-26  Как уменьшить дату в Paradox
Q-27  Как скопировать текущую запись
Q-28  Как создать dBase таблицы в runtime
Q-29  Какой SQL командой можно создавать новых пользователей в InterBase
Q-30  Текущая дата на разных серверах
Q-31  Какие индексы лучше для InterBase
Q-32  Как узнать версию BDE
Q-33  Как можно отфильтровать поле типа lookup в dataset?
Q-34  Как можно узнать текущую дату/время в InterBase? (версия 5.0)
Q-35  Как избавиться от ошибки BDE '2B04 Too many open files'
Q-36  Проблемы с MDAC в W2K
Q-37  Про DOA
Q-38  Как объявлять в Interbase внешние функции, написанные в Дельфи?
Q-39  Как создать таблицу DBASE IV с полями NUMERIC(n,m)?
Q-40  Как установить FireBird?
Q-41  Как установить BDE?
Q-42  Как установить BDE с помощью bdeinst.dll?
Q-43  Как добавлять алиасы и дополнительно конфигурировать BDE?
Q-44  Десктопный MSSQL Server.
Q-45  Как установить клиента InterBase?
I-46  Список рекомендуемой литературы
Q-47  Где найти компоненты прямого доступа к Oracle?
Q-48  Как запустить по таймеpу хpанимую пpоцедуpу InterBase6?
Q-49  Lock file has grown too large
I-50  Информация о программе
++++++++++++++++++

------------------------------------------------------------
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 сформулированный вариант вопроса, ответ или дополнение
или исправление к ответу. Довольно важным критерием отбора ответов
является размер. Я не хочу публиковать большие куски кода, предпочитая
давать указание на источник дополнительной информации или направление
самостоятельных разработок. В любом случае, вы можете обратиться к
авторам сопутствующих проектов, список которых приведен ниже.

Разрешается свободное распространение и использование этого документа
при соблюдении определенной вежливости по отношению к автору и
читателям, основной составляющей чего является соблюдение целостности
документа. Не очень приветствуется выкладывание копий этого документа
на сайт: подумайте, нужны ли вам непрерывные усилия по синхронизации?

Если же вы вынуждены использовать этот документ на сайте, для того,
чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт?

Свежая версия этого документа находится на домашней странице Анатолия
Подгорецкого 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 в частности, а также предметной области
своей собственной задачи. Без всякого сомнения, вы можете общаться и
задавать вопросы на любом уровне, но ожидайте соответствующей реакции
извне.

Научитесь также пользоваться системой помощи, поставляемой вместе с
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. На
http://www.iarchitect.com находится большой ресурс, посвященный
вопросам построения пользовательского интерфейса.

Если вам требуется работать с нестандартным железом, подумайте о
написании драйвера. Это удобнее, проще и гибче. Соответствующая
информация находится в DDK (Device Driver Development Kit). Самая
известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo.
http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь
желаете работать с последовательными портами, то вам следует приобрести
библиотеку Async Professional фирмы Turbo Power. На
http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. На
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:  Не получается открыть таблицу, созданную в InterBase с DEFAULT
CHARACTER SET WIN1251.
------------------------------------------------------------
Не получается открыть таблицу, созданную в 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:  Не получается вставить в таблицу записи со строками на русском
языке
------------------------------------------------------------
В 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 <rc@serov.pssr.ru>

----------------------------

 uses bde;
 ...
 try
   dbiInit(nil);
 except
   showmessage('BDE не установлено!')
 end;

Alex Gorkusha <algr@ivc.tagmet.ru>

----------------------------

 Uses
   bde;

 Var
   SV : SysVersion;
 ..
   If (dbiGetSysVersion(SV)<>DBIERR_None) or
      (SV.iVersion<400) then { большая ругань }

Вот эти строчки проверяют и установленность BDE и его версию.

Dimitry Sibiryakov <SD@topol.udm.net>

------------------------------------------------------------
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

Секция 1 из 2 - Предыдущая - Следующая

Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru