Entwickler-Ecke
Datenbanken - Problem beim Auslesen eines Blob- Feldes bei Paradox
moloch - Mi 09.04.08 09:18
Titel: Problem beim Auslesen eines Blob- Feldes bei Paradox
Hallo,
bei einer MSSQL- DB kann ich ohne Probleme ein Blob-Feld auslesen mit
result := q.fieldbyname('Blobwert').Asstring;
bei paradox kriege ich '' also leer zurück.. was muss ich dort anders machen?
Gruß
mkinzler - Mi 09.04.08 10:21
Und so:
Delphi-Quelltext
1:
| result := q.fieldbyname('Blobwert').Value; |
?
moloch - Mi 09.04.08 10:24
leider auch nicht
mkinzler - Mi 09.04.08 10:29
Dann wirst du wohl den Inhalt aus dem Stream laden müssen.
moloch - Mi 09.04.08 10:33
kannst du das beschreiben oder ein beispiel machen bitte
moloch - Mi 09.04.08 10:48
ok danke das probier ich mal aus..
moloch - Mo 02.06.08 15:46
@mkinzler
wie hole ich die info jetzt in einen string..
also wenn ich so lese eigentlich (result ist ein string)
Delphi-Quelltext
1:
| result := q.fieldbyname('Blobwert').Asstring; |
wie kann ich das anwenden hier wofür du einen link zur verfügung gestellt hast?
gruß
moloch - Di 03.06.08 09:56
was ist daran falsch? also ich bekomme einfach nichts ausgelesen.. wenn ich mit der maus über .text oder .value oder .asstring halte zeigt ein hint die meldung "ungültiger Ausdruck im Evaluator"
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function GetBlob: string; var i: Integer; sH: string; q: TQuery; Blobfield: TBlobField; begin sH := 'select * from Table); q := GetTheSQL(); if q <> nil then begin Blobfield := TBlobfield.Create(nil); try q.first; for i := 0 to q.RecordCount - 1 do begin result := (q.Fieldbyname('BLOBWERT') as TBlobField).Text;
break; end; finally Blobfield.Free; end; end; end; |
ZeitGeist87 - Di 03.06.08 10:03
moloch hat folgendes geschrieben: |
was ist daran falsch? also ich bekomme einfach nichts ausgelesen.. wenn ich mit der maus über .text oder .value oder .asstring halte zeigt ein hint die meldung "ungültiger Ausdruck im Evaluator"
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function GetBlob: string; var i: Integer; sH: string; q: TQuery; Blobfield: TBlobField; begin sH := 'select * from Table'; q := GetTheSQL(); if q <> nil then begin Blobfield := TBlobfield.Create(nil); try q.first; for i := 0 to q.RecordCount - 1 do begin result := (q.Fieldbyname('BLOBWERT') as TBlobField).Text;
break; end; finally Blobfield.Free; end; end; end; | |
Was ich nich versteh...warum machst du ne Schleife und dann sofort n
break rein..ist das nur für Debuggingzwecke?
Find die ganze Konstruktion irgendwie..komisch ;-)
LG
Stefan
moloch - Di 03.06.08 10:13
break vergessen bitte... war noch von einem anderen versuch..
bitte aufs wesentliche... hast du einen tip ?
moloch - Di 03.06.08 10:14
geht wirklich nur um das blobfeld. bei mssql funktioniert alles
alzaimar - Di 03.06.08 10:31
Bei Blobs wird die Text / AsString - Eigenschaft nicht gesetzt. Ein TBlobField hat die Blob-Daten jedoch als Stream vorrätig. Erzeuge einen TStringStream, lies die Daten in den StringStream und rufe sie z.B. über die 'DataString'-Eigenschaft ab.
moloch - Di 03.06.08 10:43
hast du dafür ein beispiel? habs ja mit blobstream schon versucht..
alzaimar - Di 03.06.08 10:54
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Function BlobToString (aBlobField : TBlobField) : String; Var sStringStream : TStringStream;
Begin Result := ''; sStringStream := TStringStream.Create(''); Try aBlobField.SaveToStream(sStringStream); Result := sStringStream.DataString; Finally sStringStream.free End; End; |
BLOBs können auch nichtdruckbare Zeichen enthalten. Insofern ist eine Verarbeitung als String nicht zu empfehlen. Ich würde (z.B. für COM) auf Variants umsteigen (Variant Array Of Byte).
moloch - Di 03.06.08 11:23
kriege leider weiterhin nichts zurück.. bei mssql funktioniert es jedoch nach deinem beispiel..
evtl liegt es noch am reinschreiben...
so schreibe ich rein
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| function StreamToOraDatabase(sSql, Alias, sSessionName: string; var bs: TMemoryStream): boolean; var OraQuery: TOraQuery;
begin result := false; SyncFree.BeginWrite; try OraQuery := GetOraQuery(Alias, sSessionname); try try with OraQuery do begin Active := false; SQL.Text := sSql; Params[0].SetBlobData(bs.Memory, bs.Size); Execute; result := true; end; except on e: exception do begin showmyerror('StreamToOraDatabase: ' + e.Message); showmyerror('StreamToOraDatabase: ' + ssql); end; end; finally end; finally SyncFree.endWrite; end; end; |
alzaimar - Di 03.06.08 11:25
Mit Oracle kenn ich mich leider nicht aus. Was liefert denn ein einfaches SELECT in der Konsole?
moloch - Di 03.06.08 11:35
nichts ausser "bindata"
moloch - Di 03.06.08 16:12
kann denn hier keiner helfen.. das muss doch möglich sein
naja oracle mal wieder
mikhal - Do 05.06.08 16:31
Zum Auslesen verwende ich folgendes Verfahren:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm2.qryTestAfterScroll(DataSet: TDataSet); begin if qryTest.FindField('EXT').AsString = '.bmp' then imgTest.Picture.Assign((qryTest.FindField('PIC') As TBlobField)); end; |
Ich führe in meiner Tabelle immer ein Feld mit der Extension der Datei, die ich im BlobFeld abgelegt habe. In diesem Fall lade ich in ein TImage den Inhalt eines Blobfeldes, das mit einer Bitmap-Grafik gefüllt ist. Für andere Datentypen musst du selbst geeignete Verfahren verwenden. Schreiben kannst du Daten auf die gleiche Art und Weise.
Verwendet habe ich für diesen Schnipsel die ODAC-Zugriffskomponenten von CoreLabs mit Zugriff auf eine Oracle 9i. Es funktioniert aber auch mit anderen Zugriffskomponenten (siehe dazu auch meine
Homepage [
http://www.mike-kraemer.de/html/bde.html]).
Grüße
Mikhal
[edit] Link zur Homepage[/edit]
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!