помогите записать рисунок в BLOB

Scorpio_md
Дата: 15.06.2009 10:55:07
Добрый день. Подскажите, такая проблема у меня возникла. пытаюсь записать рисунок в БД ORACLE 11
поле BLOB. Код:
                try
                   AssignFile(fs,OpenPictureDialog1.FileName);reset(fs);
                   size:=filesize(fs);closefile(fs);
                   size1 := size;
                   scale:=1;
                   if size>100000 then
                     begin
                          imgjpg1.free;
                          ImgJPG1:=nil;
                          ImgJPG1:=TJPEGImage.Create;
                          while true do
                            begin
                                 ImgJpg1.LoadFromFile(OpenPictureDialog1.FileName);
                                 scale:=scale-0.1;
                                 bmp:= Tbitmap.Create;
                                 try
                                    bmp.Width := Round(imgjpg1.Width * scale );
                                    bmp.Height:= Round(imgjpg1.Height * scale );
                                    bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, imgjpg1 );
                                    imgjpg1.Assign( bmp );
                                    imgjpg1.SaveToFile('C:\Program Files\osk\tmp1.JPG');
                                 finally
                                    bmp.free;
                                 end;
                                 AssignFile(fs,'C:\Program Files\osk\tmp1.JPG');reset(fs);
                                 size:=filesize(fs);closefile(fs);
                                 If size<=100000 then
                                   begin
 //                               FileNameFoto:=dirmain+'tmp\tmp.JPG';
                       //      deletefile(dirmain+'\tmp\tmpjpg.JPG');
                                         break;
                                    end;
                                 imgjpg1.free;  ImgJPG1:=nil; ImgJPG1:=TJPEGImage.Create;
                          end; //while
                     end;
                   if not f_seek_li.OraQuery1.FieldByName('ni_old').IsNull  then
                     nLi := f_seek_li.OraQuery1.FieldByName('ni_old').AsString
                   else
                     nLi := f_seek_li.OraQuery1.FieldByName('ni').AsString;

{                   OraSQL1.SQL.Text := 'insert into mmm.foto_roz (foto_,nreg_,ni) values (:foto,1,:nni)';
                   OraSQL1.Params.ParamByName('foto').LoadFromFile('C:\Program Files\osk\tmp1.JPG',ftBlob);
                   OraSQL1.Params.ParamByName('nNi').AsString := nLi;
                   OraSQL1.Execute;
}
                   OraSQL1.SQL.Text := 'insert into mmm.foto_roz (ni,foto_,nreg_) values (11,EMPTY_BLOB(),1)';
                   OraSQL1.Execute;
                   OraSQL1.SQL.Text := 'update mmm.foto_roz set ni = 11,foto_=:foto ')';
                   OraSQL1.Params.ParamByName('foto').LoadFromFile('C:\Program Files\osk\tmp1.JPG',ftBlob);
//                   OraSQL1.Params.ParamByName('nNi').AsString := nLi;
                   OraSQL1.Execute;
                except
                   ShowMessage('Ошибка добавления фотки ФАС');
                end;

Суть проблемы, если захожу под пользователем MMM тем что создавал таблицу, то все нормально работает. Создал другого пользователя, дам ему роль на возможность записи в эту таблицу, так он мне выдает при записи именно блоба ошибку ora-01460.Хотя если пишу пустое значение то без ошибок. Что я неправильно сделал ??
Scorpio_md
Дата: 15.06.2009 10:57:56
OraSQL1.SQL.Text := 'update mmm.foto_roz set ni = 11,foto_=:foto ')';
Тут кавычкм в конце нет
Эта строчка нормальная
OraSQL1.SQL.Text := 'update mmm.foto_roz set ni = 11,foto_=:foto )';
Volonter12
Дата: 16.06.2009 11:11:54
А этот способ апдейта блоба это ваше личное изобретение? :))
Из простого поиска в гугле на "ora-01460" даже не заходя на страницы можно понять суть ошибки
(это если она не известна).
Для начала обратите внимание на тип параметра :foto, е еще лучше сделать всё правильно.

В Демке Odac'a очень хорошо описаны способы записи/чтения блоба,
как напрямую из/в таблицы(у), так и с помощью хранимой процедуры.
Настоятельно советую посмотреть. Я лично оттуда и научился.

Конструкции insert/update должны быть приблизительно такого типа
INSERT INTO mmm.foto_roz  (ni,foto_,nreg_)
VALUES  (:NI, empty_blob(),1)
RETURNING
  FOTO_
INTO
  :FOTO_
UPDATE mmm.foto_roz
SET
  NI = :NI,
  FOTO_ = empty_blob(),
  NREG_  = :NREG
-- WHERE ххххххххххххххххххххххххх
-- хз из вашего примера какое должно быть условие
RETURNING
  FOTO_
INTO
  :FOTO_

И ещё Odac неявно внутри использует dbms_lob,
так что у пользователей должны быть права на него.
Scorpio_md
Дата: 16.06.2009 15:13:44
Volonter12
А этот способ апдейта блоба это ваше личное изобретение? :))
Из простого поиска в гугле на "ora-01460" даже не заходя на страницы можно понять суть ошибки
(это если она не известна).
Для начала обратите внимание на тип параметра :foto, е еще лучше сделать всё правильно.

В Демке Odac'a очень хорошо описаны способы записи/чтения блоба,
как напрямую из/в таблицы(у), так и с помощью хранимой процедуры.
Настоятельно советую посмотреть. Я лично оттуда и научился.

Конструкции insert/update должны быть приблизительно такого типа
INSERT INTO mmm.foto_roz  (ni,foto_,nreg_)
VALUES  (:NI, empty_blob(),1)
RETURNING
  FOTO_
INTO
  :FOTO_
UPDATE mmm.foto_roz
SET
  NI = :NI,
  FOTO_ = empty_blob(),
  NREG_  = :NREG
-- WHERE ххххххххххххххххххххххххх
-- хз из вашего примера какое должно быть условие
RETURNING
  FOTO_
INTO
  :FOTO_

И ещё Odac неявно внутри использует dbms_lob,
так что у пользователей должны быть права на него.
Scorpio_md
Дата: 16.06.2009 15:16:01
Тут такой вопрос, какие права нужно дать пользователю, потому как такой способ я использовал, он не работал, до тех пор пока я не установил клиента ОРАКЛА. После этого все заработало. А хотелось бы обойтись без установки клиента.
Volonter12
Дата: 16.06.2009 16:40:59
Ну сам же говоришь что работало. Значит проблема в работе именно в DirectMode.
Вполне может быть что у данной версии Odac есть (известная) проблема в работе с блобами в DirectMode.
(В DirectMode вообще много чего нельзя и это официально оформлено как фичи.)

Какие права можно дать на пакет? Execute - вполне достаточно.