Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.039 c
4-1114250886
Керик
2005-04-23 14:08
2005.06.14
SHBrowseForFolder


4-1113570506
ANB
2005-04-15 17:08
2005.06.14
Работа с меню в чужом приложении


14-1117189084
sofs
2005-05-27 14:18
2005.06.14
3ds max


8-1108917860
nes
2005-02-20 19:44
2005.06.14
Увеличение картинки и её детализация


14-1116850434
Копир
2005-05-23 16:13
2005.06.14
Кто умеет ругаться на Паскале?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский