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

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

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

Сообщение VAshot »

C UIBQuery работает, но хочеться с датасет, по причине множественных изменений в одной транзакции и отображением изменений в гриде, а через Квери она автоматом проходит.

Или это не лучший вариант (множественные изменения в dataset)?
Аватара пользователя
Сергей Смирнов
энтузиаст
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва
Контактная информация:

Сообщение Сергей Смирнов »

Это извращенный путь какой-то. После FBDataSet.Append; значения параметров скорее всего пытаются автоматом заполниться и всё, что было присвоено до этого теряется. Можно попробовать переместить установку параметров между Append и Post. Но лучше всё же устанавливать значения полей, а не параметров. Разумеется, именовать параметры надо также, как поля.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

FBDataSet для указанного кода не предназначен :-)

используй TJvUIBQuery - это самое то

а ещё проще - Transaction.ExecuteImmediate(SQLText); - это вобще для разовых вставок самое то
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

[quote="VAshot"][/quote]

и правда извращенец, может так

Код: Выделить всё

FBDataSet.UpdateTransaction.StartTransaction;

FBDataSet.SQLSelect.Text:='insert into MATERIAL (ID, NAME, MATERIALTYPE, PARAMETRES) '
+'values (:IDT, :NAMET, :MATERIALTYPET) '

FBDataSet.Params.ByNameAsInteger['IDT']:=StrToInt(LeID.Text);
FBDataSet.Params.ByNameAsString['NAMET']:=LeNAME.Text;
FBDataSet.Params.ByNameAsString['MATERIALTYPET']:='gsdfgs';

FBDataSet.ExecSql;

FBDataSet.UpdateTransaction.Commit;


или хотябы так

Код: Выделить всё

FBDataSet.UpdateTransaction.StartTransaction;

FBDataSet.SQLInsert.Text:='insert into MATERIAL (ID, NAME, MATERIALTYPE, PARAMETRES) '
+'values (:IDT, :NAMET, :MATERIALTYPET) '

FBDataSet.Insert;

FBDataSet.Params.ByNameAsInteger['IDT']:=StrToInt(LeID.Text);
FBDataSet.Params.ByNameAsString['NAMET']:=LeNAME.Text;
FBDataSet.Params.ByNameAsString['MATERIALTYPET']:='gsdfgs';

FBDataSet.Post;

FBDataSet.UpdateTransaction.Commit;


но первый вариант предпочтительней.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Attid писал(а):FBDataSet.ExecSql;

Там же такого метода кажись вобще нет :-)

Attid писал(а):или хотябы так

Ага - а select запрос?

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

Сообщение Attid »

alexs писал(а):
Attid писал(а):FBDataSet.ExecSql;

Там же такого метода кажись вобще нет :-)


ой точно. надо прекращать писать сообщения ночью =)

надо добавить!

причину скажу на вскидку если у меня в приложении только один FBDataset то зачем мне еще и кверю держать это рал, а два это то что в твоем датасете нет проблем с датой,а у фибов они есть.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А чем вариант

Код: Выделить всё

Transaction.ExecuteImmediate(SQLText)

не устраивает? Вобще ничего не нужно :-)

Attid писал(а):если у меня в приложении только один FBDataset то зачем мне еще и кверю держать

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

Сообщение Attid »

не устраивает?


отсутствием параметров, потом будут разные клоуны жаловаться на СКЛиньекции =)
Аватара пользователя
VAshot
постоялец
Сообщения: 128
Зарегистрирован: 01.11.2007 11:31:21
Откуда: Пермь

Сообщение VAshot »

2 Attid

Первый вариант: FBDataSet.ExecSql; - такого же метода нет.

