Вниз
Скачать: CL | DM;

Что такое со вставкой во View?   Найти похожие ветки 

← →
mOOx_ ©   (2003-11-26 13:41) [0]

Долго рассусоливать не буду. Вот проблема: база на ФБ. Есть таблица, где документы храняться
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_DATA AS
BLOB SUB_TYPE 0 SEGMENT SIZE 8192
Господа. Это уже не просьба, а крик души!!! Заколебался. В чем я не прав?


← →
Sandman25 ©   (2003-11-26 13:43) [1]

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


← →
mOOx_ ©   (2003-11-26 13:47) [2]

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


← →
mOOx_ ©   (2003-11-26 14:07) [3]

up


← →
Johnmen ©   (2003-11-26 14:21) [4]

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


← →
mOOx_ ©   (2003-11-26 15:22) [5]

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


← →
Sandman25 ©   (2003-11-26 15:32) [6]

mOOx_

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

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


← →
Johnmen ©   (2003-11-26 16:00) [7]

>mOOx_ © (26.11.03 15:22)

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

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

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


← →
mOOx_ ©   (2003-11-26 18:50) [8]

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


← →
Zacho ©   (2003-11-26 18:57) [9]


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

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


← →
mOOx_ ©   (2003-11-26 19:34) [10]

Спасибо за совет, но: скачал последнюю версию ФБ. Таже фигня. Вообще нефига не понимаю!!!!!!!!!!!!????????????
Привоже код добавления:
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 19:50) [11]


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

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


← →
Michail Dalakov   (2003-11-26 21:13) [12]

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


← →
Michail Dalakov   (2003-11-26 21:15) [13]

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


← →
mOOx_ ©   (2003-11-27 13:50) [14]

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.012 c
3-61961
RAM
2003-11-26 12:34
2003.12.19
погрешность


1-62011
Piero
2003-12-06 18:14
2003.12.19
Масштабирование TImage


14-62271
Sha_Man
2003-11-24 19:23
2003.12.19
Флудеры! Айда на мой форум


3-61944
gestern
2003-11-26 19:03
2003.12.19
insert


1-62020
1
2003-12-09 13:05
2003.12.19
Показ Popup в OnDrawMenuItem




   Наверх