Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit TQuery und Records als Blob (https://www.delphipraxis.net/111555-probleme-mit-tquery-und-records-als-blob.html)

sandrocm 5. Apr 2008 11:30

Datenbank: Firebird • Version: 1.5 • Zugriff über: TQuery

Probleme mit TQuery und Records als Blob
 
Hallo ich habe einen Record mit mehrern Unterpunkten:

TIMTBild= record
Bildid:integer;
Bildfile,Bildpath,Bildnummer:string;
BildFileszuladen:Tlistestring;
Savepfad:string;
Savefile:string;
AusschnittXvon,AusschnittXbis:TListe;
AusschnittYvon,AusschnittYbis:TListe;
ROIlength:TListereal;
ROIBezeichnung:TListestring;
MainAusschnitt,LaengeAusschnitt:integer;
avi,bmpseq,bmpimage:boolean;
lokalisation:integer;
manualroi:real;
leftx,rightx,topx,bottomx,bildlaengeUltraschall:re al;
pixelsize:real;
laengesequenz:integer;
bildwidth,bildlength:real;
imgShown:integer;
AnzeigeNearWallIntima,AnzeigeFarWallIntima,Anzeige FarWallAdventitia:boolean;
IMTvalue:array of TIMT;
Seq:array of TSeq;
Chart:TChartview;
correctdetectedimg:integer;
init:Tinitalize;
end;

Wenn ich die Daten speichern möchte, lese ich zu jedem Record die einzelnen Unterpunkte aus und speichere sie jeweils für sich.
Wenn ich dann die Daten wieder einlade, setze ich eben jedes Einzelne Teil wieder zusammen und habe so meinen Record wieder.

Einziges Problem, ich langweile mich fast zu tode wenn ich den Record speichere bzw lade... Dauer so 10 Sekunden pro Record beim Speichern in Firebird...

Ich habe jetzt ein bisschen rum gesucht und habe ein paar Hinweise gefunden, das einen Record auch einfach komplett als Record speichern kann bzw den Record in einen Blob speichern kann?

Kann mir da jemand weiter helfen? Wäre super...

P.S. Ich greife auf die Datenbank mit einem TQuery zu...

Danke im Vorraus

hoika 6. Apr 2008 20:29

Re: Probleme mit TQuery und Records als Blob
 
Hallo,

> Einziges Problem, ich langweile mich fast zu tode wenn ich den Record speichere bzw lade...
> Dauer so 10 Sekunden pro Record beim Speichern in Firebird...

und was erwartest du jetzt ?

Ohne Quellcode ist das nur Rätselraten.

So auf's blaue

prepared Queries benutzt du nicht ?


Heiko

mkinzler 7. Apr 2008 07:02

Re: Probleme mit TQuery und Records als Blob
 
Ich vermute auch es ist der zeitaufwand umd den record (der ja wieder aus verschiedenen Strukturen (Listem komponenten, ...) besteht zu zerlegen in Inserts zu verwandeln und später das ganze umgekehrt.
Hier würde sich ein Blob sehr anbieten.
http://mc-computing.com/Databases/De...ird/Blobs.html
http://www.delphi-library.de/topic_+...ern_12042.html

hoika 7. Apr 2008 07:30

Re: Probleme mit TQuery und Records als Blob
 
Hallo,

die Frage ist ja, braucht er die einzelnen Daten
eigenständig, muss also danach gesucht werden können.
Wenn nicht, geht auch ein Blob.


Heiko

sandrocm 7. Apr 2008 16:33

Re: Probleme mit TQuery und Records als Blob
 
Sorry falls ich nicht genug mein Problem beschrieben habe.

Ich möchte grad nicht die Informationen einzeln zerlegen und denke das ein Blob das optimale wäre.

Aber wie speichere ich ein Record wie oben angegeben in einen Blob mit einem Query? Ich habe schon mal ein bisschen im Netz gesucht, aber keinen Code dazu gefunden. Ein Hinweis nur würde helfen.

Ziel: Record mit Blob über TQuery in Blob und wieder zurück?

Wie geht das... Vielleicht ist das eine zu triviale Frage, aber bei mir hängt es grad sorry

Gruss Markus

hoika 7. Apr 2008 18:16

Re: Probleme mit TQuery und Records als Blob
 
Hallo,

hier 2 meiner Routinen


Heiko

Delphi-Quellcode:

{
 name:
   UpdateTextBlobField_Ex
 usage:
   update a blob field
 parameter:
   theTableName      - table name
   thePrimaryKeyName - name of the primary key
   thePrimaryKeyValue - value of the primary key
   theFieldName      - field name of the blob field
   theText           - field value
 return parameter:
   theErrorStr - error message
 return:
   false on error
 notes:
   - additional to UpdateTextBlobField name of the
     primary key is needed
}
function UpdateTextBlobField_Ex(const theTableName: String;
  const thePrimaryKeyName: String; thePrimaryKeyValue: Integer;
  const theFieldName: String; const theText: String;
  var theErrorStr: String): Boolean;
var
  FQuerySQL : TQuery;
begin
  Result:= False;
  theErrorStr:= S_internal_error;

  try
    FQuerySQL := CreateQuery;  // TQuery.Create ...
    try
      with FQuerySQL do
      begin
        DataBaseName:= C_ALIASNAME; // Konstante

        SQL.Add('Update '+theTableName+' Set ');
        SQL.Add(theFieldName+'=:'+theFieldName);
        SQL.Add('Where '+thePrimaryKeyName+'=:Id');
        ParamByName('Id').AsInteger:= thePrimaryKeyValue;
        if theText='' then
        begin
          ParamByName(theFieldName).DataType:= ftBlob;
          ParamByName(theFieldName).Clear;
          ParamByName(theFieldName).Bound:= True;
        end
        else
        begin
          ParamByName(theFieldName).AsBlob:= theText;
        end;
        ExecSQL;
      end; { with FQuerySQL do }

      Result:= True;
    finally
      FQuerySQL.Free;
    end;
  except
    on E: Exception do theErrorStr:= E.message;
  end;
end; { UpdateTextBlobField_Ex }

{
 name:
   LoadTextBlobField_Ex
 usage:
   load the text from the blob field
 parameter:
   theTableName      - table name
   thePrimaryKeyName - name of the primary key
   thePrimaryKeyValue - value of the primary key
   theFieldName      - field name of the blob field
 return parameter
   theText           - the loaded field value
   theErrorStr       - error message
 return:
   false on error
 notes:
   - additional to LoadTextBlobField name of the
     primary key is needed
}
function LoadTextBlobField_Ex(const theTableName: String;
  const thePrimaryKeyName: String; thePrimaryKeyValue: Integer;
  const theFieldName: String; var theText: String;
  var theErrorStr: String): Boolean;
var
  FQuerySQL   : TQuery;
  StringStream : TStringStream;
  Stream      : TStream;
  bOK         : Boolean;
begin
  bOK:= False;

  theErrorStr:= S_internal_error;

  theText:= '';

  try
    FQuerySQL   := CreateQuery; // TQuery.Create ...
    StringStream := TStringStream.Create('');
    try
      with FQuerySQL do
      begin
        SQL.Add('Select '+theFieldName+' From '+theTableName);
        SQL.Add('Where '+thePrimaryKeyName+'=:Id');
        ParamByName('Id').AsInteger:= thePrimaryKeyValue;
        Open;
        try
          if QueryIsNotEmpty then
          begin
            Stream:= CreateBlobStream(FieldByName(theFieldName),bmRead);
            try
              StringStream.CopyFrom(Stream,0);
            finally
              Stream.Free;
            end;

            theText:= StringStream.DataString;

            bOK:= True;
          end;
        finally
          Close;
        end;
      end; { with FQuerySQL do }
    finally
      FQuerySQL.Free;
      StringStream.Free;
    end;
  except
    on E: Exception do
    begin
      theErrorStr:= E.message;
    end;
  end;

  Result:= bOK;
end; { LoadTextBlobField_Ex }


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