Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2010, 12:16   #1
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию Загрузка blob в базу

Добрый день!
такой вопрос,
есть переменная типа TBlobField.
как в неё загрузить файл?
на вскидку попробовал так:
Код:
procedure BlobSaveToBaseMacroProc (MName:string; AParams:TObject);
var
bl:TBLObfield;
begin
bl.LoadFromFile('C:\test_lob\10.mpg');
end;
но при вызове макроса выдает следующую ошибку
Код:
Access violation at address 100EA4E2 in module 'rtl4.bpl'. Read of address 0000C35D
(эта процедура находится в подключаемой к основному модулю bpl'ке, а основной модуль программы rtl4.bpl)

в последующем нужно будет передать эту переменную параметром в пакетную процедуру и там надо обработать и положить в базу. вобще такое возможно? или только резать по кускам, передавать в процедуру и там writeappend writeappend writeappend....

Последний раз редактировалось eldalex; 01.10.2010 в 12:21.
eldalex вне форума Ответить с цитированием
Старый 01.10.2010, 14:58   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

я тебе здесь уже ответил

не надо усложнять себе жизнь лишний раз
soleil@mmc вне форума Ответить с цитированием
Старый 04.10.2010, 07:27   #3
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

та я не усложняю, просто примерно таким образом я выгружаю blob, получаю датасет, присваиваю blob поле переменной и делаю savetofile, думал может так по быстрому прокатит и загрузить) не умею с потоками работать, практики особой никогда не было) чтож, вот и случай подвернулся)
eldalex вне форума Ответить с цитированием
Старый 04.10.2010, 14:01   #4
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

вобщем что то не получется... как проверить, идут ли какие нибудь данные в процедуру?
делаю так:
Код:
procedure BlobSaveToBaseMacroProc (MName:string; AParams:TObject);
var
j,done:integer;
stream:TFileStream;
buffer:pchar;
size:longint;
begin
done:=0;
stream:=TFileStream.create('C:\test_lob\10.mpg',fmopenread); //создаем поток.
end;
try
  size:=stream.size; // узнаем размер.
  getmem(buffer,size);
  try
  while done <size do // пока все не перешлем, делаем.
    begin
      j:=32000;
      if done+j>size then
        begin
          j:=size-done; 
        end; 
      done:=done+j;
      stream.read(buffer[0],j); // прочитали 32к данных
      CallSPex('test_lob_pkg.dbst_load','blobdata='+buffer); //отослали в пакетную процедуру.
    end;
  finally
  freemem(buffer);
  end;
finally;
stream.free;
end;
end;
а вот собственно тело процедуры:
Код:
procedure dbst_load( 
  blobdata in varchar2
) as
d1 blob;
wCnt number;
begin
select count(*) into wCnt from test_lob where test_id=1; -- проверяем наличие записи в таблице
if wcnt>0 then 
begin -- если есть запись то:
DBMS_LOB.createTemporary( d1, TRUE ); создаем d1.
select orig_file into d1 from test_lob where test_id=1; --помещаем в d1 то, что хранится в blob поле
DBMS_LOB.OPEN( d1, DBMS_LOB.LOB_ReadWrite ); -- открываем на запись (вот тут не уверен, может это надо делать до select'a?)
dbms_lob.writeappend(d1,length(dbst_load.blobdata),dbst_load.blobdata);--дописываем в конец то что передала предыдущая процедура.
update test_lob set orig_file=d1 where test_id=1;--перезаписываем поле.
end;
else
begin-- если нет записи
DBMS_LOB.createTemporary( d1, TRUE ); -- создаем d1
DBMS_LOB.OPEN( d1, DBMS_LOB.LOB_ReadWrite ); -- открываем
dbms_lob.writeappend(d1,length(dbst_load.blobdata),dbst_load.blobdata); -- пишем
insert into test_lob (test_id,file_name,file_size,orig_file) values (1,'test',0,d1); -- вставляем новую запись
end;
end if;
end;
не могу понять в каком виде принимать данные из первой процедуры? они передаются как pchar, но тут при входе в процедуру значение blobdata пустое...
проверял конечно не самым лучшим способом, но надежным.
raise_application_error (-20998, '0 пришли данные, blobdata ='||blobdata);

если создать еще один поток (s1) и выполнять в цикле следующее:
Код:
stream.read(buffer[0],j);
s1.seek(0,soFromEnd);
s1.write(buffer[0],j);
то копия файла создается без проблем. из чего можно сделать вывод что в пакетную процедуру параметр blobdata уходит не пустой.
eldalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка данных в базу из xml файла Dien БД в Delphi 1 06.04.2010 20:27
загрузка сохранение изображения в blob поле Lokos БД в Delphi 1 24.02.2010 06:50
Из Memo в BLOB artemavd БД в Delphi 52 31.07.2009 20:32
Работа с BLOB artemavd БД в Delphi 6 24.07.2009 18:17