FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Модератор: Модераторы

Сообщение Attid » 29.11.2007 12:04:21

vital
а какие действия ты с ним производишь ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение vital » 29.11.2007 12:15:27

Attid
Да я ещё и действий-то никаких толком производить не начал, всего лишь минимальная проверка работоспособности: на новой пустой форме TJvUIBDatabase, TJvUIBTransaction, TFBDataSet, ну и DBGrid c DataSource, понятное дело. Подключаюсь к базе, открываю небольшую таблицу(2 поля - INTEGER и SMALLINT, три записи :lol: ) SELECT запрос примитивен, как лопата: SELECT * FROM DIR
Это всё. Что только не пробовал: и датасет неактивным делал перед закрытием и от базы отключал, вобщем эксперементировал - результат тот же :) Не, оно-то может и не так страшно - винда(NT и выше) сама всё добьёт при закрытии процесса :lol: Но, некошерно как-то :)
vital
новенький
 
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение Attid » 29.11.2007 12:19:46

alexs
Код: Выделить всё
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
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение vital » 29.11.2007 12:31:50

Да не создаю я ничего руками! Чистое кнопкоформошлёпство. Никакого написания кода - кинул компоненты, настроил свойства и запрос на выборку. Всё.

P.S. Для интереса проверьте свой код на турбе, либо более ранней версии дельфы с установленным Fast Memory Manager'ом.
vital
новенький
 
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение Attid » 29.11.2007 15:14:20

vital
я тебе ничего и не говорил, просто то что ты делаешь мышкой один раз я сделал на коде 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 филда =)

дальше алекс я думаю разберется.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение alexs » 29.11.2007 23:56:11

Спасибо за диагностику - будем копать
выложил альфа-версию
в основном правки работы с int64 - спасибо Сергею Смирнову

P.S.
адрес либы теперь у меня в подписе :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение vital » 11.12.2007 17:00:04

Возник вопрос по реализации master-detail. Итак, помня о том, что функционал TFBDataSet ориентирован на образец - TpFIBDataSet, пытаюсь организовать такую связь по аналогии:
в подчинённом датасете св-ву 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 - поле связи с мастер-датасетом.
vital
новенький
 
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение Сергей Смирнов » 11.12.2007 17:22:28

Префиксы не поддерживаются. Писать так:

Код: Выделить всё
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
Откуда: Москва

Сообщение vital » 11.12.2007 17:57:11

Спасибо, буду пробовать. А каков физический смысл poFillEmptyEPFromParams, а также poAutoParamsToFields и poFetchAll? В FIB+ таковых, вроде, нет. Впрочем, по последнему есть догадка :)
vital
новенький
 
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение alexs » 11.12.2007 20:06:30

Это я долго придумывал как назвать :-)

poFillEmptyEPFromParams - Если соотвествующего поля в select запросе нет, но оно есть в мастер DataSet-е - то значение возьмём отуда.

poAutoParamsToFields - кажется это возове post если поле незаполненно, но есть параметр с таким именем - то значение возьмём из параметра (кажется так - пишу по памяти - надо в коде смотреть)

poFetchAll - Ну это совсем понятно - при открытии набора вытянуть все данные на клиента - это я специально для лукапных справочников сделал - чтобы они правильно показывали кол-во записей и скроллер правильно ставили.

vital писал(а):В FIB+ таковых, вроде, нет

Ага - это я сам уже по ходу дела придумал.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение vital » 19.12.2007 23:27:20

Сергей Смирнов писал(а):Префиксы не поддерживаются. Писать так:

Код: Выделить всё
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


Спасибо! Всё работает. Пока без видимых глюков :) А где определён префикс DETAIL_? В исходниках UIB/FBDataSet чего-то не нашёл :shock:
vital
новенький
 
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение Сергей Смирнов » 19.12.2007 23:53:06

vital писал(а):Спасибо! Всё работает. Пока без видимых глюков :) А где определён префикс DETAIL_? В исходниках UIB/FBDataSet чего-то не нашёл :shock:
Это не префикс, а псевдоним поля - см. SELECT-запрос. Никакие префиксы не поддерживаются в принципе.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение VAshot » 29.12.2007 12:52:24

При запросе данных, если есть поле Blob, оно отображается в гриде и его содержимое можно просмотреть прямо в ячейке (RxDBGrid).

Cодержимое блоба когда с сервера грузится, при запросе DataSet или при просмотре конкретного блоба?
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Сообщение alexs » 29.12.2007 13:05:36

при просмотре, причём кэшируется - повторно не грузится.
При запросе выбирается только handle для блоба
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Attid » 15.02.2008 16:33:36

alexs
сложилось ощущение что RecNo не коректно работает на больших данных, разбираться пока некогда, запиши себе глянуть, если еще раз нарвусь попробую тестовый пример сделать.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Пред.След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru