Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-62209
SPeller
2003-11-25 14:28
2003.12.19
Глюк со звуком в играх под ХР


14-62205
Виктор Щербаков
2003-11-26 11:23
2003.12.19
Задачка :)


1-62029
Dimchik
2003-12-06 15:19
2003.12.19
TStringGrid


1-62049
DikobraZ
2003-12-04 22:34
2003.12.19
Какие компоненты используют в uses: Compress, CompressZli...


3-61982
kvit
2003-11-26 11:42
2003.12.19
MS SQL Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский