Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Dateiahängemit BLOB (https://www.delphipraxis.net/51976-dateiahaengemit-blob.html)

TheMiller 22. Aug 2005 00:32

Datenbank: MYSQL • Version: 4 • Zugriff über: ZEOS

Dateiahängemit BLOB
 
Hallo,

habe in meiner Tabell ein Feld namens "Anhang". Kann ich in einem Datensatz auch mehrere Dateianhänge in das BLOB-Feld "Anhang" eintragen?

Ich denke es geht nicht, aber fragen kann ich ja mal!

Danke

PS: Wo ist der Unterschied zwischen den Blob-Feldern (LongBlob, Blob etc.)

Sharky 22. Aug 2005 07:03

Re: Dateiahängemit BLOB
 
Zitat:

Zitat von DJ-SPM
... Kann ich in einem Datensatz auch mehrere Dateianhänge in das BLOB-Feld "Anhang" eintragen?

Hai DJ-SPM,

im Prinzip geht das natürlich. Du müsstest die Daten dann vorher in einen Stream schreiben und vor jedem "Datenblock" dessen Länge (Als INT64) eintragen.
Code:
Daten-Stream
  100 
  [i]Daten[/i]
  10578
  [i]Daten[/i]
  78
  [i]Daten[/i]
Aber ich würde das nicht machen ;-)
Die BLOBs würde ich in einer eigenen Tabelle abspeichern. Da der Anwender die Daten aus dem BLOB-Feld sicher nicht immer braucht sparst Du so eine riesen Menge an Datentransfer.
Ein Beispiel: Du hast 1000 Datensätze. In jedem Datensatz ist ein BLOB-Feld mit 10 kByte an Daten. Wenn Du nun ein
SQL-Code:
SELCT * FROM tabelle
machst hast Du schon einmal mindestens 10 MB an Daten die vom Server zum Client übertragen werden müssen.

Jetzt stellt sich nur die Frage ob die Daten aus einem BLOB-Feld immer nur zu einem Datensatz gehören oder ob sie auch zu verschiedenen gehören könnten.

Im ersten Fall brauchst Du nur eine extra Tabelle für die BLOBs
Code:
 Haupt_Tabelle:
 --------------
 id   : integer (autoinc), PK
 blubb : varchar(10)
 meow : DateTime

 Blobb_Tabelle:
 --------------
 id                 : integer (autoinc), PK
 fk_haupt_tabelle_id : integer
 anhang             : blobb
Die Einträge der Blobb_Tabelle verbindest Du jetzt einfach über das Feld fk_haupt_tabelle_id mit dem PK der Haupttabelle. Somit kannst Du beliebig viele BLOBs mit einem Datensatz der Haupttabelle verknüpfen. (1:n Relation).

Wenn Du ein BLOBB mit verschiedenen Datensatzen der Haupt-Tabelle verbinden möchtest (n:m Relation) brauchst Du eine dritte Tabelle:
Code:
 Haupt_Tabelle:
 --------------
 id   : integer (autoinc), PK
 blubb : varchar(10)
 meow : DateTime

 Blobb_Tabelle:
 --------------
 id    : integer (autoinc), PK
 anhang : blobb

 Haupt_Blobb_Tabelle:
 --------------------
 fk_haupt_tabelle_id : integer
 fk_blobb_tabelle_id : integer
Zitat:

PS: Wo ist der Unterschied zwischen den Blob-Feldern (LongBlob, Blob etc.)
  • *
  • TINYBLOB / TINYTEXT
    Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 255 (2^8 - 1) Zeichen.
  • BLOB / TEXT
    Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 65535 (2^16 - 1) Zeichen.
  • MEDIUMBLOB / MEDIUMTEXT
    Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 16777215 (2^24 - 1) Zeichen.
  • LONGBLOB / LONGTEXT
    Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 4294967295 (2^32 - 1) Zeichen.

Bei einem Longblob ist zu beachten das (zumindest bei mySQL 3) das Client-Server-Protokoll und MyISAM-Tabellen momentan
eine Beschränkungen auf 16 MB pro Kommunikationspaket / Tabellenzeile haben.
(*Quelle: Meine mySQL-Dokumentation)

TheMiller 22. Aug 2005 11:11

Re: Dateiahängemit BLOB
 
Das nenne ich mal eine Hilfe!

Ich danke dir!

TheMiller 25. Aug 2005 16:29

Re: Dateiahängemit BLOB
 
So,

jetzt habe ich doch noch eine kleine Frage. Du "sagtest"

Zitat:

Die Einträge der Blobb_Tabelle verbindest Du jetzt einfach über das Feld fk_haupt_tabelle_id mit dem PK der Haupttabelle
Doch mit welchen Statement kann ich das Verbinden?

[OT]Und noch was: Wenn ich jmd. zitieren will, wie mache ich das, dass über dem Zitat "Shary hat folgendes geschrieben" steht?[/OT]

Sharky 25. Aug 2005 16:37

Re: Dateiahängemit BLOB
 
Zitat:

Zitat von DJ-SPM
... Doch mit welchen Statement kann ich das Verbinden?

Wenn Du einen eintrag in der "HauptTabelle" machst ermittest Du die ID des Datensatzes. Jetzt machst Du einen neuen Eintrag in der "Blob-Tabelle" und trägst die ID des Datensatzes aus der Haupttabelle im Feld fk_haupt_tabelle_id ein.


Zitat:

[OT]Und noch was: Wenn ich jmd. zitieren will, wie mache ich das, dass über dem Zitat "Shary hat folgendes geschrieben" steht?[/OT]
Einfach auf den "Zitat-Button" neben dem Beitrag klicken.
Oder manuel - [*quote="Sharky"] ..... [*/quote] (ohne die * )

TheMiller 25. Aug 2005 17:16

Re: Dateiahängemit BLOB
 
Achso, ich dachte da gab es noch eine spezielle Funktion in MySQL. So mach ich es schon die ganze Zeit. Danke (auch an Spider)

Sharky 25. Aug 2005 17:27

Re: Dateiahängemit BLOB
 
Zitat:

Zitat von DJ-SPM
... So mach ich es schon die ganze Zeit. .

hihi... ich habe trotzdem mal ein Beispiel ;-)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  last_id: integer;
begin
  last_id := NeuerEintrag(Edit1.Text); // Eintrag in die Haupt-Tabelle
  NeuerAnhang(last_ID, 'c:\test.jpg'); // Eintrag in die Blob-Tabelle
end;

function TForm1.NeuerEintrag(ablubb: string): integer;
var
  query: TZQuery;
begin
  query := TZQuery.Create(self);
  try
    with Query do
    begin
      Connection := ZConnection1;
      Close;
      SQL.Text := 'INSERT INTO haupt_tabelle (blubb) VALUES (:pblubb)';
      ParamByName('pblubb').AsString := Edit1.Text;
      ExecSQL;
      Close;
      SQL.Text := 'SELECT LAST_INSERT_ID()';
      Open;
      Result := Fields[0].AsInteger;
      Close;
    end;
  finally
    query.Free;
  end;
end;

procedure TForm1.NeuerAnhang(aID: integer; filename: string);
var
  fstream: TMemoryStream;
  query: TZQuery;
begin
  fstream := TMemoryStream.Create;
  query := TZQuery.Create(self);
  try
    fstream.LoadFromFile(filename);
    fstream.Position := 0;
    with Query do
    begin
      Connection := ZConnection1;
      Close;
      SQL.Text := 'INSERT INTO blob_tabelle (fk_haupt_tabelle_id,anhang) ' + #10 +
        'VALUES (:pfk_id, :panhang)';
      ParamByName('pfk_id').AsInteger := aID;
      ParamByName('panhang').LoadFromStream(fstream, ftBlob);
      ExecSQL;
    end;
  finally
    query.Free;
    fstream.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 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