AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken BlobStream in StringGrid speichern
Thema durchsuchen
Ansicht
Themen-Optionen

BlobStream in StringGrid speichern

Ein Thema von Smiley · begonnen am 6. Mai 2022 · letzter Beitrag vom 23. Mai 2022
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 14:02
Zu VirtualQueries habe ich auf die schnelle keine Beispiele gefunden wofür man das einsetzen kann.
Hast du da etwas BeispielCode um zu sehen was das bringt?

Ist aber für das jetzige Projekt denke ich nicht nötig, da ich nur eine Tabelle habe und 1 bis 100 Datensätze pro ID, die ich dann in ein Memtable einlesen könnte.

Kann ich mein JPegArray[0..119] direkt in ein BlobFeld speichern und wieder rausbekommen by fdMemtable, wie wäre da die Syntax?
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: BlobStream in StringGrid speichern

  Alt 10. Mai 2022, 14:46
Zu VirtualQueries habe ich auf die schnelle keine Beispiele gefunden wofür man das einsetzen kann.
Hast du da etwas BeispielCode um zu sehen was das bringt?

Ist aber für das jetzige Projekt denke ich nicht nötig, da ich nur eine Tabelle habe und 1 bis 100 Datensätze pro ID, die ich dann in ein Memtable einlesen könnte.
Bei einem TVirtualQuery fügt man einfach Datensätze hinzu und gibt ihnen einen Namen und dann macht man in die SQL-Property das SQL was diese Datensatz-Namen als Tabellen-Aliase nutzt.
Zum Bsp.

Query1 Tabelle Kunden -> vQuery Alias Ku
Query2 Tabelle Kunden_Wohnort -> vQuery Alias Ku_wo

SQL.Text := SELECT Ku.*, Ku_wo.Stadt FROM Ku left join Ku_wo on (Ku_wo.Id=Ku.Id)

Das ist jetzt aus dem Gedächtnis, ich hab das bestimmt 3 Jahre nicht mehr gemacht, weil ich in meinem aktuellen Job nur noch mit FireDAC arbeiten (muss).
Die Query1 und Query2 können MemTables sein, oder TTable oder FDQuery, alles was von TDataSet abgeleitet ist. Du kannst da auch frei mixen.
SQL ist Sqlite in memory.

Kann ich mein JPegArray[0..119] direkt in ein BlobFeld speichern und wieder rausbekommen by fdMemtable, wie wäre da die Syntax?
Das geht über die CreateBlobStream funktion
Hier ist das ofizielle Beispiel.
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 11:54
Ich komme mit dem Beispiel von Embarcadero einfach nicht weiter.

Hier der BeispielCode:
Code:
{-------------------------------------------------------------------------------}
procedure TfrmBlobStr.btnInsertInternalClick(Sender: TObject);
var
  oFS: TFileStream;
begin
  // All Real BLOB Streaming operations must be performed in a transaction.
  FDConnection1.StartTransaction;
  try
    case FDConnection1.RDBMSKind of
    TFDRDBMSKinds.PostgreSQL:
      qInsert.SQL.Text := 'insert into {id FDQA_LO} (blobdata) values (:blobdata)';
    TFDRDBMSKinds.Oracle:
      qInsert.SQL.Text := 'insert into {id FDQA_Blob} (blobdata) values (EMPTY_BLOB()) returning blobdata into :blobdata';
    else
      qInsert.SQL.Text := 'insert into {id FDQA_Blob} (blobdata) values (:blobdata)';
    end;
    // Set parameter data type ftStream and do not assign stream reference.
    // The internal stream reference will be returned after ExecSQL.
    // The internal stream does not perform any conversion (eg, character set).
    qInsert.Params[0].DataType := ftStream;
    qInsert.Params[0].StreamMode := smOpenWrite;
    qInsert.ExecSQL;

    oFS := TFileStream.Create(C_File, fmOpenRead);
    try
      // Write to internal stream. The stream is available after ExecSQL.
      qInsert.Params[0].AsStream.CopyFrom(oFS, -1);
    finally
      oFS.Free;
    end;
    // Flush / close the streams. Mandatory for ODBC-based, InterBase and
    // Firebird, MySQL drivers. Optional for other drivers (does nothing).
    qInsert.CloseStreams;
    Log('BLOB is written - internal streaming');

    ShowData;
    Log('BLOB is shown');
    FDConnection1.Commit;
  except
    FDConnection1.Rollback;
    raise;
  end;
