Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что такое со вставкой во View? [D6, FB]


mOOx_ ©   (2003-11-26 13:41:00) 

Долго рассусоливать не буду. Вот проблема: база на ФБ. Есть таблица, где документы храняться
CREATE TABLE DOCS_DATA (
KEY_DOC DMN_PK,
KEY_DOCTYPE DMN_FK,
KEY_ADDER DMN_FK,
ADDER_INFO DMN_INFO,
FILENAME DMN_STR0 NOT NULL,
TITLE DMN_STR2 NOT NULL,
INFORMATION DMN_INFO,
DOC_CRDATE DMN_DATE DEFAULT "NOW" NOT NULL,
DOC_MFDATE DMN_DATE DEFAULT "NOW" NOT NULL,
LOCKED DMN_BOOL DEFAULT "0" NOT NULL,
DATA DMN_DATA NOT NULL
);

ALTER TABLE DOCS_DATA ADD PRIMARY KEY (KEY_DOC);

ALTER TABLE DOCS_DATA ADD CONSTRAINT FK_DOCS_DATA FOREIGN KEY (KEY_ADDER) REFERENCES STAFF_USERS (KEY_EMPLOYEE) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCS_DATA ADD FOREIGN KEY (KEY_DOCTYPE) REFERENCES DOCS_DOCTYPES (KEY_DOCTYPE) ON DELETE SET NULL ON UPDATE CASCADE;

Ввод на прямую в нее запрещен, так что все манипуляции через следующую въюху:
CREATE VIEW DOCS_DATA_MY(
KEY_DOC,
KEY_DOCTYPE,
FILENAME,
TITLE,
INFORMATION,
DOC_CRDATE,
DOC_MFDATE,
LOCKED,
DATA)
AS
SELECT
DD.KEY_DOC,
DD.KEY_DOCTYPE,
DD.FILENAME,
DD.TITLE,
DD.INFORMATION,
DD.DOC_CRDATE,
DD.DOC_MFDATE,
DD.LOCKED,
DD.DATA
FROM DOCS_DATA DD
WHERE
EXISTS (
SELECT DA.KEY_AUTHOR
FROM DOCS_AUTHORS DA,STAFF_USERS SU,DOCS_DATA DD
WHERE DD.KEY_DOC=DA.KEY_DOC AND
DA.KEY_EMPLOYEE=SU.KEY_EMPLOYEE AND
SU.USERNAME=USER
);

На эту въюху есть следующий триггер
CREATE TRIGGER TR_DATA_MY_INSERT FOR DOCS_DATA_MY
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE USERID INTEGER;
BEGIN
EXECUTE PROCEDURE PROC_GETUSERID RETURNING_VALUES (USERID);
NEW.DOC_CRDATE="NOW";
NEW.DOC_MFDATE="NOW";
NEW.KEY_DOC=1;
NEW.LOCKED=0;
INSERT INTO DOCS_DATA (
KEY_DOC,
KEY_DOCTYPE,
FILENAME,
TITLE,
INFORMATION,
DOC_CRDATE,
DOC_MFDATE,
DATA,
LOCKED)
VALUES (
NEW.KEY_DOC,
NEW.KEY_DOCTYPE,
NEW.FILENAME,
NEW.TITLE,
NEW.INFORMATION,
NEW.DOC_CRDATE,
NEW.DOC_MFDATE,
NEW.DATA,
NEW.LOCKED
);
END

Так вот трабл:
insert into DOCS_DATA_MY(KEY_DOCTYPE,FILENAME,TITLE,INFORMATION,DATA)
values (:01,:02,:03,:04,:05);
Этот запрос выдает ошибку Invalid BLOB ID.
Для справки:
CREATE DOMAIN DMN_DATAAS
BLOB SUB_TYPE 0 SEGMENT SIZE 8192
Господа. Это уже не просьба, а крик души!!! Заколебался. В чем я не прав?


mOOx_   (2003-11-27 13:50:00) [1]

Вообщем, всем спасибо за участие. Я переделал этот момент по другому. Теперь вроде работает. А баг, похоже, действительно от ФБ. Ладно, до поры, до времени не буду добавлять через въюхи.


Michail Dalakov   (2003-11-26 21:15:00) [2]

Извините, имелось ввиду все себя вести


Michail Dalakov   (2003-11-26 21:13:00) [3]

Если старая версия проги работает нормально на существующей версии CУБД, могу посоветовать попробовать как будет это все себя без секции
WHERE
EXISTS () во VIEW


Zacho   (2003-11-26 19:50:00) [4]


> mOOx_ © (26.11.03 19:34) [10]

Да причем здесь твой код. Говорю же, это баг в FB. Правда, не помню, только в FB 1.5RC7 или и в FB 1.0.x он тоже присутствует. Так что или жди, пока исправят (а происходит это обычно весьма быстро, раз уж баг обнаружен) или откатывайся на более старую версию FB (на FB 1.0.3 ?)


mOOx_   (2003-11-26 19:34:00) [5]

Спасибо за совет, но: скачал последнюю версию ФБ. Таже фигня. Вообще нефига не понимаю!!!!!!!!!!!!????????????
Привоже код добавления:
Pars:=TParams.Create;
Pars.Add;
Pars[Pars.Count-1].Name:="01";
Pars.ParamValues["01"]:=SGDocAttr.Tag;
Pars.Add;
Pars[Pars.Count-1].Name:="02";
Pars.ParamValues["02"]:=Arr[1];
Pars.Add;
Pars[Pars.Count-1].Name:="03";
Pars.ParamValues["03"]:=Arr[2];
Pars.Add;
Pars[Pars.Count-1].Name:="04";
Pars.ParamValues["04"]:=Arr[3];
Pars.Add;
Pars[Pars.Count-1].Name:="05";
Pars.ParamByName("05").LoadFromFile(Arr[0],ftBlob);

DB_.ExecQuery(SetOfQuery[qiAddDoc],Pars);
Pars.Free;

Процедура ExecQuery имеет следующий вид (урезанный конечно):

procedure TDB.ExecQuery(SQLQuery: string; AParams: TParams;NumOfDataSet: integer = 0);
begin
try
...
Queries[CurDataSet].Query.Close;
Queries[CurDataSet].Query.SQL.Clear;
Queries[CurDataSet].Query.SQL.Add(SQLQuery);

if Assigned(AParams) then
begin
Queries[CurDataSet].Query.Prepare;
Queries[CurDataSet].Query.Params.AssignValues(AParams);
end;

if UpperCase(Copy(SQLQuery,1,6)) = "SELECT" then
begin
...
end
else
begin
Queries[CurDataSet].Query.ExecSQL;
if Queries[CurDataSet].Trans.InTransaction then
Queries[CurDataSet].Trans.Commit;
end;
except
...
end;
end;


Zacho   (2003-11-26 18:57:00) [6]


> mOOx_ © (26.11.03 18:50) [8]

Насколько помню, что-то подобное недавно обсуждалось в epsylon.public.interbase Это баг, происходит потому, что запись пытается вставится 2 раза :-) Попробуй другую версию IB/FB


mOOx_   (2003-11-26 18:50:00) [7]

2Sandman25 © (26.11.03 15:32) [6]:
Нет, загружаю с помощью LoadFromFile. А что, принципиальне отличия есть? К тому же в предыдущих версиях проги я загружал файлы в блоб именно через такую въюху и именно с помощью LoadFromFile! С той версии изменилось только количество полей и условия во въюхе (ну и в триггерах, соответственно, тоже изменения наблюдаются). Так что из-за таких непоняток я и задаю вопросы.
2Johnmen © (26.11.03 16:00) [7]:
Спасибо, поимел :). Но что бы там не хранилось, при вставке в это поле текстового значения, все должно пройти на ура, а тут...
ЗЫ:Господа, не бросайте в трудную минуту. Очень надо разобраться.


Johnmen   (2003-11-26 16:00:00) [8]

>mOOx_ © (26.11.03 15:22)

>Я не хочу показаться грубым

Пока не показался.

Еще имей в виду, что в таблице в BLOB поле реально хранится не значение, а ссылка на дисковую структуру. Вот тот самый BLOB ID.
Посему во вью ты имеешь просто ссылку...


Sandman25   (2003-11-26 15:32:00) [9]

mOOx_

Для не очень понятливых или очень упрямых...

ParamByName("...").SetBlobData вызываете? Если нет, то не удивляйтесь тому, что не работает.


mOOx_   (2003-11-26 15:22:00) [10]

Я не хочу показаться грубым, но:
вставка из ИВЭксперт в таблицу DOCS_DATA проходит на ура. Запрос такой же, только имя таблицы меняется. Как в приложении - показывать не хочу не потому что жадный, а потому что там больно запутанно (еще больше кода, чем я уже привел). Там кажися проблем нет, веть из командной строки-то тоже самое.


Johnmen   (2003-11-26 14:21:00) [11]

Значение блоб-поля передается по ссылке, а не по значению.
Как определяется параметр в программе ?


mOOx_   (2003-11-26 14:07:00) [12]

up


mOOx_   (2003-11-26 13:47:00) [13]

Да хоть как!!! В приложении все через параметры делается (в смысле Query.Params). Сначала думал, что с ними не так работаю, а потом в ИБЕксперте выполнил
insert into DOCS_DATA_MY(KEY_DOCTYPE,FILENAME,TITLE,INFORMATION,DATA)
values (22,"qwerty","qwerty","qwerty","qwerty");
И опять та же хрень.


Sandman25   (2003-11-26 13:43:00) [14]

Как присваивается параметр?


Наверх

Титульная страница Поиск, карта сайта Написать письмо