Изключете BDE от кода

Имаме наследено приложение, което използва BDE. (BDE продължава да работи изненадващо добре, предвид възрастта си).

Има моменти, когато нашето приложение трябва да манипулира папки (преименуване, преместване и т.н.), но .NET или .LCK файл остава отворен в папката, предотвратявайки това. Не успяхме да намерим таблица или заявка, която все още е отворена в нашия код.

Освен че нашата програмна обвивка е към програма, която не е BDE и самата тя се прекратява, има ли програмен начин да изключим BDE, което би отключило тези файлове.

Стандартни откази от отговорност: Да, BDE е мъртъв. Да, трябва да мигрираме към по-модерна база данни. Да, някой ден BDE просто няма да работи повече. С почти 2 милиона реда наследен код, мигрирането (дори с донякъде съвместима с plug-in платформа като Sybase Advantage) не е евтин проект, поради което все още не сме го направили...


person RobertFrank    schedule 19.04.2012    source източник


Отговори (2)


Обикновено не трябва да правите нищо конкретно, за да изключите BDE.
Всички BDE сесии се освобождават в раздела за финализиране на DBTables. Това ще затвори всичко и когато сесията по подразбиране също бъде унищожена, ще извика DbiDLLExit, ако е необходимо, след това DbiExit, и двете от BDE модула.

Сега, ако искате да изключите BDE преди, предлагам да имитирате частите за финализиране и след това за инициализация на DBTables (отказ от отговорност: ограничено тестване, използвайте внимателно...) като:

procedure BDEKill;
begin
// from finalization
  Sessions.Free;
  Sessions := nil;
end;

procedure BDEReStart;
begin
// from initialization
  Sessions := TSessionList.Create;
  Session := TSession.Create(nil);
  Session.SessionName := 'Default'; { Do not localize }
end;

и го използвайте като:

BDEKill;
try
  // move my folders
finally
  BDEReStart;
end;
person Francesca    schedule 19.04.2012
comment
Въпреки че не всички елементи във вашия примерен код (и код за финализиране) бяха видими в интерфейса DBTables, променливата Sessions беше. Използвайки само тази променлива, успях да отключа въпросните файлове. Благодаря, Франсоа! - person RobertFrank; 20.04.2012
comment
+1: @François сега, след като кодът е тестван, не мислите ли, че публикацията трябва да бъде освежена? - person menjaraz; 20.04.2012
comment
@menjaraz, кодът е изчистен! (Дори уволни BDEAdmin, за да го тества; за първи път от години!) - person Francesca; 20.04.2012

Отключването на файл е друго възможно (екстремно) решение на вашия проблем:

Предлагам ви да проучите изходния код на Отключване на файл от opc0de.


Цитат:

Твърде често даден файл не може да бъде изтрит, защото се използва от друго приложение. Този инструмент ви позволява да отключите този файл за изтриване.


Изглед и усещане:

Отключване на файл от opc0de


Характеристики:

  • Отключи файл
  • Отключване и изтриване файл
  • Вижте кои процеси използват файла
  • Прекратете процесите, които използват файла

Връзка за изтегляне:

person menjaraz    schedule 19.04.2012
comment
Съжалявам, вече изтрих коментарите си... Тази дискусия доведе до несвързана тема. Моето мнение е, че бих предпочел да използвам това, ако естествената форма на BDE (публикувана от François) не работи ;-) - person TLama; 20.04.2012
comment
@TLama: Прав си. Най-чистият и елегантен начин за решаване на проблем с BDE е да се използва всяка възможност, предоставена от самия BDE. Отключването на файл е последно решение, въпреки че работи и дори се препоръчва в някои екстремни случаи. Благодаря ви за вашите прозрения. - person menjaraz; 20.04.2012