end;
Was bedeutet das {id FDQA_Blob} im SQL-String und (blobdata), muss da nicht der Name des BlobFeldes rein?
Außerdem wird hier mit FileStream gearbeitet und nicht mit MemStream. Ich schreibe mein JPGArray, das ich im Speicher habe doch nicht erst auf die Platte um es dann in den Datensatz zu bekommen.

Angenommen ich habe eine Firebird Datenbank in der alle Daten liegen und einen MemTable in den ich alle Bilddaten der aktuellen ID halte. Felder ID,JPGPic.
In JPGPic soll mein JPegArray[0..119] rein. In dem ist entweder 1 Bild in JPegArray[0] oder 120 Bilder drin.

Ob ftMemTable geht ist noch fraglich, da hier in den Bemerkungen steht:
// The following drivers support Real BLOB Streaming:
// - SQLite (only external streams)
und fdMemtable ist doch SQLite.
Geht das dann überhaupt?
Oder ist Real Blob Streaming hier nicht nötig?
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 13:48
Der STream ist ja egal, einfach Deinen MemoryStream übergeben an den BlobStream in

Code:
qInsert.Params[0].AsStream.CopyFrom(oFS, -1);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 16:26
Falls der Blob leer bleibt oder der Anfang fehlt:

Delphi-Quellcode:
oFS.Position := 0;
qInsert.Params[0].AsStream.CopyFrom(oFS, -1);
Eventuell auch prüfen, ob man den Blob vorher Clear(en) sollte. (falls vorher mehr Daten drin waren, was neu geschrieben werden)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 16:41
Warum ParamStr[0] und wie sage ich in welches Feld der Stream geschrieben wird.

Wie bekomme ich mein Array[0..119] of TJPEGImage in einen MemoryStream (ofs) um diesen dann so zuweisen zu können.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 16:53
Params ... nicht ParamStr

such dir was aus, je nach dem wo es rein soll:
Params[123]
ParamByName('abc')
Fields[123]
FieldByName('abc')


TJPEGImage sollte doch sowas wie SaveToStream und LoadFromStream haben, wo du einen TMemoryStream nutzen kannst, bzw. vermutlich sogar direkt den Stream, welchen AsStream dir gibt.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 17:23
OK dann also etwa so

qBilder.FieldByName('JPGPic').AsStream.CopyFrom(MS tream, -1);

Jetzt nur noch Das Array in das MStream reinbringen.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: BlobStream in StringGrid speichern

  Alt 19. Mai 2022, 18:20
OK dann also etwa so

qBilder.FieldByName('JPGPic').AsStream.CopyFrom(MS tream, -1);

Jetzt nur noch Das Array in das MStream reinbringen.
Einfach die TPicture Klasse nutzen mit SaveToStream und dann aber die Stream.Position auf 0 setzen
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: BlobStream in StringGrid speichern

  Alt 23. Mai 2022, 11:08
Ich habe jetzt etwas gefunden und zusammengebaut das dem entspricht was ich vorhabe.
Ich schreibe und lese mein TJpegImage Array[0..19) direkt in ein BlobFeld und lese es so auch wieder.
Code:
// **************************************************************************
// * Read and Write Blob Stream                                            *
// **************************************************************************
procedure TDM.ReadBlobStream;
var
  BlobStream: TStream;
Begin
  // Bild aus Datenbank lesen und in AktData.JPegArray schreiben
  BlobStream := DM.qData.CreateBlobStream(DM.qData.FieldByName('PicData'), bmRead);
  BlobStream.Position := 0;
  Try
    BlobStream.ReadBuffer(AktData.JpegArray, sizeof(????????));
  Finally
    BlobStream.Free;
  End;
End;

procedure TDM.WriteBlobStream;
var
  BlobStream: TStream;
Begin
  // Bild aus AktData.JPegArray lesen und in Datenbank schreiben
  BlobStream := DM.qData.CreateBlobStream(DM.qData.FieldByName('PicData'), bmWrite);
  BlobStream.Position := 0;
  Try
    BlobStream.WriteBuffer(AktData.JpegArray, sizeof(AktData.JpegArray));
  Finally
    BlobStream.Free;
  End;
End;
Ist das so korrekt ??
Was muss ich bei SizeOf(??????) reinschreiben?

Geändert von Smiley (23. Mai 2022 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz