Конференция: fido7.ru.delphi.db
FAQ для конференции fido.ru.delphi.db, основано на FAQ от Алексея Махоткина.
В основном сохраняется вся политика по ведению данного FAQ
Copyright (C) Alexey Mahotkin 1997-1999
Portion Copyright (C) Anatoly Podgoretsky, 2001
Ответы на вопросы Copyright (C) авторы ответов
Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации.
Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом.
* обсуждение вопросов, не относящихся к базам данных, для этого специально существует другие конференции RU.DELPHI, RU.DELPHI.INTERNET, RU.DELPHI.REPORTS. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации.
* обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций.
* обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc.
* общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему.
Этот документ регулярно изменяется в результате отслеживания происходящего в 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.
Остерегайтесь подделок.
Список людей, внесших свой вклад в создание этого 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 и в дальнейшем изменяться не будет, может за исключение особых случаев.
Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию.
Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном 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 над всеми прочими средствами разработки.
Для 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 -- у него это получается очень хорошо
Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined".
(AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3).
См. также http://www.ibase.ru/
WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать?
(IA, SK): Снести Oracle Trace Collection Services.
Где-нибудь при закрытии главной формы выполните нижеследующие куски кода:
Для Delphi 3: Table.FlushBuffers при открытой таблице.
Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close;
Функция 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);
Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset?
Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets".
Смотри в FAQ по Interbase на http://www.ibase.ru/
В 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
Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать?
Прочитать X:\DELPHI\DOC\deploy.txt.
user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение.
У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все?
Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения.
1) Мартин Грабер "Понимание SQL" (highly recommended)
2) Мартин Грабер "SQL: справочное руководство" (recommended)
См. также Q-46 "Список рекомендованной литературы"
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
Данный пример копирует таблицу, достаточно только указать каталог, имя
исходной таблицы и имя каталога куда копировать остальное сделает 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"
Данный пример удаляет таблицу, достаточно только указать каталог и имя
таблицы, остальное сделает 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"
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
В Local SQL для Paradox имеется ошибка, вместо вычитания происходит
сложение даты с константой.
// Это добавляет единицу!
UPDATE SAMPLE.DB SET DT = DT - 1
// а данное выражение даст правильный результат:
UPDATE SAMPLE.DB SET DT = DT + (-1)
Источник: http://www.delphifaq.com/fq/q0048.shtml
Ниже приведенный код копирует текущую запись
{************************************************
// 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
Данная процедура полезна для создания временных таблиц :
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
Например, использование 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
Это один из случаев где 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
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/
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}
Вы не можете использовать lookup поле в строке фильтрации, но это
можно обойти с помощью обработчика события OnFilterRecord.
Источник: http://www.delphifaq.com/fq/q0044.shtml
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/
Открыть 'BDE Administrator' и выбрать закладку 'Configuration'.
Затем выбрать 'System' и далее 'INIT'.
Изменить 'MaxFileHandles' (по умолчанию 48).
Источник: http://www.delphifaq.com/fq/q0048.shtml
После установки последнего 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
А.Л.Тенцер
http://www.ash.hut.ru/cgi-bin/publish.pl?cat=delphi_db&article=1002379588
"oraLab"
Сервер вылетает при попытке вызова функции:
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
Таблицу с нужными полями, рабочую или пустую, используем как шаблон:
{дизайнтайм}
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
Устанавливаем 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
Для начала надо прочитать:
{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, чреваты многочисленными проблемами, которые могут возникнуть как в текущей работе, так и при будущих обновлениях.
Желательно скопировать bdeinst.dll в папку WINDOWS, упрощается процесс установки как в первый раз, так и при последующих инсталляциях.
Выполнить из командной строки:
regsvr32.exe
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)
Список примеров:
Пример #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
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
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
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
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
Непосредственной возможности нет.
Вместо этого пишется программа, которая по таймеру запускает процедуру.
Программа помещается на сервер, где установлен IB.
Еще вариант, более универсальный:
Пишется скрипт с запуском процедуры, и по AT (или cron в unix) на сервере запускается
isql -i yourscript.sql.
Dmitry Kuzmenko, Epsylon Technologies, www.demo.ru.
Эта проблема специфична для таблиц форматат 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
FAQ создан с помощью FAQ Maker ver. 1.5
от Анатолия Подгорецкого
Доступен на http://www.podgoretsky.com или http://nps.vnet.ee
Альтернативный источник http://faq.delphiplus.org - более быстрый хостинг, FAQ центр, хранятся всевозможные FAQ, не только из иерархии FIDO7.RU.DELPHI.*