Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Oracle -> BDE -> Delphi не читается BLOB   Найти похожие ветки 

 
afanasic   (2005-04-29 10:47) [0]

Доброго времени суток всем, заранее спасибо за ответ...

 Такая ситуация: Работаю с Oracle из Delphi через BDE, использую TQuery - все работает отлично, но понадобилось прочитать/записать BLOB.
 Делаю:
   Query.SQL.Clear;
   Query.SQL.Text := "select code, blob_data from tb_blob_data";
   Query.Open; {или Query.Active := True;}
 И на этапе .Open возникает ошибка "Invalid field type";

 Подскажите, плиз...


 
ANB ©   (2005-04-29 10:54) [1]


> Работаю с Oracle из Delphi через BDE
- ты изгалятель. Поставь ODAC или DOA (ODAC больше похож на BDE). Правда через select ты и там не прочитаешь. Надо получать указатель, лучше через хранимку.
примерно так (лишнее сам выброси) :

procedure SaveScript (Step_ID : Int64; edScript : TSynEdit; bModified : Boolean);
var qrScript : TOraStoredProc;
   i, n : Integer;
   SelBeg, SelLen : Integer;
begin
if (not bModified) then Exit;
qrScript := TOraStoredProc.Create(nil);
SelBeg := edScript.SelStart;
SelLen := edScript.SelLength;
try
 // Обрежем концевые пробелы
 n := edScript.Lines.Count - 1;
 for i := 0 to n do begin
  edScript.Lines[i] := TrimRight(edScript.Lines[i]);
 end;
 // Сохраним скрипт
 qrScript.StoredProcName := "Insert_Step_script";
 qrScript.Prepare;
 qrScript.ParamByName("P_Step_ID").AsInteger := Step_ID;
 qrScript.ParamByName("P_Script").ParamType := ptInput;
 qrScript.ParamByName("P_Script").AsCLOBLocator.Write(0
 ,Length(edScript.Lines.Text)
 ,PChar(edScript.Lines.Text));
 qrScript.Execute;
 qrScript.ParamByName("P_Script").AsCLOBLocator.FreeLob;
 fmMain.bChangeScript := False;
finally
 FreeAndNil(qrScript);
 edScript.SelStart := SelBeg;
 edScript.SelLength := SelLen;
end;
end;

Хранимка :

procedure Insert_Step_script (P_Step_ID in number, P_Script out blob) is
begin
 update    Step_Script
       set Script = empty_blob ()
          ,Modify_Date = sysdate
     where Step_ID = P_Step_ID
 returning Script
      into P_Script;

 if (sql%rowcount = 0) then
  insert into Step_Script
              (Step_ID
              ,Script
              ,Modify_Date
              ,Compile_Date
              )
       values (P_Step_ID
              ,empty_blob ()
              ,sysdate
              ,to_date ("01.01.1900", "DD.MM.YYYY")
              )
    returning Script
         into P_Script;
 end if;
end Insert_Step_script;

И смотри доку по ораклу, там все расписано, как с блобами работать.


 
ANB ©   (2005-04-29 10:55) [2]

Выше была запись.
Чтение :

procedure LoadScript (Step_ID : Int64; edScript : TSynEdit);
var qrScript : TOraQuery;
   fldBLOB : TOraLob;
   smMem : TStream;
begin
qrScript := TOraQuery.Create(nil);
try
 edScript.Lines.Clear;
 // Закачаем скрипт шага из схемы
 qrScript.Session := dm.Session;
 qrScript.SQL.Text :=
  "select Script"+#13#10
 +"  from Step_Script"+#13#10
 +" where Step_ID = :Step_ID";
 qrScript.Prepare;
 qrScript.ParamByName("Step_ID").AsInteger := Step_ID;
 try
  qrScript.Open;
  if qrScript.IsEmpty then begin
   Exit;
  end else begin
   // Открое BLOB
   fldBLOB := qrScript.GetLob("Script");
   smMem := TMemoryStream.Create;
   try
    // Качнем все, что там есть
    fldBLOB.SaveToStream(smMem);
    smMem.Seek(0,0);
    edScript.Lines.LoadFromStream(smMem);
    fmMain.bChangeScript := False;
   finally
    FreeAndNil(smMem);
    fldBLOB.FreeLob;
   end;
  end;
 finally
  qrScript.Close;
 end;
finally
 FreeAndNil(qrScript);
end;
end;


 
afanasiy   (2005-04-29 11:42) [3]


> ANB ©   (29.04.05 10:54) [1]
>
> > Работаю с Oracle из Delphi через BDE
> - ты изгалятель. Поставь ODAC или DOA (ODAC больше похож
> на BDE).


Уважаемый ANB,
не подскажите ли Вы где достать ODAC?
p.s.
Я не про официальный сайт..


 
ANB ©   (2005-04-29 11:51) [4]


> не подскажите ли Вы где достать ODAC?
- не знаю. Честно. Мне дали. Могу выслать.


 
afanasiy   (2005-04-29 11:56) [5]

AntonPopov@rambler.ru
Заранее благодарю!


 
ANB ©   (2005-04-29 12:05) [6]

Лови.


 
afanasic   (2005-04-29 13:03) [7]

ANB, спасибо большое, глюк нашелся - переставил BDE, все заработало, а соскочить с него не могу, во-первых все проблемы с ним решаемые, а во-вторых - традиция компании (годы работы с BDE), ничего не поделаешь...


 
Val ©   (2005-04-29 15:28) [8]

>[1] ANB ©   (29.04.05 10:54)
..- ты изгалятель. Поставь ODAC или DOA (ODAC больше похож на BDE). Правда через select ты и там не прочитаешь. ..
Уважаемый ANB, не надо ля-ля. Можно аргументы?


 
ANB ©   (2005-04-29 15:33) [9]


> Val ©   (29.04.05 15:28) [8]
не можно. :(( См. исходники. Там я сам через select читаю. Но, как ты видишь, не напрямую, а через GetLob. В БДЕ тоже есть похожая приблуда, но работает она хуже.
А по поводу ODAC и DOA - согласись, что прямой доступ лучше кривого. И возможностей намного больше. У меня друзья даже от этих оболочек отказались. Работают напрямую через OCI. Грят, намного круче.


 
Val ©   (2005-04-29 16:41) [10]

Как через БДЕ так и через NCOCI, например(раз уж о компонентах прямого доступа заговорили), блоб абсолютно нормально выбирается селектом в блоб-поле датасета на клиенте, а там уже разруливается с помощью потоков, при надобности.


 
ANB ©   (2005-04-29 16:50) [11]


> Val ©   (29.04.05 16:41) [10]
- ну дык. См. [9]. > Там я сам через select читаю


 
Reindeer Moss Eater ©   (2005-05-05 02:01) [12]

BDE вообще не поддерживает ни BLOB ни CLOB.
Только устаревший LONG RAW.


 
evvcom ©   (2005-05-05 08:15) [13]


> afanasiy   (29.04.05 11:56) [5]

Только попробуй теперь (на всякий случай) свое приложение с ODAC без запущенного Delphi.


 
ANB ©   (2005-05-05 13:19) [14]


> evvcom ©   (05.05.05 08:15) [13]
- ты думаешь я демку отправил ?



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

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
1-1116966655
TProgrammer
2005-05-25 00:30
2005.06.14
Создание MDI-Child окна в режиме Visible=false


3-1115113838
kyn66
2005-05-03 13:50
2005.06.14
Как закрыть базу Access (mdb) ?


14-1117026294
menart
2005-05-25 17:04
2005.06.14
Языки программирования...


6-1111175049
Ig
2005-03-18 22:44
2005.06.14
Indy UDP и динамическое создание компонентов


1-1117185097
electric
2005-05-27 13:11
2005.06.14
Прокрутка в TWebBrowser