Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.08.31;
Скачать: CL | DM;

Вниз

Как уничтожить PDataSource   Найти похожие ветки 

 
hornet   (2007-12-06 09:57) [0]

Добрый день.

Есть проца:


function TabNum(st:kolstring): kolstring;
var
 _D    : PDataSource;
 _S    : PSession;
 _Q    : PQuery;

begin
_D := NewDataSource("Provider=OraOLEDB.Oracle.1;Password=pass;Persist Security Info=True;User ID=user;Data Source=BD");
_S := NewSession(_D);
_Q := NewQuery(_S);
 TRY
   _Q.Text := "select * from table t where t.c1="""+st+"""" and rownum=1;
   _Q.Open;
   _Q.First;

   while not _Q.Eof do
   begin
        res:= Q.SField[4];
     _Q.Next;
   end;
   _Q.Close;
 FINALLY
   _Q.Free;
   _S.Free;
   _D.Final; //(вот здесь ошибка "OLE DB error 80040E05") - типа это обьект открыт еще

   _D := nil;
   _S := nil;
   _Q := nil;
 END;

 TabNum:=res;
end;


Если этого не делать, тогда все ок - но память при каждом вызове увеличивается :(
Как его убивать корректно ?

Delphi 7 + KOL версия 2.70


 
hornet   (2007-12-10 16:34) [1]

Неужели никто не работал с БД в KOL ?


> Есть проца:


Не проца естественно, а функция :)


 
ANTPro ©   (2007-12-10 17:05) [2]

> [0] hornet   (06.12.07 09:57)
> _D.Final;

Почему не Free как всегда? А вообще может надо отключиться от сервера

> [1] hornet   (10.12.07 16:34)
> Неужели никто не работал с БД в KOL ?

Я не рискнул :)


 
hornet   (2007-12-11 08:15) [3]


> Почему не Free как всегда?

Сорри, Final считать равным Free. :))


> А вообще может надо отключиться от сервера

А как отключатся ?


> Я не рискнул :)

Так я только для отчетов KOL применяю. :)


 
ANTPro ©   (2007-12-11 18:31) [4]

> [0] hornet   (06.12.07 09:57)
>   _Q.Free;
>   _S.Free;
>   _D.Final; //(вот здесь ошибка «OLE DB error 80040E05»)
> — типа это обьект открыт еще
>
>   _D := nil;
>   _S := nil;
>   _Q := nil;

Что если заменить на это? (так сделано в демке)

 _D.Free;
 _S := nil;
 _Q := nil;


 
ANTPro ©   (2007-12-11 18:45) [5]

Заглянул в деструктор PDataSource, там стоит авто разрушение обьектов которые были прицепленны к нему :)
Хотя, это OLE DB error это не уберет.


 
hornet   (2007-12-12 16:01) [6]


>
> Что если заменить на это? (так сделано в демке)
>
>  _D.Free;
>  _S := nil;
>  _Q := nil;
>

Я так уже пробовал ... не канает :(

> ...это OLE DB error это не уберет.

Точно не убирает :(


 
Jon ©   (2007-12-12 16:22) [7]

Reverse the order:


 finally
   _Q.Free;
   _S.Free;
   _D := nil;
   _D.Free;
 end;


 
Дмитрий К ©   (2007-12-12 16:23) [8]

Попробуйте объявить символ OLD_REFCOUNT


 
Vladimir Kladov ©   (2007-12-12 18:06) [9]

2Jon: if to assign nil to _D, _D.Free will do nothing. Message will disappear but leak will be there.


 
Vladimir Kladov ©   (2007-12-12 18:08) [10]

Я очень советую попробовать KOLODBC. Драйверы ODBC могут быть кривоваты, и бывает нужно искать действительно рабочий. Зато сам интрефейс с драйвером прост.


 
hornet   (2007-12-29 09:30) [11]

По совету решил попробовать KOLODBC (http://kolmck.net/Components/db/KOLOdbc.zip).
Положил KOLOdbc.pas туда же где лежит KOL.

Вместе c библиотекой идет примерчик KOLODBC. При попытке компиляции ругается, что нет модуля [Fatal Error] Unit1.pas(8): File not found: "ODBCQuery.dcu"

Ну ладно, модуль не так называется. Поменял ODBCQuery на KOLOdbc.
В Project - Options - Directories/Conditionals параметр Search path поставил путь к KOL.

К сожалению, это ни к чему хорошему не привело :(
[Error] Unit1.pas(57): Undeclared identifier: "PODBCDatabase"

с чего это ? модуль то подключен!


 
Vladimir Kladov ©   (2007-12-29 12:23) [12]

а внутрь посмотреть? Это дуальный модуль, для KOL и VCL. Опцию включить надо.


 
Артем   (2008-03-06 13:39) [13]

Что-то начало модуля KOLOdbc сразу напрягает.
uses Windows, Classes, {$IFDEF KOL}KOL, KOLmath, err
                      {$ELSE} SysUtils, Forms, Db, math{$ENDIF};

Классы? Хотел консольную программку маленькую сделать..

Но и KOLEdb тоже, мягко говоря, странный. Кстати, PDataSource.Final как раз не вызовет исключения. А вот PDataSource.Free вызывает оное. Если я все правильно понял, деструктор TDataSource должен уничтожить все сессии. А при вызове деструктора сессий вызываются и деструкторы запросов.

А может кто-нибудь пролить свет, в какой момент должна закрываться сессия в БД? Устанавливается сессия при создании TDataSource (конструктором, стало быть). В деструкторе TDataSource наблюдается следующее:
   CheckOLE( fIDBInitialize.UnInitialize );
Вот этот вот fIDBInitialize.UnInitialize и заявляет, что объект еще используется. И действительно, сессия-то установлена еще. Или данная операция как раз и должна сессию завершить? Но не может, т.к. что-то ей мешает?

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


 
Аид   (2008-05-22 06:30) [14]

Реально с классами... весь смысл КОЛ теряется... сразу минимум 400Кб в ехе внедряется... :( есть другие варианты доступа к БД? Интересует PostGreSQL


 
Dy1   (2009-08-22 12:25) [15]

таки никто не знает как решить проблему?
Прога много чего делает и нужно добавить туда БД. Модуль KOLEdb используется для обращения к .mdb, KOLComObj - для сжатия БД (не знаю можно ли сэкономить 100 кБт, которые даёт KOLComObj). Проблема в том, что функция сжатия не отрабатывает из-за ошибки освобождения PDataSource. Помогите пожалуйста, работа стоит


 
Dy1   (2009-08-22 12:49) [16]

или переписывать на вцл и получать трёхметровый ехе?

> Драйверы ODBC могут быть кривоваты, и бывает нужно искать действительно рабочий
не катит. Не хочу таскать с собой рабочие драйверы.

Есть у кого-н рабочие демки сжатия mdb и работы с этой БД?


 
Dy1   (2009-09-13 18:44) [17]

OLD_REFCOUNT не помог.
ODBC, который встроенный, не запустился.

Сжатие написано, но теперь не отрабатывает из-за PDataSource - либо ошибка, либо "база открыта". Вопрос тот же - как уничтожить, зарыть и поставить памятник?


 
Vladimir Kladov ©   (2009-09-13 20:01) [18]

Их надо не с собой таскать, а выяснить, с какой версией какого софта они идут правильные (чаще всего какой mdac накатить, или клиент sql)


 
Dy1   (2009-09-18 13:51) [19]

рабочий драйвер так и не нашёл (после проведённого опроса выяснилось, что никто KOLEdb не пользуется и почти никто - KOLODBC).
Нашёл интересную статью про особенности Делфи в области интерфейсов :/

Проблему решил почти случайно. Пока всё отлично (не считая изначально отсутствующих BLOB в KOLEdb).
Итак...


 
Dy1   (2009-09-18 14:08) [20]

в программе
uses ...KOLEdb, JRO_TLBKOL; // работа с мдб и сжатие
 JRO_TLB нашёл в инете (обрезок, где только сжатие). Работает хорошо, в отличие от оригинала.

Не помню что было, поэтому привожу кусочек
unit JRO_TLBKOL;
interface
uses ActiveKOL, ADODB_TLBKOL, KOLComObj;


следующие изменения:
в KOLEdb убрал закомментированный код,
в TSession.Destroy поменял fQueryList.Free на Free_And_Nil(fQueryList),
в TDataSource.Destroy аналогично - Free_And_Nil(fSessions).
 Вроде бы всё.

Теперь код
var DS: PDataSource;
   SS: PSession;
   QR: PQuery;

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var
 Src,Dest: WideString;
 V: JetEngine;
begin
 DS := NewDataSource( "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;" +
   "Data Source=" + GetStartDir + "dat.mdb;" +
   "Mode=Share Deny None;" +
   "Extended Properties="";" +
   "Locale Identifier=1033;" +
   "Persist Security Info=False;" );
 SS := NewSession( DS );
 QR := NewQuery( SS );
 QR.Text := "select * from topt";
 QR.Open;
//  DS.Destroy; на нём отлаживал, т.к. прежде фри не вызывался
 DS.Free;
 DS := nil;

 Src := Provider + GetStartDir + "dat.mdb;";
 Dest := Provider + GetStartDir + "d.mdb;";
 OleInit;
 try
   v := CoJetEngine.Create;
   v.CompactDatabase(Src, Dest);
 finally
   v := Nil;
   OleUnInit;
 end;

отлично работает, исчезли утечки...

Я думаю, дело в том, что нужно было приравнять списки запросов и сессий нилам и тогда интерфейс нормально освобождается



Страницы: 1 вся ветка

Текущий архив: 2014.08.31;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.008 c
2-1380735763
zibert
2013-10-02 21:42
2014.08.31
типы


2-1380886196
Rezolik
2013-10-04 15:29
2014.08.31
tClientDataSet


2-1380552472
ixen
2013-09-30 18:47
2014.08.31
Хэширование строк в SHA1


2-1381424131
Алла
2013-10-10 20:55
2014.08.31
StringGrid программно переместить выделение


15-1391169590
Несусвет
2014-01-31 15:59
2014.08.31
Что это за DELPHI-хак?