Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SetBlobData bei ADOQuery (https://www.delphipraxis.net/183182-setblobdata-bei-adoquery.html)

HolgerCW 18. Dez 2014 09:05

Datenbank: Oracle • Version: 10 • Zugriff über: BDE/ADO

SetBlobData bei ADOQuery
 
Hallo zusammen,

stelle derzeit auf ADO um.

Vorher ging dies:

Delphi-Quellcode:
DM_Main.QueryRaw.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
Wie geht das bei ADOQuery ? Dort gibt es den Befehl "SetBlobData" an der Stelle nicht ? So geht es nicht:

Delphi-Quellcode:
DM_Main.ADOQueryRaw.Parameters.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
Gruss

Holger

DeddyH 18. Dez 2014 09:13

AW: SetBlobData bei ADOQuery
 
http://stackoverflow.com/questions/1...component-only

HolgerCW 18. Dez 2014 09:55

AW: SetBlobData bei ADOQuery
 
Vielen dank dafür.

Bernhard Geyer 18. Dez 2014 10:19

AW: SetBlobData bei ADOQuery
 
Oracle und Ado? Du stellst - um es ketzerisch zu sagen - von der Pest auf Cholara um.
Für Oracle ist es besser auf native Komponenten umzustellen die oracle entweder direkt odet über den (Instant)Client ansprechen können. Ado ist hier ein (potentiell fehlerträchtiger) Fremdkörper.

HolgerCW 7. Jan 2015 10:28

AW: SetBlobData bei ADOQuery
 
Hallo nochmal,

habe das nun testen können und es klappt leider nicht. Was mache ich falsch ?

Hier mal der Code, welcher einen Stream auslesen soll und anschliessend wieder an einer anderen Stelle einfügen soll:

Delphi-Quellcode:
var
 blob: TStream;
 outstream: TMemoryStream;
 Query: TADOQuery;
begin

 DM_Main.ADOTableRaw.Close;
 DM_Main.ADOTableRaw.TableName := 'KO_STATIONSTYP';
 DM_Main.ADOTableRaw.IndexFieldNames := 'STATIONSTYP';
 DM_Main.ADOTableRaw.Filter := 'STATIONSTYP = ''' + DM_KSB.ADOQueryBestellung['STATIONSTYP'] + '''';
 DM_Main.ADOTableRaw.Filtered := TRUE;
 DM_Main.ADOTableRaw.Open;

 if DM_Main.ADOTableRaw['BEDIENUNGSANLEITUNG'] <> '' then
 begin

  blob := DM_Main.ADOTableRaw.CreateBlobStream(DM_Main.ADOTableRaw.FieldByName('BEDIENUNGSANLEITUNG'), bmRead);
  blob.Seek(0, soFromBeginning);

  outstream := TMemoryStream.Create;
  outstream.LoadFromStream(blob);
  outstream.Seek(0, soFromBeginning);

  DM_Main.ADOQueryRaw.Close;
  DM_Main.ADOQueryRaw.SQL[1] := 'SYSFORM.KOBUSYS_VERLAUF';
  DM_Main.ADOQueryRaw.SQL[3] := 'BEDIENUNGSANLEITUNG';
  DM_Main.ADOQueryRaw.SQL[5] := 'WHERE ID';
  //DM_Main.QueryRaw.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
  DM_Main.ADOQueryRaw.Parameters.ParamByName('p_pdf').LoadFromStream(outstream.Memory, ftBlob);
  DM_Main.ADOQueryRaw.Parameters.ParamByName('p_auftragsnummer').Value := inttostr(DM_KSB.ADOQueryBestellung['ID']);
  DM_Main.ADOQueryRaw.ExecSQL;

  outstream.Free;

  blob.Free;

 end;
und hier noch der SQL-Code der Query:

Delphi-Quellcode:
UPDATE
SYSDBP.DBP_AUFTRAGEX
SET
PDF
= :p_pdf
WHERE AUFTRAGSNUMMER
= :p_auftragsnummer
Bei .LoadFromStream kommt der Fehler "Zugriffsverletzung bei Adresse ...". Das Auskommentierte ist der vorherige Code mit der BDE und TQuery. Das ging. Nun will ich das ja mit ADOQuery machen.

Vielleicht kennt Ihr ja auch eine ganz andere Lösung für das kopieren von einem Stream ...

Gruss

Holger

mkinzler 7. Jan 2015 11:31

AW: SetBlobData bei ADOQuery
 
Di Du solltest nicht die selbe Komponenet nehmen. Zum Zeitpunkt des Einfügens existiert der Blob ja nicht mehr.

HolgerCW 7. Jan 2015 11:37

AW: SetBlobData bei ADOQuery
 
Warum existiert er da nicht mehr. Oben das ist ein Table und unten eine Query oder was meinst Du ?

mkinzler 7. Jan 2015 11:40

AW: SetBlobData bei ADOQuery
 
Der programmseitige Zugriff ist gekappt.

HolgerCW 7. Jan 2015 11:48

AW: SetBlobData bei ADOQuery
 
Hi,

habe nun schon mal die Fehlermeldung beseitigt. Folgender Code:

Delphi-Quellcode:
DM_Main.ADOQueryRaw.Parameters.ParamByName('p_pdf').LoadFromStream(outstream.Memory, ftBlob);
war falsch. Das "outstream.Memory" darf nur "outstream" heissen.

Du hast aber recht. Er fügt nichts ein. An welcher Stelle des codes mache ich was falsch. Verstehe das noch nicht so ganz ?

HolgerCW 7. Jan 2015 12:02

AW: SetBlobData bei ADOQuery
 
Habe mich vertan. Er macht nun das was er soll. Alles funktioniert wunderbar. Ausser das auslesen dauert gefühlsmässig länger als noch mit der BDE.

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz