Автор: admin | 14.12.2007 в 2:14 | Рубрики: BDE, Базы данных

Типичная ошибка! BDE это не поддержка alias! компоненты Дельфи такие как Table, Query, Database - почти вообще ничего не делают! - это только удобный интерфейс к BDE. Т.е. BDE реально читает и пишет в базы данных, обнавляет файлы, управляет транзакциями, сортирует данные, исполняет SQL запросы. BDE с одной стороны имеет BDE Admin для ее управления, а с другой API, которые и использует Дельфи в компонентах. Если вам надо обойтись без BDE вы должны использовать другие драйвера доступа к базам данных: ODBC, DAO, ADO, RDO - многие из них имеют свои API или COM интерфейсы которые вы можете использовать (напрямую, либо найти компоненты для этого, кроме того ADO входит в стандартную поставку дельфей, но через него приконнектится к парадоксу довольно затруднительно). Если же все эти драйвера вас не устраивают то вам надо написать свой драйвер к базе данных (можно прямо в коде программы), он должен обеспечивать:

Чтение и запись базы
Поддержка транзакций
Исполнение SQL запросов
Поддержка индексов и ключей
Поддержка многопользовательского доступа.
Стандартный набор API которые позволят подключаться компонентам типа Table, Query
Есть так же сторонние библиотеки для доступа к базам данных через свои собственные драйвера: HALCYON, или Апполо (Предложил МММ);

vkDBF- компонент для работы с ДБФ для Дельфы6/5 без БДЕ.(Предложил Free)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, BDE, ExtCtrls;

type
TMainForm = class(TForm)
PriorBtn: TBitBtn;
Panel2: TPanel;
NextBtn: TBitBtn;
Label3: TLabel;
CountryEdit: TEdit;
Label1: TLabel;
CapitalEdit: TEdit;
procedure PriorBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure NextBtnClick(Sender: TObject);
private
hDB: hDBIDB;
hCur: hDBICur;
CursProps: CurProps;
RecBuf: pByte;
FValue: array[0..255] of Char;
IsEmpty: Bool;
procedure OnBDEError;
public
end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.OnBDEError;
var ErrInfo: dbiErrInfo; //Структура, содержащая информацию об ошибках
AStr: string;
begin
DbiGetErrorInfo(True, ErrInfo); //Функция возвращает информацию об ошибке
case ErrInfo.iError of
9733: AStr := ‘Для создания записи недостаточно параметров ‘;
10024: AStr := ‘Ошибка доступа к данным’;
10245: AStr := ‘База данных занята другим пользователем’;
10038: AStr := ‘Значение поля задано неверно’;
11871: AStr := ‘Несоответствие типов’;
11959: AStr := ‘В выражении отсутствует оператор GROUP BY’;
else
AStr := ‘Ошибочная операция с данными’;
end;
ShowMessage(AStr);
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
hDB := nil;
hCur := nil;
DbiInit(nil); // Инициализация системы BDE
DbiOpenDatabase // Открытие базы данных
(
‘DBDEMOS’, // Псевдоним базы данных
nil, // Тип базы данных
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
nil, // Пароль
0, // Число дополнительных параметров
nil, // Перечень полей для доп. параметров
nil, // Список доп. параметров
hDB // Дескриптор базы данных
);
DbiSetPrivateDir(’c:\temp’); // Определение временного каталога
DbiOpenTable // Открытие таблицы
(
hDB, // Дескриптор базы данных
PChar(’COUNTRY’), // Название таблицы
PChar(szParadox), // Тип таблицы (только для локальных БД)
nil, // Название индекса (необязательный)
nil, // IndexTagName - только для dBASE
0, // 0 - использовать первичный индекс
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
xltField, // Режим трансляции данных
False, // Признак одностороннего перемещения курсора
nil, // Дополнительные параметры
hCur // Дескриптор курсора таблицы
);
DbiGetCursorProps // Определение параметров курсора
(
hCur, // Дескриптор курсора таблицы
CursProps // Структура параметров курсора
);
GetMem(RecBuf, CursProps.iRecbufSize * SizeOf(Byte)); // Выделение памяти под буфер записи
DbiSetToBegin(hCur); // Установка курсора в начало набора данных
DbiGetNextRecord // Перемещение на первую запись
(
hCur, // Дескриптор курсора таблицы
dbiNoLock, // Режим ограничения доступа
RecBuf, // Буфер записи
nil // Параметры записи
);
DbiGetField // Получение значения поля
(
hCur, // Дескриптор курсора таблицы
1, // Номер поля в структуре таблицы
RecBuf, // Буфер записи
@FValue, // Переменная, в кторую передается значение
IsEmpty // Признак пустой ячейки
);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
finally
FreeMem(RecBuf); // Освобождение памяти буфера записи
DbiCloseCursor(hCur); // Закрытие курсора
DbiCloseDatabase(hDB); // Закрытие базы данных
DbiExit; // Закрытие сеанса работы с BDE
end
end;

procedure TMainForm.PriorBtnClick(Sender: TObject);
begin
try
if DbiGetPriorRecord(hCur, dbiNoLock, RecBuf, nil) = DBIERR_BOF
then PriorBtn.Enabled := False
else
begin
if not NextBtn.Enabled then NextBtn.Enabled := True;
DbiGetField(hCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except
OnBDEError;
end;
end;

procedure TMainForm.NextBtnClick(Sender: TObject);
begin
try
if DbiGetNextRecord(hCur, dbiNoLock, RecBuf, nil) = DBIERR_EOF
then NextBtn.Enabled := False
else
begin
if not PriorBtn.Enabled then PriorBtn.Enabled := True;
DbiGetField(hCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except
OnBDEError;
end;
end;

end.

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Использование BDE32-приложений в Peer-To-Peer сети

Сетью Peer-To-Peer (сеть, где каждая машина действует как клиент и как сервер) может быть одна из следующих сетей, включая другие сетевые платформы, совместимые с ними:

Windows 95
Windows NT
Lantastic
Netware Lite
BDE автоматически обнаруживает таблицы на сетевом диске, но он не может их определить на dedicated сервере или server/client. Dedicated-сервера уведомляют приложение клиента о том, что файл был изменен или заблокирован. Данная функциональность отсутствует в Peer-To-Peer (не-dedicated) сетях. Для ее включения в сетях Peer-To-Peer, установите “LOCAL SHARE” в TRUE в BDE Configuration Utility на странице System. Это должно быть сделано на всех клиентах BDE, которые имеют доступ к таблицам в сетях, указанных выше. В случае файловых серверов Novell данное требование не является необходимым. Читать полностью…

Кто такие бармаглоты? - Обожатели Borland’a.

Этот материал основан на изучении документации и справочных материалов по BDE и на собственном опыте. На самом деле информация из этого документа частично появлялась и раньше как в FAQ Borland так и в материалах других авторов (в частности Epsylon Technologies). Однако до сих пор большое количество разработчиков используют BDE. Но в последнее время все больше людей работают с SQL-серверами, и более популярными становятся компоненты прямого доступа - IBObjects/FreeIBComponents/IBExpress, Direct Oracle Access и другие. Кроме того, BDE не будет поддерживать Interbase 6.0 (диалект 3), да и вообще похоже, прекратит свое существование. В Delphi 6 наряду со старым BDE и в Kylix (Delphi и C++Builder для Linux) будет использоваться другая библиотека - dbExpress. Поэтому, чтобы поставить жирную точку (или крест, как хотите) на BDE, я и решил написать этот документ.
Читать полностью…

Фильтрация

Фильтрация TTable и TQuery происходит с учетом живого или мертвого кэша. Для TTable при наложении фильтра конструируется соответствующий SQL-запрос, а TQuery производит фильтрацию буквально при помощи Locate (т.е. сначала выбираются все записи в кэш, а затем идет фильтрация уже в кэше).

О вреде UNIQUE constraint

В Interbase уникальность поля можно обеспечить тремя способами: создать первичный ключ, создать unique constraint, и создать уникальный индекс. Но при чем здесь Interbase? А при том, что BDE открывает TTable по умолчанию с использованием уникального индекса. Если таблица одновременно содержит как первичный ключ, так и unique constraint, то в результате у таблицы 2 уникальных индекса. При обращении к списку индексов TTable берет для сортировки по умолчанию первый попавшийся. Если уникальность поля обеспечивается обычным уникальным индексом, то проблем нет. А вот если та же уникальность обеспечивается через UNIQUE constraint, то при backup/restore базы данных есть шанс что порядковые номера индексов поменяются (поскольку для IB это constraint целостности), и BDE будет брать в качестве первого попавшегося индекс от unique constraint вместо индекса от primary key. Вреда от этого, в общем, никакого нет, но в результате это вызывает нежелательный порядок сортировки по умолчанию в приложениях.
Читать полностью…

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Тема: BDE и Database Desktop Locking Protocol

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

Предварительные условия
Базовые знания или интерес к протоколам блокировки Paradox и форматам таблиц.

Цель
Дать пользователям лучшее понимание протокола блокировки таблицы.

Таблицы, типы полей и поддерживаемые характеристики
Каждый следующий выпуск Paradox, начиная с версии 2.0, содержал улучшения структуры таблицы. Все типы таблиц Paradox, начиная с Paradox 1.0 и заканчивая Paradox 3.5, совместимые друг с другом.
Читать полностью…

Оформил: DeeCo

Автор: Александр Шпихернюк

Все идет к тому, что BDE в ближайшее время окончательно сдаст позиции компонентам прямого доступа к данным (IBX, dbExpress).
Но все наработанное с использованием BDE сразу не перепишешь и не выбросишь. Компоненты прямого доступа существенно расширяют возможности разработчика.
Недавно понадобилось напрямую работать с буфером записей запроса (TQuery), если бы можно было использовать IBQuery проблем бы с этим не возникло, но буфер записей BDE закрыт и просто до него не достучаться.
Задача стояла следующая: в БД (Interbase) при работе с достаточно большой таблицей появилась необходимость при навигации в ReadOnly DBGrid и нажатию короткой клавиши отмечать записи для отложенной печати (поле SOST := 1).
Данная задача решается несколькими способами: Читать полностью…

Больница совершила недопустимую операцию и будет закрыта…

Данный совет показывает как в Delphi 2.01 можно использовать функцию BDE DbiCallBack для получения значения линейки прогресса при длительных пакетных операциях, связанных с движением данных.

Дополнительная документация, описывающая вызовы функций BDE, находится в файле BDE32.HLP (расположенном в каталоге, где установлен 32-битный IDAPI).

При создании функций обратного вызова BDE, BDE будет осуществлять “обратный вызов” функций вашего приложения, позволяя тем самым извещать ваше приложение о происходящих событиях, а в некоторых случаях передавать информацию обратно BDE.
Читать полностью…

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Автор: Nomadic

Из беседы юзеров: “Как включить Windows, не включая компьютер?”

BDE: под Windows, все версии.
Если Вы обнаружите, что Вы ограничены более строго, чем здесь описано, или Вы получаете ошибку выхода за пределы доступной памяти, то увеличение параметра SHAREDMEMSIZE в BDE Config до 4096 или более может способствовать снятию более строгих ограничений.
Здесь указаны максимальные ограничения для некоторых общих обьектов BDE.
Читать полностью…

Session.AddAlias(AliasName, AliasDriver, Params);
Session.SaveConfigFile;

Автор: admin | в 2:14 | Рубрики: 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;

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

uses BDE;

{Without the Registry:}

procedure TForm1.Button1Click(Sender: TObject);
var
ThisVersion: SYSVersion;
begin
DbiGetSysVersion(ThisVersion);
ShowMessage(’BORLAND DATABASE ENGINE VERSION = ‘ + IntToStr(ThisVersion.iVersion));
end;

{With the Registry:}

function GetBDEVersion: string;
var
h: hwnd;
ptr: Pointer;
proc: TSYSVerProc;
ver: SYSVersion;
idapi: string;
reg: TRegistry;
begin
try
reg.RootKey := HKEY_CLASSES_ROOT;
reg.OpenKey(’CLSID\{FB99D710-18B9-11D0-A4CF-00A024C91936}\InProcServer32′, False);
idapi := reg.ReadString(”);
reg.CloseKey;
finally
reg.Free;
end;
Result := ‘‘;
h := LoadLibrary(PChar(idapi));
if h <> 0 then
try
ptr := GetProcAddress(h, ‘DbiGetSysVersion’);
if ptr <> nil then
begin
proc := ptr;
Proc(Ver);
Result := IntToStr(ver.iVersion);
Insert(’.', Result, 2);
end;
finally
FreeLibrary(h);
end;
end;

Автор: Mark Edington

Если вы хотите узнать, как работает программа, а деморолика и описания нет. Просто посадите за клавиатуру кошку - вы узнаете все документированные и недокументированные возможности.

Существует обратный вызов (callback) BDE, который вы можете использовать для получения уведомлений об изменении таблиц Paradox. Тем не менее от вас все же потребуется использование таймера. Функция обратного вызова инициируется при вызове функций, осуществляющих доступ к таблице. Ниже приведен код, демонстрирующий технику работы с описанным выше обратным вызовом:
Читать полностью…

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Автор: Eryk Bottomley

Возможно ли установить параметр MAXFILEHANDLES в IDAPI.CFG посредством Delphi?

Да. Следующий компонент показывает как это можно сделать (а также изменить другие параметры):

Читать полностью…

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Автор: Rob Edgar

…из исходного кода VCL я обнаружил, что при назначении значения DB-полю, имеющему строковый тип, значение “проходит” через функцию ANSItoNative, что может привести к изменению (порче) ASCII-данных. Вот так…

Как 16-, так и 32-битные версии IDAPI.CFG устанавливаются с драйвером языка Paradox ‘ascii’.

Я создал простое приложение, записывающее в db-поле значения ASCII в диапазоне 0-255 и затем проверяющее их на предмет появившихся различий….. различия между 16- и 32-битной версией не так велики… для примера… в первых 130 значениях получается следующее преобразование:

16-бит: 21->182 22->167 31->33 130->128
32-бит: 130->128
Очевидно достаточно просто “исправить” 32-битные приложения, чтобы добиться такого же результата, что и получаемые 16-битными приложениями, НО я не уверен что решив проблему на моем PC, я решу ее у остальных пользователей, поскольку могут отличаться установки, драйверы языка… и пр.
После того как я проверил все возможные варианты, я составил таблицу и занес туда пять возможных значений, которые могут отличаться под Delphi2 и Delphi1:

Значение ASCII Delphi1 Delphi2
21 182 21
22 167 22
33 31 33
132 102 132
255 121 255

Автор: admin | в 2:14 | Рубрики: 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;

Error 109: Error 108.

Информация, описывающая условия возникновения ошибки BDE, может быть получена приложением с помощью исключения EDBEngineError. Перехват и обработка в приложениях исключений EDBEngineError осуществляется с помощью конструкции try..except. При наступлении исключения EDBEngineError должен быть создан объект EDBEngineError, различные поля в котором могут быть использованы программистом для определения источника ошибки и принятия решения по исправлению ситуации. Для данного типа исключения может генерироваться более чем одно сообщение об ошибке. Для получения нужной информации необходимо “проиграть” все сообщения.
Читать полностью…

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Если .EXE-файл расположен в том же каталоге, что и таблица Paradox, и флажок Local Share установлен в TRUE, .LCK-файл с каждым запросом растет как на дрожжах. Другая условие - вы имеете соединение посредством DbiOpenTable или TTable.Open.

РЕШЕНИЕ:

Установите частный (private) каталог в какое-нибудь другое место
Переместите .EXE-файл в каталог, отличный от каталога с файлами таблиц
Установите Local Share в FALSE

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

unit Findbde;

interface

implementation
uses
Controls, SysUtils, WinTypes, WinProcs, Dialogs;

var
IdapiPath: array[0..255] of Char;
IdapiHandle: THandle;

initialization

GetProfileString(’IDAPI’, ‘DLLPath’, ‘C:\’, IdapiPath, 255);
{следующие строки “изолируют” первый путь к каталогу
из IdapiPath в случае, если их несколько}
if Pos(’;', StrPas(IdapiPath)) <> 0 then
begin
StrPCopy(IdapiPath, Copy(StrPas(IdapiPath), 1,
Pred(Pos(’;', StrPas(IdapiPath)))));
end;
IdapiHandle := LoadLibrary(StrCat(IdapiPath, ‘\IDAPI01.DLL’));
if IdapiHandle < HINSTANCE_ERROR then
begin
if MessageDlg(’ОШИБКА: Borland Database Engine (IDAPI) не найдена’ +
‘перед следующей попыткой ее необходимо установить….’,
mtError, [mbOK], 0) = mrOK then
Halt
end
{ IDAPI в системе не установлена }
else
begin
FreeLibrary(IdapiHandle);
{ IDAPI Установлена в системе }
end;

end.

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Я просто установил DtopicsP v1.20 и DtopicsD (03-29-96). При запуске dtopics.exe возникает ошибка DB-Error $3E05 (’cannot load driver’) (не могу загрузить драйвер).

Я нашел ответ в German Borland Forum. Ошибка происходит, если установлен German BDE. В этом случае в систему устанавливается вместо IDR10009.DLL (который присутствует в английской версии) файл IDR10007.DLL. После установки данного файла в каталог IDAPI все заработало как часы.

Это означает, что приложения, разработанные под English Delphi не будут работать под German или French Delphi.

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Приведенный текст является цитатой из документа Borland TI2751, Jan 23rd, 1995:

Вот ТЕКУЩИЕ максимальные ограничения для некоторых общих объектов IDAPI. В следующей версии они могут быть другими.

48 // Максимальное число клиентов в системе
32 // Максимальное число сеансов для клиента
32 // Максимальное число открытых баз данных для сессии
32 // Максимальное число загруженных драйверов
64 // Максимальное число сеансов для системы
4000 // Максимальное число курсоров для сессии
100 // Максимальное число паролей для сессии
16 // Максимальное число входов в стеке ошибок
127 // Максимальное число блокировок данного типа в данной таблице
// BLOB дескрипторов на курсор

Paradox: максимально (16, в различное время два BLOB-поля
таблицы)
dBASE: в различное время два BLOB-поля
таблицы

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

На дисках Дельфи в каталоге BDE есть файл bdeinst.cab
Делаешь в командной строке C:\>extract.exe \bdeinst.cab
Из кабинетника выпаковывается bdeinst.dll
Эту DLL переносишь куда тебе надо и там делаешь:
regsvr32.exe [path]\bdeinst.dll

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

Соединили програмисты холодильник с компом. Ну, все нормально работает. Открывают дверцу и ставят в холодильник кастрюлю с борщом. Противный голос из холодильника:
- Обнаружена кастрюля, красная, 5 литровая, борщ свежесваренный, будете устанавливать?

program InstallPrfSt;

{
Программа иллюстрирует, как установить BDE с поддержкой PARADOX 7.0
на “чистой машине” и создать алиас.
Пример использования в качестве простейшего инсталлятора для программы
C:\MyDir\MyProg.exe
1.Создайте каталог C:\MyDir\BDE и скопируйте в него след. файлы:
CHARSET.BLL
OTHER.BLL
IDAPI32.CFG
BLW32.DLL
IDAPI32.DLL
IDBAT32.DLL
IDPDX32.DLL
IDR20009.DLL
IDSQL32.DLL Читать полностью…

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

uses Bde;

function BDEInstalled: Boolean;
begin
Result := (dbiInit(nil) = 0)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if BDEInstalled then
ShowMessage(’BDE is installed.’)
else
ShowMessage(’BDE is not installed.’)
end;

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

uses
BDE;

function CheckBDEInstalled: Boolean;
begin
Result := (dbiInit(nil) = DBIERR_NONE)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckBDEInstalled then
ShowMessage(’BDE is installed.’)
else
ShowMessage(’BDE is not installed.’)
end;

Виртуальная любовь.
Любимая! Я инсталлировался в тебя по уши. Ты переформатировала все мои мозги. В моей оперативной памяти еще не было ничего подобного. Моя винда глючит. При виде тебя у меня повышается тактовая частота, и винт увеличивается в объеме. Давай создадим с тобой директорию. Но сначала - романтический ужин при зажженных экранах. Можешь сама вызвать меню. Лично я предпочитаю CD-ром, но обещаю не перезагружаться. А потом мы отправимся на твой сайт. Или на мой. Мы откроем друг другу свои файлы. Я войду и выйду, войду и выйду. Без всяких зависаний. Вот увидишь, тебе понравится мой драйвер. И не беспокойся за свою материнскую плату, у меня есть антивирусы. Главное - не забывай вовремя сохраняться. Тебе нужно подумать? Хорошо. Когда будешь готова, кликни два раза, и я тут как тут. Только пожалуйста, как можно реже используй свою саундкарту. Тогда у нас с тобой будет полный и взаимный апгрейд.

Проверить реестр:

with TRegistry.create do
begin
Rootkey := HKEY_LOCAL_MACHINE;
OpenKey(’SOFTWARE\BORLAND\DATABASE ENGINE’, false);
CFGFile := ReadString(’CONFIGFILE01′);
Free;
end;

Компания Microsoft выпустила новую игру под названием Windows 2001. Цель игры - как можно за меньшее количество попыток установить её!

Читаем ключ в реестре:

RootKey := HKEY_LOCAL_MACHINE;
OpenKey(`SOFTWARE\Borland\Database Engine`, False);
try
s := ReadString(`CONFIGFILE01`);
//BDE установлена
finally
CloseKey;
end;

Следующая функция получает структуру SysVersion и записывает результаты в stringlist.

uses dbierrs, DBTables;

function fDbiGetSysVersion(SysVerList: TStringList): SYSVersion;
var
Month, Day, iHour, iMin, iSec: Word;
Year: SmallInt;
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]));
Check(DbiDateDecode(Result.dateVer, Month, Day, Year));
Add(Format(’VERSION DATE=%s’, [DateToStr(EncodeDate
(Year, Month, Day))]));
Check(DbiTimeDecode(Result.timeVer, iHour, iMin, iSec));
Add(Format(’VERSION TIME=%s’, [TimeToStr(EncodeTime
(iHour, iMin, iSec div 1000, iSec div 100))]));
end;
end;
end;

Вызов этой функции выглядит следующим образом:

var
hStrList: TStringList;
Ver: SYSVersion;
begin
hStrList:= TStringList.Create;
try
Ver := fDbiGetSysVersion(hStrList);
except
ShowMessage(’BDE not installed !’);
end;
ShowMessage(IntToStr(Ver.iVersion));
Memo1.Lines.Assign(hStrList);
hStrList.Destroy;
end;

Возможные резултаты (отображаемые в memo-поле):

ENGINE VERSION=500
INTERFACE LEVEL=500
VERSION DATE=09.06.98
VERSION TIME=17:06:13

Автор: admin | в 2:14 | Рубрики: BDE, Базы данных

…я так понимаю, что LocalShare относится к ситуации, когда другие не-IDAPI приложения могут одновременно иметь доступ к одним и тем же файлам…

Примерно на такие мысли наталкивает поставляемая документация… к сожалению это не так.

LOCALSHARE=False говорит BDE о том, что он должен сам решать при необходимости вопрос о блокировке таблицы/записи в типичных ситуациях, например, когда BDE ‘думает’ что таблица находится на локальном диске он выключает блокировку для увеличения скорости доступа. К сожалению, логические диски общего пользования в сетях ‘p-t-p’ программно идентифицируются как локальные с предсказуемо липовыми результатами. Установка LOCALSHARE=True заставляет блокирующий механизм ‘включаться’ для всех дисков и, следовательно, решает эту проблему.