Второй вариант: как и ранее (что и ожидаемо :( ) сообщается, что при Post поля пустые, как и раньше.


FBDataSet.Params - для чего нужен, так и не понял.

Следующий код работает, но про параметрические запросы пришлось забыть:

Код: Выделить всё

FBDataSet.Append;
 
FBDataSet.FieldByName('ID').AsInteger:=StrToInt(LeID.Text);
FBDataSet.FieldByName('NAME').AsString:=LeNAME.Text;
FBDataSet.FieldByName('MATERIALTYPE').AsString:=CbMATERIALTYPE.Items[CbMATERIALTYPE.ItemIndex];
FBDataSet.MemoValue[FBDataSet.FieldByName('PARAMETRES')]:=MemoPARAMETRES.Lines.Text;
 
FBDataSet.Post;
 



Конструкиция

Код: Выделить всё

MS:=FMain.FBDataSet.CreateBlobStream(FBDataSet.FieldByName('PARAMETRES'),bmRead);
 

должна работать? Ругается на
umaterialedit.pas(77,87) Error: Identifier not found "bmRead"
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

VAshot
Чего ты хочеш добиться вобще?
FBDataSet предназначен для того чтобы сделать редактируемым select запрос к БД. Не стоит его использовать не по прямому назначению. Это из пушки по воробьям, и вдобавок сам себе делаеш трудности.
Если тебе просто надо вставить данные простым оператором insert без предварительной выборки данных - то используй TJvUIBQuery напрмую.

VAshot писал(а):FBDataSet.Params - для чего нужен, так и не понял.

Это нужо для передачи параметров в select запрос к БД, на вставку дангных это не влияет вобще.

VAshot писал(а):Конструкиция Код:
MS:=FMain.FBDataSet.CreateBlobStream(FBDataSet.FieldByName('PARAMETRES'),bmRead);
должна работать? Ругается на

Ну а сюда зачем ты полез (c) Гена Крокодил :-)
Этот метод предназначен длс создания потока для мемо/blob поля, и, фактически, является внутренним методом компоненты. Вызывать напрямую его не стоит. Используй

TBlobField(FBDataSet.FieldByName('PARAMETRES')).LoadFromStream и TBlobField(FBDataSet.FieldByName('PARAMETRES')).SaveToStream

PS.
Если хочеш разобраться досконально как работает FBDataSet почитай документацию в FibPlus-кому tpFIBDataSet - я именно на его функционал оринтируюсь, да и методы стараюсь также называть.
Аватара пользователя
VAshot
постоялец
Сообщения: 128
Зарегистрирован: 01.11.2007 11:31:21
Откуда: Пермь

Сообщение VAshot »

PS.
Если хочеш разобраться досконально как работает FBDataSet почитай документацию в FibPlus-кому tpFIBDataSet - я именно на его функционал оринтируюсь, да и методы стараюсь также называть.


Спасибо. Ну на конец-то я услышал где доки можно взять.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Разберёшся в FBDataSet - опиши все свои проблемы и их решение - будет и к нему документация

У меня просто на это (документация) нет времени абсолютно, да и не нужна она мне...
vital
новенький
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение vital »

alexs писал(а):
vital писал(а):при установке под Delphi 2006

У меня только 7-й дельфин
давай изменения, включу в исходники
vital писал(а):TJvUIBStoredProc

этого ещё нет

vital писал(а):Я понимаю, конечно, что D7 - это классика, но уже 5 лет прошло как-никак

он у меня официально куплен, для ведения наших задач полностью его хватает, поэтому переходить на более новый - смысла нет.


Для D2006 пакет UIB - JvUIBD10Win32R, SynEdit - SynEdit_R2006.
Кроме того, почему-то потребовалось подключать *.dcr ресурс вручную, через {$R} - турба автоматом не подцепляет.
vital
новенький
Сообщения: 86
Зарегистрирован: 17.10.2007 14:52:59

Сообщение vital »

Кстати, датасет, по ходу, подтекает - в D2006 ставлю контроль за утечками памяти, при завершении работы программы выдает:
"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"

P.S. С входящим в состав UIB датасетом TJvUIBDataSet такого не наблюдается.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

нужно ловить... может и есть такое дело
Ответить