Форум: "Базы";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
ВнизЧто такое со вставкой во 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 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c