Форум: "Базы";
Текущий архив: 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