Форум: "Базы";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
ВнизПочему не освобождается база Найти похожие ветки
← →
JohnBurg (2002-10-02 22:18) [0]Подскажите что делаю не правильно.Все обрезано.
TT:Ttable;
TT.create(self);
tt.open;
какие то операции;
tt.close;
tt.free;
потом не закрывая приложения пытаюсь подключиться к этой же базе из другой программы - результат file locked.
если выхожу из первой то все работат.
Но я же закрыл базу и освободит таблицу.
← →
MsGuns (2002-10-02 22:23) [1]Что-то из приведенного фрагмента вообще непонятно, как что-то может вообще открыться. А как же св-ва ТОЛЬКО ЧТО СОЗДАННОГО вами объекта TTable.TableName, не говоря уже о DataBaseName и пр. ?
И вообще, компонента TTable и физ.таблица - это ДВЕ РАЗНЫЕ ВЕЩИ !
← →
MsGuns (2002-10-03 00:07) [2]Дополнение
В приведенном примере Вы закрыли ДОСТУП К ТАБЛИЦЕ из компоненты, с нею связанной. БД Вы не закрыли вообще.
Причин наличия "левой" блокировки может быть несколько:
- С данной физ.таблицей связан еще один или более КУРСОРОВ (т.е. компонентов, производящих обмен данными с физ.таблицей БД)
Один из них, например, сам Дельфи с Вашим проектом, из которого Вы делали запуск. Если, конечно, в проекте (Disign mode) есть одна или более компонент типа TQuery и особенно TTable, у которых с св-ве Active стоит true.
- Предыдущий прогон программы завершился аварией и Вы вернулись в режим Design ДО того, как выполнился опрератор закрытия таблицы.
- Параллельно с дельфей у Вас болтается в активных окнах что-то вроде DataBase DeskTop или SQL - эксплорер, которые Вы, возможно, использовали для визуального контроля результатов работы программы.
- Таблица банально оказалась занятой другим юзером, сидящим, может быть, в соседней комнате.
← →
MsGuns (2002-10-03 00:15) [3]Дополнение 2
Совсем забыл про св-во TTable.Exclusive.
А вообще советую работать с Paradox-таблицами через алиасы и TDatabase. Удобно при необходимости управлять всем собранием таблиц. Кроме того, работая с BDE и Paradox не забывайте про PrivateDir. Для каждой сессии (а сессий будет создано как минимум столько, сколько у Вас запущено прог плюс одна для дельфей) должен быть свой PrivateDir, тогда проблем будет намного меньше. Кроме того, для сети позаботьтесь дополнительно о 2-х вещах:
Путь к PdoxUsrs.net должен быть одинаков на всех компах
Алиасы на каждом компе должны указывать на один каталог с БД (идеально - на файл-сервере), даже если у них (алиасов) разные имена !
← →
Mike Kouzmine (2002-10-03 10:04) [4]TT:Ttable;
TT.create(self);
tt.open;
А так можно?
← →
Max Zyuzin (2002-10-03 10:16) [5]>MsGuns
Скорее всего JohnBurg написал не весь код. Т.к. он работать в таком виде не будет.
>JohnBurg
Вы еще какие нибудь компоненты связыываете с TTable?
← →
JohnBurg (2002-10-03 12:28) [6]вот весь аналогичный код.Правда это кусок из DLL а про то что я писал там в форме но аналогично.BDE поидее использутся но через необходимые DLL которые лежат в каталоге с программой.На машине нет вообще установленного BDE.TTable.Create(nil) или TTable.Create(self) результат одинаковый база не освобождается.
Мне не нужно с базой работать мне нужно закачать из нее данные и все а потом не выходя из этой программы зайти в ту которая с базой работает.
library SSSS;
uses
Classes,
Windows,
Dialogs,
Forms,
SysUtils,
Math,
dbtables,
StdCtrls;
{$R *.res}
function MakeFile(FileIn,FileIn1:String; Translate:boolean): Boolean; stdcall ;
var
i:Integer;
FileOut:String;
ListOut:TStrings;
PLTable: TTable;
begin
Result:=false;
ListOut:=TStringList.Create;
FileOut:=ChangeFileExt(FileIn, ".OUT");
application.ProcessMessages;
try
PLTable:=TTable.Create(nil);
PLTable.DatabaseName:=ExtractFileDir(FileIn);
PLTable.TableName:=ExtractFileName(FileIn);
PLTable.TableType:=ttParadox;
PLTable.Open;
for i:=1 to PLTable.RecordCount do
begin
ListOut.Add(PLTable.FieldByName("MedicCode").AsString+";");
ListOut.Strings[i-1]:= ListOut.Strings[i-1]+PLTable.FieldByName("NAME").AsString+";";
ListOut.Strings[i-1]:= ListOut.Strings[i-1]+PLTable.FieldByName("MadeIn").AsString+";";
ListOut.Strings[i-1]:= ListOut.Strings[i-1]+PLTable.FieldByName("Ostat").AsString+";";
ListOut.Strings[i-1]:= ListOut.Strings[i-1]+PLTable.FieldByName("PRICE").AsString;
PLTable.Next;
end;
PLTable.Close;
finally
application.ProcessMessages;
ListOut.SaveToFile(FileOut);
Result:=True;
PLTable.Free;
ListOut.Free;
end;
end;
← →
MsGuns (2002-10-03 12:47) [7]>application.ProcessMessages;
Как я понял, процесс сам по себе не заканчивается и его должны терминэйтить извне. Т.е. таблица как бы не закрывается, пока не будет завершена программы, вызвавшая его. Интересный подход, однако ! Ну по процессам я не мастак пока, а по поводу блокировки скажу, что так делать нельзя, хотя бы потому, что неясны остаются св-ва Exclusive для таблицы и уровень изоляции для БД (из-за отсутствия управления Базой данных в целом). Да и вообще не соблюдался ППТ ("принцип посещения туалета") - сделал свое дело - убрал за собой, т.е. прочитал всю таблицу-закрыл ее и освободил БД. Короче, хотите надежную работу с таблицей на сети - перепишите эту процедуру или создайте новую. Этой же пользоваться не рекомендую. Разве что как чисто локально
← →
JohnBurg (2002-10-03 21:24) [8]application.ProcessMessages
ничего не делает и его можно вообще от сюда выкинуть
Exclusive:=false тоже ничего не дает.
Использовать локально я и хочу.
Задача на одном компе две программы одна моя которая берет а потом закидывает данные в ту которая не моя.Когда происходит закидывание то та программа закрыта.Но по окончании закидывания нужно обязательно закрыть мою программу что бы та программа которая не моя нормально открылась.А мне надо избавиться от этого закрытия.
И вообще paradox такая туфта скажу я вам.Вот и мучаюсь.
← →
MsGuns (2002-10-03 21:27) [9]>JohnBurg (03.10.02 21:24)
>И вообще paradox такая туфта скажу я вам.Вот и мучаюсь.
А Вы уверены, что туфта Paradox ?
← →
kampiler (2002-10-03 21:37) [10]нужно использовать TDatabase и закрывать его.
а не
PLTable.DatabaseName:=ExtractFileDir(FileIn);
PLTable.TableName:=ExtractFileName(FileIn);
Тогда db-файл будет доступен.
> А Вы уверены, что туфта Paradox ?
я уверен что не туфта
← →
MsGuns (2002-10-03 21:48) [11]>kampiler (03.10.02 21:37)
>я уверен что не туфта
Я ему в первом же посте сказал и про DataBase и про сессию, но видно ему это не надо. Хочется рубить все узлы одним взмахом !
Флаг в руки, а древко известно куда ! Пусть ставит Oracle, может будет не туфта ?
← →
JohnBurg (2002-10-03 23:58) [12]Но до Oracle я не дотяну.Уж больно муторно его администрировать да и не нужны такие объемы.Вот IB это вещь.
Но ладно к теме.А этот самый DataBase можно использовать без BDE
Я же вроде писал что на машине не мтавлю БДЕ
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c