![]() |
Datenbank: Oracle • Version: 10 • Zugriff über: BDE/ADO
SetBlobData bei ADOQuery
Hallo zusammen,
stelle derzeit auf ADO um. Vorher ging dies:
Delphi-Quellcode:
Wie geht das bei ADOQuery ? Dort gibt es den Befehl "SetBlobData" an der Stelle nicht ? So geht es nicht:
DM_Main.QueryRaw.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
Delphi-Quellcode:
Gruss
DM_Main.ADOQueryRaw.Parameters.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
Holger |
AW: SetBlobData bei ADOQuery
|
AW: SetBlobData bei ADOQuery
Vielen dank dafür.
|
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. |
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:
und hier noch der SQL-Code der Query:
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;
Delphi-Quellcode:
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.
UPDATE
SYSDBP.DBP_AUFTRAGEX SET = :p_pdf WHERE AUFTRAGSNUMMER = :p_auftragsnummer Vielleicht kennt Ihr ja auch eine ganz andere Lösung für das kopieren von einem Stream ... Gruss Holger |
AW: SetBlobData bei ADOQuery
Di Du solltest nicht die selbe Komponenet nehmen. Zum Zeitpunkt des Einfügens existiert der Blob ja nicht mehr.
|
AW: SetBlobData bei ADOQuery
Warum existiert er da nicht mehr. Oben das ist ein Table und unten eine Query oder was meinst Du ?
|
AW: SetBlobData bei ADOQuery
Der programmseitige Zugriff ist gekappt.
|
AW: SetBlobData bei ADOQuery
Hi,
habe nun schon mal die Fehlermeldung beseitigt. Folgender Code:
Delphi-Quellcode:
war falsch. Das "outstream.Memory" darf nur "outstream" heissen.
DM_Main.ADOQueryRaw.Parameters.ParamByName('p_pdf').LoadFromStream(outstream.Memory, ftBlob);
Du hast aber recht. Er fügt nichts ein. An welcher Stelle des codes mache ich was falsch. Verstehe das noch nicht so ganz ? |
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