![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Неактивный пользователь
Пол:
Регистрация: 11.09.2008
Сообщений: 31
Репутация: 0
|
Подскажите как сделать полноценный insert из delphi через FIB в firebird в blob-поле.
insert нужно делать через DataSet. Сколько находил статей так везде рассматривается или отдельно загрузка данных в blob-поле через loadfromfile или рассматривают только insert, а таких чтоб данные в таблицу грузились комплексно (вся строка сразу) - нет. желательно конечно примерчик. |
|
|
|
| Реклама: | тарелки в аренду москва | нужно ли удалять зубы мудрости для элайнеров | руки вверх бьюти с билетом - redkassa.ru | Мебельный магазин: стол круглый купить на кухню - Переходи на сайт! | Мебельный магазин: уличная мебель из металла - Переходи на сайт! |
|
|
#2
|
|
Пользователь
Пол:
Регистрация: 11.03.2008
Сообщений: 158
Репутация: 33
|
А чем стандартный (у фибов) пример не устраивает:
http://devrace.com/ru/fibplus/articles/2261.php CREATE TABLE BIOLIFE ( ID INTEGER NOT NULL, CATEGORY VARCHAR (15) character set WIN1251 collate WIN1251, COMMON_NAME VARCHAR (30) character set WIN1251 collate WIN1251, SPECIES_NAME VARCHAR (40) character set WIN1251 collate WIN1251, LENGTH__CM_ DOUBLE PRECISION, LENGTH_IN DOUBLE PRECISION, NOTES BLOB sub_type 1 segment size 80, GRAPHIC BLOB sub_type 0 segment size 80); SelectSQL: SELECT * FROM BIOLIFE UpdateSQL: UPDATE BIOLIFE Set ID=?NEW_ID, CATEGORY=?NEW_CATEGORY, COMMON_NAME=?NEW_COMMON_NAME, SPECIES_NAME=?NEW_SPECIES_NAME, LENGTH__CM_=?NEW_LENGTH__CM_, LENGTH_IN=?NEW_LENGTH_IN, NOTES=?NEW_NOTES, GRAPHIC=?NEW_GRAPHIC WHERE ID=?OLD_ID InsertSQL: INSERT INTO BIOLIFE( ID, CATEGORY, COMMON_NAME, SPECIES_NAME, LENGTH__CM_, LENGTH_IN, NOTES, GRAPHIC ) VALUES ( ?NEW_ID, ?NEW_CATEGORY, ?NEW_COMMON_NAME, ?NEW_SPECIES_NAME, ?NEW_LENGTH__CM_, ?NEW_LENGTH_IN, ?NEW_NOTES, ?NEW_GRAPHIC ) DeleteSQL: DELETE FROM BIOLIFE WHERE ID=?OLD_ID RefreshSQL: SELECT * FROM BIOLIFE WHERE ID=?OLD_ID Соотвественно обращение идет через TBlobField pFIBDataSet1.Edit; TBlobField(pFIBDataSet1.FieldByName('GRAPHIC')).Lo adFromFile(OpenD.FileName); pFIBDataSet1.Post; соответственно смотрим TBlobField и видим: ms-help://borland.bds5/delphivclwin32/!!MEMBERTYPE_Methods_DB_TBlobField.html Есть методы (кроме чтения/записи в файл) чтения и записи в поток: procedure LoadFromStream(Stream: TStream); procedure SaveToStream(Stream: TStream); Добавлено через 3 минуты >таких чтоб данные в таблицу грузились комплексно (вся строка сразу) - нет. ------ Как ты себе это представляешь? В одной текстовой SQL строке? Такое вроде как невозможно. Делаешь инсерт как на примере, в местах где у тебя болбы - ставишь параметры. А затем в эти поля записываешь содержимое блобов (если не из файла, то из потока) Последний раз редактировалось LuceferAB; 08.11.2008 в 11:52.. Причина: Добавлено сообщение |
|
|
|
|
|
#3
|
|
Неактивный пользователь
Пол:
Регистрация: 11.09.2008
Сообщений: 31
Репутация: 0
|
этот хелп я изучил на оффсайте.
но вопрос в том как в параметр записать работу с потоком FIBPlus - очень замудрённый компонент. так вот хотелось бы примерчик увидеть. как вот это pFIBDataSet1.Edit; TBlobField(pFIBDataSet1.FieldByName('GRAPHIC')).Lo adFromFile(OpenD.FileName); pFIBDataSet1.Post; затолкать вот сюда ?NEW_GRAPHIC при этом где находится сам инсерт? может есть у кого примерчик готовый, чтоб можно было проверить и поэксперементировать |
|
|
|
|
|
#4
|
|
Пользователь
Пол:
Регистрация: 11.03.2008
Сообщений: 158
Репутация: 33
|
С инсертом тоже самое. Ты для таблиц, не содержащих блоб поля куда инсерт в датасете запихиваешь? Вот туда же и пихай. Для блоб соответственно поля можешь не указывать. Файрберд по умолчанию должен их налами сделать. А в тексте соответственно будет что-то типа
pFIBDataSet1.Insert; TBlobField(pFIBDataSet1.FieldByName('GRAPHIC')).Lo adFromStream(mySrcStream); ... и т.д. Т.е. вставляешь строку, а потом отдельно записываешь туда содержимое блобов. Создай тестовый пример, и запость тот кусок кода где у тебя что-то не получается. |
|
|
|
| Сказали спасибо: |
|
|
#5
|
|
Неактивный пользователь
Пол:
Регистрация: 11.09.2008
Сообщений: 31
Репутация: 0
|
я с Dataset ещё не работал
с fibplus связался буквально несколько недель назад. а инсерт делал через database.экзекут('insert...............') - если не ошибаюсь. через датасет пока не получилось сделать ни одного инсерта, потому что примеры какие-то все однобокие. |
|
|
|
|
|
#6
|
|
Неактивный пользователь
Пол:
Регистрация: 11.09.2008
Сообщений: 31
Репутация: 0
|
спасибо, наконец дошло
|
|
|
|
|
|
#7
|
|
Пользователь
Пол:
Регистрация: 11.03.2008
Сообщений: 158
Репутация: 33
|
Так бы и написал, что новичок, я бы тогда проще написал.
![]() Добавлено через 4 минуты У датасета есть свойства SQL - в одном случае для отображения данных, и ещё набор SQL команд для модификации данных - инсерт, апдейт, делит. В этом особой разницы нет, что ты используешь фибы, хоть уибы (есть такие бесплатные компоненты для ФБ), хоть стандартные компоненты. Поищи где-нибудь готовые примеры - хоть те что идут в комплекте с фибами. Или где-нибудь на SQL.ru или в каком-нибудь королевстве дельфи. Последний раз редактировалось LuceferAB; 11.11.2008 в 02:06.. Причина: Добавлено сообщение |
|
|
|
|
|
#8
|
|
Неактивный пользователь
Пол:
Регистрация: 11.09.2008
Сообщений: 31
Репутация: 0
|
insert получилось сделать всё нормально. спасибо.
но вопрос такой. если мне нужно в insert сделать подзапрос: insert into table (cel1, cel2, cel3) values (знач1, знач2, (select cel1 from table2 where....)); а условия в where сделать переменными попробовал так и вписать в инсерт. говорит что полей учавсвующих в where нет. в этой таблице нет, в другой есть и она указана. в лоб такой запров выполняется. как вписать его в dataset |
|
|
|
|
|
#9
|
|
Пользователь
Пол:
Регистрация: 11.03.2008
Сообщений: 158
Репутация: 33
|
зачем так сложно? Ты что хочешь сделать в итоге?
Может проще написать хранимую процедуру, которой будешь передавать параметры, она будет читать селект в переменные, а потом эти переменные, с учетом переданных параметров запихивать инстером куда тебе нужно. Или на триггерах это сделать? |
|
|
|
|
|
#10
|
|
Неактивный пользователь
Пол:
Регистрация: 11.09.2008
Сообщений: 31
Репутация: 0
|
хранимые процедуры не держал в руках ни разу
тригер один и то на форуме скинули хотя впоследствии отказался от тригера и выполнил попроще всё - опять же алгоритмы с форума а нужно мне следующее: есть данные, которые нужно занести в таблицу. в колонках присутствуют данные, которые меняются в зависимости от человеческого фактора, по-этому сделал ещё одну таблицу в которой храню настройки "человеческого фактора", т.е. один чел забил данные по своему, а потом через мнемоники настроенные под него все данные распакуются правильно, а потом от другого пользователя используя другие мнемоники распаковывается опять всё правильно. и вот этот подзапрос как раз используя имя группы мнемоник и данных настроенных под человека преобразует значение в универсальное и заносит в таблицу. другой пользователь со своими настройками зайдёт и увидит данные со своими настройками. |
|
|
|
|
|
#11
|
|
Пользователь
Пол:
Регистрация: 11.03.2008
Сообщений: 158
Репутация: 33
|
Поищи в интернете о хранимых процедурах. (вот например: http://www.delphikingdom.ru/asp/view...?catalogid=409 )
Вот мой последний пример. (создается в SQL при создании базы) SET TERM ^ ; CREATE PROCEDURE CALCULATEZP (in_order_id integer) as declare variable curmult double precision; declare variable curworkerid integer; declare variable totpart double precision; declare variable jobcost double precision; begin select sum(cost) from jobs where order_id=:in_order_id into :jobcost; select sum(mult) from teams where order_id=:in_order_id into :totpart; for select worker_id, mult from teams where order_id=:in_order_id into :CURWORKERID, :curmult do begin update teams set make= :curmult * :jobcost / :totpart where (worker_id = :CURWORKERID) and (order_id = :in_order_id); end suspend; end^ SET TERM ; ^ Тут значит in_order_id - параметр, который передается на вход процедуры. Все переменные внутри процедуры записываются через двоеточие, например: select worker_id, mult from teams where order_id=:in_order_id into :CURWORKERID, :curmult по указанному наряду у меня выбираются рабочие и коэф-ты их зарплаты. (далее я в цикле перебираю всех рабочих и расчитываю их зарплтау по этому заказу с учетом коэф-та) Саму такую процедуру можно использовать как в других SQL выражениях (в селекте, в инсерте), так и индивидуально. У фибов есть такая возможность - сейчас название компонента не скажу, поищи. У него должно быть свойство execute, и возможность задавать параметры... |
|
|
|
|
|
#12
|
|
Новичок
Пол:
Регистрация: 09.12.2008
Сообщений: 7
Репутация: -1
|
Кто работал с BatchInput/BatchOutput ?
|
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Нужна информация по работе с Firebird в Delphi 7 (желательно через IBX) | Krabik | Delphi | 6 | 24.02.2010 16:09 |
| помогите снять Insert correct SIM card с SE w200 | monstr77 | Прошивки и прошивальщики | 1 | 21.02.2010 02:41 |
| Винда не грузится — disk boot failure insert... | tematika | Скорая помощь | 5 | 13.01.2010 17:17 |
| PHP и MySql insert into для чайника | vovapetr | PHP | 5 | 14.02.2008 07:35 |
|
|