FBDataSet (библиотека доступа к данным FireBird/Interbase.)
Модератор: Модераторы
Attid
Да я ещё и действий-то никаких толком производить не начал, всего лишь минимальная проверка работоспособности: на новой пустой форме TJvUIBDatabase, TJvUIBTransaction, TFBDataSet, ну и DBGrid c DataSource, понятное дело. Подключаюсь к базе, открываю небольшую таблицу(2 поля - INTEGER и SMALLINT, три записи
) SELECT запрос примитивен, как лопата: SELECT * FROM DIR
Это всё. Что только не пробовал: и датасет неактивным делал перед закрытием и от базы отключал, вобщем эксперементировал - результат тот же
Не, оно-то может и не так страшно - винда(NT и выше) сама всё добьёт при закрытии процесса
Но, некошерно как-то 
Да я ещё и действий-то никаких толком производить не начал, всего лишь минимальная проверка работоспособности: на новой пустой форме TJvUIBDatabase, TJvUIBTransaction, TFBDataSet, ну и DBGrid c DataSource, понятное дело. Подключаюсь к базе, открываю небольшую таблицу(2 поля - INTEGER и SMALLINT, три записи
Это всё. Что только не пробовал: и датасет неактивным делал перед закрытием и от базы отключал, вобщем эксперементировал - результат тот же
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
alexs
каждый вызов отьедает 2к памяти, что-то ты там создаешь и не уничтожаешь.
проверял на венде, но думаю это без разницы
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var vNum:integer;
begin
JvUIBDataBase1.Connected:=True;
for vNum := 0 to 10000 do
with TFBDataSet.Create(self) do
try
DataBase := JvUIBDataBase1;
Transaction := JvUIBTransaction1;
SQLSelect.Text:='select 1 as test from rdb$database';
Open;
Close;
JvUIBTransaction1.Commit;
finally
Free;
end;
JvUIBDataBase1.Connected:=False;
end; каждый вызов отьедает 2к памяти, что-то ты там создаешь и не уничтожаешь.
проверял на венде, но думаю это без разницы
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
vital
я тебе ничего и не говорил, просто то что ты делаешь мышкой один раз я сделал на коде 10000 раз. и это уже проблема TFBDataSet , для меня это не критично, так как там где я использую его он используется в нескольких экземплярах, поэтому никто и не видел текучки, но по хорошему от этого надо избавиться, легче всего это будет сделать алексу =) как автору творенья. я нарисовал примерчик, минимальный пример такой :
но он кушает по 400байт за раз, что указывает на то что утечка минимум в 2х местах.
судя по данным
не освобождается минимум 2 стринг листа и минимум 1 TFieldHeader
=)
максимум 4 листа и 2 филда =)
дальше алекс я думаю разберется.
я тебе ничего и не говорил, просто то что ты делаешь мышкой один раз я сделал на коде 10000 раз. и это уже проблема TFBDataSet , для меня это не критично, так как там где я использую его он используется в нескольких экземплярах, поэтому никто и не видел текучки, но по хорошему от этого надо избавиться, легче всего это будет сделать алексу =) как автору творенья. я нарисовал примерчик, минимальный пример такой :
Код: Выделить всё
for vNum := 0 to 10000 do
with TFBDataSet.Create(self) do
try
finally
Free;
end;
но он кушает по 400байт за раз, что указывает на то что утечка минимум в 2х местах.
судя по данным
"An unexpected memory leak has occurred. The unexpected small block leaks are:
1-12 bytes: Stringx1
13-20 bytes: Stringx2
21-28 bytes: Stringx1
29-36 bytes TFieldHeaderx2"
не освобождается минимум 2 стринг листа и минимум 1 TFieldHeader
=)
максимум 4 листа и 2 филда =)
дальше алекс я думаю разберется.
Возник вопрос по реализации master-detail. Итак, помня о том, что функционал TFBDataSet ориентирован на образец - TpFIBDataSet, пытаюсь организовать такую связь по аналогии:
в подчинённом датасете св-ву DataSource присваиваю значение mastersource, dcForceOpen = True, SQLSelect -
SQLInsert -
Итог: ничего не работает
1) При выборе значение ID из мастер-датасета автоматом не подставляется
2) При вставке MAS_ID также не работает, как выяснилось после просмотра исходника, префикса MAS в FBDataSet нет(может на перспективу отложено?:) ), т.е. значение ID из мастер-датасета также не подставляется автоматом.
Вопрос: как эту самую связь организовать? Может, я чего недопонимаю
P.S. ID_DIR - поле связи с мастер-датасетом.
в подчинённом датасете св-ву DataSource присваиваю значение mastersource, dcForceOpen = True, SQLSelect -
Код: Выделить всё
SELECT * FROM ROUTE
WHERE ID_DIR = :ID
SQLInsert -
Код: Выделить всё
INSERT INTO ROUTE(ID, ID_DIR, ROUTE_INDEX, TAR_ZONE )
VALUES(:ID, MAS_ID, ROUTE_INDEX, TAR_ZONE)
Итог: ничего не работает
1) При выборе значение ID из мастер-датасета автоматом не подставляется
2) При вставке MAS_ID также не работает, как выяснилось после просмотра исходника, префикса MAS в FBDataSet нет(может на перспективу отложено?:) ), т.е. значение ID из мастер-датасета также не подставляется автоматом.
Вопрос: как эту самую связь организовать? Может, я чего недопонимаю
P.S. ID_DIR - поле связи с мастер-датасетом.
- Сергей Смирнов
- энтузиаст
- Сообщения: 595
- Зарегистрирован: 28.04.2005 13:23:25
- Откуда: Москва
- Контактная информация:
Префиксы не поддерживаются. Писать так:
чтобы поля с именем ID не было. Тогда инсерт будет:
Как другой вариант - переименовать ID в мастере.
Также надо установить свойство деталь-датасета poFillEmptyEPFromParams=True
Код: Выделить всё
SELECT ID AS DETAIL_ID, ... FROM ROUTE
WHERE ID_DIR = :IDчтобы поля с именем ID не было. Тогда инсерт будет:
Код: Выделить всё
INSERT INTO ROUTE(ID, ID_DIR, ROUTE_INDEX, TAR_ZONE )
VALUES(:DETAIL_ID, :ID, ROUTE_INDEX, TAR_ZONE)
Как другой вариант - переименовать ID в мастере.
Также надо установить свойство деталь-датасета poFillEmptyEPFromParams=True
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Это я долго придумывал как назвать
poFillEmptyEPFromParams - Если соотвествующего поля в select запросе нет, но оно есть в мастер DataSet-е - то значение возьмём отуда.
poAutoParamsToFields - кажется это возове post если поле незаполненно, но есть параметр с таким именем - то значение возьмём из параметра (кажется так - пишу по памяти - надо в коде смотреть)
poFetchAll - Ну это совсем понятно - при открытии набора вытянуть все данные на клиента - это я специально для лукапных справочников сделал - чтобы они правильно показывали кол-во записей и скроллер правильно ставили.
Ага - это я сам уже по ходу дела придумал.
poFillEmptyEPFromParams - Если соотвествующего поля в select запросе нет, но оно есть в мастер DataSet-е - то значение возьмём отуда.
poAutoParamsToFields - кажется это возове post если поле незаполненно, но есть параметр с таким именем - то значение возьмём из параметра (кажется так - пишу по памяти - надо в коде смотреть)
poFetchAll - Ну это совсем понятно - при открытии набора вытянуть все данные на клиента - это я специально для лукапных справочников сделал - чтобы они правильно показывали кол-во записей и скроллер правильно ставили.
vital писал(а):В FIB+ таковых, вроде, нет
Ага - это я сам уже по ходу дела придумал.
Сергей Смирнов писал(а):Префиксы не поддерживаются. Писать так:Код: Выделить всё
SELECT ID AS DETAIL_ID, ... FROM ROUTE
WHERE ID_DIR = :ID
чтобы поля с именем ID не было. Тогда инсерт будет:Код: Выделить всё
INSERT INTO ROUTE(ID, ID_DIR, ROUTE_INDEX, TAR_ZONE )
VALUES(:DETAIL_ID, :ID, ROUTE_INDEX, TAR_ZONE)
Как другой вариант - переименовать ID в мастере.
Также надо установить свойство деталь-датасета poFillEmptyEPFromParams=True
Спасибо! Всё работает. Пока без видимых глюков
- Сергей Смирнов
- энтузиаст
- Сообщения: 595
- Зарегистрирован: 28.04.2005 13:23:25
- Откуда: Москва
- Контактная информация:
