Announcement

Collapse
No announcement yet.

Interbase & Blob-Feld: Speicherloch?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Interbase & Blob-Feld: Speicherloch?

    Hallo !

    Ich habe folgendes Problem:
    Ich nutze 2 Interbase Datenbankobjekte, eines als Quelle und eines als Ziel für einen Kopiervorgang. Als Quelle nutze ich TIBQuery, als Ziel TIBTable. Das kopieren aller Felder geschieht folgendermaßen:

    for i := 0 to DataModule1.IBTableCURTAB2.FieldCount -1 do begin<BR>
    sField := DataModule1.IBQueryCURTAB2.Fields[i].FieldName;<BR>
    DataModule2.IBTableCURTAB[sField] := DataModule1.IBQueryCURTAB2[sField];<BR>
    end;<BR>

    Funktioniert auch alles. Aber: die Anwendung alloziert Speicher. Und zwar genau soviel, wie in den Blobfeldern an Größe gespeichert ist. Dies liegt offenbar nicht am Ziel, da ich durch

    DataModule2.IBTransaction2.Commit();<BR>
    DataModule2.IBTableCURTAB.Active := FALSE;<BR>
    DataModule2.IBTableCURTAB.Close;<BR>
    if not DataModule2.IBTransaction2.InTransaction then<BR>
    DataModule2.IBTransaction2.StartTransaction();<BR>
    DataModule2.IBTableCURTAB.Open;<BR>
    DataModule2.IBTableCURTAB.Active := TRUE;<BR>

    die Tabelle regelmäßig schließe und wieder öffne. Der allozierte Speicher wird erst wieder freigegeben, wenn die Quelldatenbank schließe und wieder öffne. Frage: wie kann ich verhindern, daß für die Blobfelder in der Applikation der Speicher nicht wieder freigegeben wird?

    Mfg
    Joachim Logisch

  • #2
    Das kann nicht gehen (auch wenn es zufälligerweise geht)

    DataModule2.IBTableCURTAB[sField] := DataModule1.IBQueryCURTAB2[sField];

    Du Weist Deiner Einen Tabellen ein Feld einer anderern Tabelle zu und nicht die Inhalte.

    Daher

    DataModule2.IBTableCURTAB[sField].AsVariant := DataModule1.IBQueryCURTAB2[sField].AsVariant;

    oder sowas

    Comment


    • #3
      Doch, das kann gehen. Hier ein Auszug aus der Hilfe zu Delphi:

      FieldValues arbeitet mit jedem Feldtyp zusammen, da als Parameter und Rückgabewert Varianten verwendet werden. Da FieldValues die Standardeigenschaft von TDataSet ist, braucht der Eigenschaftsname beim Zugriff nicht angegeben zu werden. So sind beispielsweise die folgenden beiden Anweisungen semantisch identisch. Sie schreiben den Wert eines Eingabefeldes in ein Integer-Feld:

      Customers.FieldValues['CustNo'] := Edit1.Text;<BR>
      Customers['CustNo'] := Edit1.Text;<BR>

      Sprich, genaugenommen ist mein o.g. Code äquivalent zu:<BR>

      for i := 0 to DataModule1.IBTableCURTAB2.FieldCount -1 do begin<BR>
      sField := DataModule1.IBQueryCURTAB2.Fields[i].FieldName;<BR>
      DataModule2.IBTableCURTAB.FieldValues[sField] := DataModule1.IBQueryCURTAB2.FieldValues[sField];<BR>
      end;<BR>

      Also das sollte nicht der Fehler sein (funktioniert beides).

      Mfg, Joachim Logisc

      Comment


      • #4
        Sorry, das die das jetzt mit Default Properties möglich machen, habe ich nicht gewußt. Erhöht zwar nicht gerade die Lesbarkeit, würde ich nie einsetzen auch wenn ich könnte. Nunn denn, dann fällt mir erstmal nichts mehr ein

        Comment


        • #5
          Hallo,

          über die Suche nach der Zeichenkette <b>UniDirectional</b> lassen sich hier im FORUM Hinweise für die Ursache des Problems (und die Lösung dafür) finden.

          P.S. Die Kombination von TIBQuery + TIBTable ist für diese Aufgabe wahrlich nicht das Optimum, zumal man TIBTable niemals freiwillig einsetzen sollte :-)
          &#10

          Comment


          • #6
            Hallo Herr Kosch!

            Hab' schon vor meiner Anfrage hier mich ein bischen umgesehen: UniDirectional ist auf TRUE gesetzt. Hab' noch mal eine Miniprogramm geschrieben (2 Datenbanken, mit einer Query als Quelle und einem Table als Ziel). Ergebnis: kein Speicherbedarf, solange ich keine Blobfelder habe. Bei Blobfeldern wird Speicher (Quelldatenbank, die Zieldatenbank kann ich sogar regelmäßig schließen) alloziert, soviel wie in den Blobfeldern als Information enthalten ist. Hier nochmal der Code des Kopierens (ist nicht optimal wegen Schließen der Zieldatenbank, zeigt aber deutlich wo das Problem liegt):

            <PRE>
            procedure TForm1.Button1Click(Sender: TObject);
            var
            i: integer;
            sField: string;
            iCount: integer;
            sCountStr:string;
            begin
            iCount := 0;
            IBDatabase1.connected := TRUE;
            IBDatabase2.connected := TRUE;
            IBTable2.Active := TRUE;
            if IBTransAction2.InTransaction = FALSE then
            IBTransAction2.StartTransaction;
            IBTransAction1.StartTransaction;
            IBQuery1.Active := FALSE;
            IBQuery1.SQL.Clear;
            IBQuery1.SQL.Add('Select * from Scan');
            IBQuery1.Open;
            IBQuery1.First();
            while IBQuery1.Eof = FALSE do begin
            inc(iCount);
            IBTable2.Insert;
            for i := 0 to IBQuery1.FieldCount -1 do begin
            sField := IBQuery1.Fields[i].FieldName;
            IBTable2.FieldValues[sField] := IBQuery1.FieldValues[sField];
            end;
            IBTable2.Post;
            IBQuery1.Next;
            if iCount mod 50 = 0 then begin
            IBTransAction2.Commit;
            IBTable2.Active := FALSE;
            IBDatabase2.Close;
            IBDatabase2.Open;
            IBTable2.Active := TRUE;
            if IBTransAction2.InTransaction = FALSE then
            IBTransAction2.StartTransaction;
            end;
            end;
            IBTransAction1.Commit;
            MessageBeep(MB_ICONASTERISK);
            end;
            </PRE>

            Bei Interbase 6 möchte ich auf jeden Fall bleiben, falls es an den IB-Komponenten liegen sollte.

            Zum Thema TIBTable und TIBQuery: Gibt es eine bessere Alternative? Ich dachte, daß TIBQuery für Abfragen konstruiert sei un TIBTable, wenn ich Daten erzeugen möchte o.ä.

            Mfg, Joachim Logisc

            Comment


            • #7
              TIBTable sollte man nie verwenden

              TIBQuery wenn es denn sein muß, aber eigentlich geht es auch ohne

              Beide dienen mehr oder weniger der Kompatinbität

              Reiner IB Zugriff am besten üner TIBDataSet

              Comment


              • #8
                Hallo,

                mein Vorreder hat (wie immer) Recht, was TIBTable und TIBQuery angeht. Normalerweise ist TIBDataSet richtig, ab in diesem speziellen Fall würde ich zu 2 x <b>TIBSQL</b> greifen.

                Das Problem bei TIBTable liegt darin, dass nach jedem INSERT die <b>vollständige</b> Datenmenge im lokalen Puffer vorgehalten werden muss, d.h. die Situation verschlechtert sich mit jedem neu eingefügten Datensatz. Mit TIBSQL gibt es diese Probleme nicht, da dort maximal nur 2 Datensatzpuffer vorkommen können

                Comment


                • #9
                  Hallo zusammen!

                  So, hab' jetzt sowohl TIBDataSet als auch TIBSQL probiert, mit folgendem <B>negativen</B> Ergebnis (ist etwas länger, aber hoffentlich für die Erklärung hilfreich):

                  TIBDataSet: die Daten werden vollständig kopiert, allerdings habe ich hier auch immer noch das Speicherloch. Der Code zum kopieren lautet (IBDataSet1 ist die Quell- IBDataSet2 die Zieldatenbank):

                  <PRE>
                  while DataModule2.IBDataSet1.Eof = FALSE do begin
                  inc(iCount);
                  DataModule2.IBDataSet2.Insert;
                  for i := 0 to DataModule2.IBDataSet1.FieldCount -1 do begin
                  sField := DataModule2.IBDataSet1.Fields[i].FieldName;
                  DataModule2.IBDataSet2.FieldValues[sField] := DataModule2.IBDataSet1.FieldValues[sField];
                  end;
                  DataModule2.IBDataSet2.Post;
                  DataModule2.IBDataSet1.Next;
                  if iCount mod 50 = 0 then begin
                  DataModule2.IBTransAction2.Commit;
                  DataModule2.IBDataSet2.Active := FALSE;
                  DataModule2.IBDatabase2.Close;
                  DataModule2.IBDatabase2.Open;
                  DataModule2.IBDataSet2.Active := TRUE;
                  if DataModule2.IBTransAction2.InTransaction = FALSE then
                  DataModule2.IBTransAction2.StartTransaction;
                  end;
                  end;
                  </PRE>

                  D.h. alle 50 Elemente mache ich die Ziel-Datenbank zu und wieder auf. Das heißt das ist zwar schneller als TIBTable und TIBQuery, aber immer noch das Speicherloch bei Blobfeldern. Wenn ich die Blobfelder überspringe beim kopieren der Daten (also im Zieldatensatz auf Null lasse), dann gibts kein Speicherloch.

                  TIBSQL: Hab' ein bischen gebraucht, um mich da einzuarbeiten. Ergebnis ist jetzt: TIBSQL1 der Quelldatenbank hat folgenden SQL-String:
                  <PRE>
                  select SCANNERID,DATUM,ZEIT,STAPEL,STAPELBARCODE,POSITION STAPEL, LFDNR, BARCODE,DFUE,LG,BELEG,BILD,SIGN,FIELDS,FIELDSEXPOR T, EXPORTPFAD,EXPORTTIFFPFAD,PDF417,EXPORTMARK from scan
                  </PRE>
                  d.h. hier das alle Felder selektiert werden. BILD und BARCODE sind die Blobfelder. In TIBSQL2 (Zieldatenbank) lautet der SQL-String dann:
                  <PRE>
                  INSERT INTO scan (Scannerid,DATUM,ZEIT,STAPEL,STAPELBARCODE,POSITIO NSTAPEL, LFDNR, BARCODE,DFUE,LG,BELEG,BILD,SIGN,FIELDS,FIELDSEXPOR T,EXPORTPFAD,EXPORTTIFFPFAD,PDF417,EXPORTMARK)
                  VALUES (:SCANNERID,ATUM,:ZEIT,:STAPEL,:STAPELBARCODE,:POSITIONSTAPEL, :LFDNR,:BARCODE,FUE,:LG,:BELEG,:BILD,:SIGN,:FIELDS,:FIELDSEXPORT,: EXPORTPFAD,:EXPORTTIFFPFAD,:PDF417,:EXPORTMARK)
                  </PRE>
                  also alle Felder, auch die Blobs behandelt wie der Rest.

                  Der Kopier-Code lautet:
                  <PRE>
                  while DataModule2.IBSQL1.Eof = FALSE do begin
                  inc(iCount);
                  if DataModule2.IBTransAction2.InTransaction = FALSE then
                  DataModule2.IBTransAction2.StartTransaction;
                  DataModule2.IBSQL2.Prepare;
                  for i := 0 to 18 do begin
                  DataModule2.IBSQL2.Params[i].AsVariant := DataModule2.IBSQL1.Fields[i].AsVariant;
                  end;
                  DataModule2.IBSQL2.ExecQuery;
                  DataModule2.IBTransAction2.Commit;
                  DataModule2.IBSQL1.Next;
                  if iCount mod 50 = 0 then begin
                  DataModule2.IBDatabase2.Close;
                  DataModule2.IBDatabase2.Open;
                  if DataModule2.IBTransAction2.InTransaction = FALSE then
                  DataModule2.IBTransAction2.StartTransaction;
                  end;
                  end;
                  </PRE>

                  Ergebnis hier: jetzt habe ich kein Speicherloch mehr, <B>aber in den Blobfeldern stehen jetzt keine Daten sondern nur (Blob)</B>. Mache ich hier was falsch oder kann man mit TIBSQL nicht auf Blob-felder zugreifen?

                  Bin am Ende mit meinen Ideen :-(

                  Joachi

                  Comment


                  • #10
                    Prüfe den Typ von Fields[i] und wenn es Blob ist dann schalte einen MemoryStream (SaveTo und LoadFrom) dazwischen. Da sollte gehen

                    Comment


                    • #11
                      Hallo,

                      es gibt aus meiner Sicht verschiedene Wege, das folgende Beispiel stellt 3 davon vor. Die beiden Datenbanktabellen haben dabei den folgenden Aufbau:
                      <pre>
                      CREATE TABLE BLObSource (
                      ID INTEGER NOT NULL PRIMARY KEY,
                      Info VARCHAR(20),
                      Text BLOB SUB_TYPE 1);

                      CREATE TABLE BLObTarget (
                      ID INTEGER NOT NULL PRIMARY KEY,
                      Info VARCHAR(20),
                      Text BLOB SUB_TYPE 1);
                      </pre>
                      Weg 1: 2 x TIBSQL
                      <pre>
                      procedure TForm1.Button1Click(Sender: TObject);
                      begin
                      IBSQLSelect.ExecQuery;
                      while not IBSQLSelect.Eof do
                      begin
                      IBSQLInsert.Params[0].Value := IBSQLSelect.Fields[0].Value;
                      IBSQLInsert.Params[1].Value := IBSQLSelect.Fields[1].Value + ' (Kopie)';
                      IBSQLInsert.Params[2].Value := IBSQLSelect.Fields[2].AsString;
                      IBSQLInsert.ExecQuery;
                      IBSQLSelect.Next;
                      end;
                      IBSQLSelect.Close;
                      IBTransaction1.CommitRetaining;
                      IBDataSet2.Active := True;
                      end;
                      </pre>
                      Weg 2: 2 x TIBQuery
                      <pre>
                      procedure TForm1.Button2Click(Sender: TObject);
                      begin
                      IBDataSet2.Active := False;
                      IBQuerySelect.Open;
                      while not IBQuerySelect.Eof do
                      begin
                      IBQueryInsert.Params[0].Value := IBQuerySelectID.Value;
                      IBQueryInsert.Params[1].Value := IBQuerySelectINFO.Value + ' (Kopie)';
                      IBQueryInsert.Params[2].Value := IBQuerySelectTEXT.Value;
                      IBQueryInsert.ExecSQL;
                      IBQuerySelect.Next;
                      end;
                      IBQuerySelect.Close;
                      IBTransaction1.CommitRetaining;
                      IBDataSet2.Active := True;
                      end;
                      </pre>
                      Weg 3: 2 x TIBQuery + TStream
                      <pre>
                      procedure TForm1.Button3Click(Sender: TObject);
                      var
                      aData : TStream;
                      begin
                      IBDataSet2.Active := False;
                      IBQuerySelect.Open;
                      while not IBQuerySelect.Eof do
                      begin
                      aData := IBQuerySelect.CreateBlobStream(IBQuerySelectTEXT, bmRead);
                      IBQueryInsert.Params[0].Value := IBQuerySelectID.Value;
                      IBQueryInsert.Params[1].Value := IBQuerySelectINFO.Value + ' (Kopie)';
                      IBQueryInsert.Params[2].LoadFromStream(aData, ftBlob);
                      IBQueryInsert.ExecSQL;
                      IBQuerySelect.Next;
                      aData.FreeInstance;
                      end;
                      IBQuerySelect.Close;
                      IBTransaction1.CommitRetaining;
                      IBDataSet2.Active := True;
                      end;
                      </pre>
                      Die Konfiguration im Objektinspektor sieht dabei wie folgt aus:
                      <pre>
                      object Form1: TForm1
                      Left = 290
                      Top = 116
                      Width = 550
                      Height = 524
                      Caption = 'Form1'
                      Color = clBtnFace
                      Font.Charset = DEFAULT_CHARSET
                      Font.Color = clWindowText
                      Font.Height = -11
                      Font.Name = 'MS Sans Serif'
                      Font.Style = []
                      OldCreateOrder = False
                      PixelsPerInch = 96
                      TextHeight = 13
                      object DBGrid1: TDBGrid
                      Left = 8
                      Top = 80
                      Width = 281
                      Height = 105
                      DataSource = DataSource1
                      TabOrder = 0
                      TitleFont.Charset = DEFAULT_CHARSET
                      TitleFont.Color = clWindowText
                      TitleFont.Height = -11
                      TitleFont.Name = 'MS Sans Serif'
                      TitleFont.Style = []
                      end
                      object DBMemo1: TDBMemo
                      Left = 296
                      Top = 80
                      Width = 241
                      Height = 105
                      DataField = 'TEXT'
                      DataSource = DataSource1
                      TabOrder = 1
                      end
                      object DBNavigator1: TDBNavigator
                      Left = 56
                      Top = 48
                      Width = 240
                      Height = 25
                      DataSource = DataSource1
                      TabOrder = 2
                      end
                      object StatusBar1: TStatusBar
                      Left = 0
                      Top = 478
                      Width = 542
                      Height = 19
                      Panels = <>
                      SimplePanel = False
                      end
                      object Button1: TButton
                      Left = 8
                      Top = 200
                      Width = 75
                      Height = 25
                      Caption = 'TIBSQL'
                      TabOrder = 4
                      OnClick = Button1Click
                      end
                      object DBGrid2: TDBGrid
                      Left = 8
                      Top = 344
                      Width = 281
                      Height = 120
                      DataSource = DataSource2
                      TabOrder = 5
                      TitleFont.Charset = DEFAULT_CHARSET
                      TitleFont.Color = clWindowText
                      TitleFont.Height = -11
                      TitleFont.Name = 'MS Sans Serif'
                      TitleFont.Style = []
                      end
                      object DBMemo2: TDBMemo
                      Left = 296
                      Top = 344
                      Width = 241
                      Height = 121
                      DataField = 'TEXT'
                      DataSource = DataSource2
                      TabOrder = 6
                      end
                      object Button2: TButton
                      Left = 8
                      Top = 240
                      Width = 75
                      Height = 25
                      Caption = 'TIBQuery'
                      TabOrder = 7
                      OnClick = Button2Click
                      end
                      object Button3: TButton
                      Left = 176
                      Top = 240
                      Width = 75
                      Height = 25
                      Caption = 'TIBQuery2'
                      TabOrder = 8
                      OnClick = Button3Click
                      end
                      object IBDatabase1: TIBDatabase
                      Connected = True
                      DatabaseName = 'C:\Database\IB6BLOB.GDB'
                      Params.Strings = (
                      'user_name=sysdba'
                      'password=masterkey'
                      'lc_ctype=ISO8859_1')
                      LoginPrompt = False
                      DefaultTransaction = IBTransaction1
                      IdleTimer = 0
                      SQLDialect = 3
                      TraceFlags = []
                      Left = 8
                      Top = 8
                      end
                      object IBTransaction1: TIBTransaction
                      Active = True
                      DefaultDatabase = IBDatabase1
                      AutoStopAction = saNone
                      Left = 8
                      Top = 40
                      end
                      object IBDataSet1: TIBDataSet
                      Database = IBDatabase1
                      Transaction = IBTransaction1
                      BufferChunks = 1000
                      CachedUpdates = False
                      DeleteSQL.Strings = (
                      'delete from BLOBSOURCE'
                      'where'
                      ' ID = :OLD_ID')
                      InsertSQL.Strings = (
                      'insert into BLOBSOURCE'
                      ' (ID, INFO, TEXT)'
                      'values'
                      ' (:ID, :INFO, :TEXT)')
                      RefreshSQL.Strings = (
                      'Select '
                      ' ID,'
                      ' INFO,'
                      ' TEXT'
                      'from BLOBSOURCE '
                      'where'
                      ' ID = :ID')
                      SelectSQL.Strings = (
                      'select ID, INFO, TEXT from BLOBSOURCE')
                      ModifySQL.Strings = (
                      'update BLOBSOURCE'
                      'set'
                      ' ID = :ID,'
                      ' INFO = :INFO,'
                      ' TEXT = :TEXT'
                      'where'
                      ' ID = :OLD_ID')
                      Active = True
                      Left = 48
                      Top = 8
                      end
                      object DataSource1: TDataSource
                      DataSet = IBDataSet1
                      Left = 88
                      Top = 8
                      end
                      object IBSQLSelect: TIBSQL
                      Database = IBDatabase1
                      ParamCheck = True
                      SQL.Strings = (
                      'select ID, INFO, TEXT from BLOBSOURCE')
                      Transaction = IBTransaction1
                      Left = 96
                      Top = 200
                      end
                      object IBSQLInsert: TIBSQL
                      Database = IBDatabase1
                      ParamCheck = True
                      SQL.Strings = (
                      'INSERT INTO BLOBTARGET (ID,INFO,TEXT) VALUES (:ID,:INFO,:TEXT)')
                      Transaction = IBTransaction1
                      Left = 136
                      Top = 200
                      end
                      object IBDataSet2: TIBDataSet
                      Database = IBDatabase1
                      Transaction = IBTransaction1
                      BufferChunks = 1000
                      CachedUpdates = False
                      SelectSQL.Strings = (
                      'select ID, INFO, TEXT from BLOBTARGET')
                      Active = True
                      Left = 48
                      Top = 312
                      end
                      object DataSource2: TDataSource
                      DataSet = IBDataSet2
                      Left = 88
                      Top = 312
                      end
                      object IBQuerySelect: TIBQuery
                      Database = IBDatabase1
                      Transaction = IBTransaction1
                      BufferChunks = 1000
                      CachedUpdates = False
                      SQL.Strings = (
                      'select ID, INFO, TEXT from BLOBSOURCE')
                      Left = 96
                      Top = 240
                      object IBQuerySelectID: TIntegerField
                      FieldName = 'ID'
                      Origin = 'BLOBSOURCE.ID'
                      Required = True
                      end
                      object IBQuerySelectINFO: TIBStringField
                      FieldName = 'INFO'
                      Origin = 'BLOBSOURCE.INFO'
                      end
                      object IBQuerySelectTEXT: TMemoField
                      FieldName = 'TEXT'
                      Origin = 'BLOBSOURCE.TEXT'
                      BlobType = ftMemo
                      Size = 8
                      end
                      end
                      object IBQueryInsert: TIBQuery
                      Database = IBDatabase1
                      Transaction = IBTransaction1
                      BufferChunks = 1000
                      CachedUpdates = False
                      SQL.Strings = (
                      'INSERT INTO BLOBTARGET (ID,INFO,TEXT) VALUES (:ID,:INFO,:TEXT)')
                      Left = 136
                      Top = 240
                      ParamData = <
                      item
                      DataType = ftInteger
                      Name = 'ID'
                      ParamType = ptUnknown
                      end
                      item
                      DataType = ftString
                      Name = 'INFO'
                      ParamType = ptUnknown
                      end
                      item
                      DataType = ftBlob
                      Name = 'TEXT'
                      ParamType = ptUnknown
                      end>
                      end
                      end
                      </pre&gt

                      Comment


                      • #12
                        <B>[Wiederholung aus anderer Diskussion]</B>

                        Hallo!

                        Habe mal folgenden Teil meiner Applikation geändert (TIBSQL)

                        statt:

                        DataModule2.IBSQL2.Params[i].AsVariant := DataModule2.IBSQL1.Fields[i].AsVariant;

                        jetzt für die Blobfelder (und nur für diese):

                        DataModule2.IBSQL2.Params[i].Value := DataModule2.IBSQL1.Fields[i].AsString

                        Jetzt sind alle Daten da. Schön. Aber leider: <B>wieder das Speicherloch</B> (siehe andere Diskussion). Ich gehe jetzt davon aus, daß die von mir verwendete Konstellation nicht für das kopieren von Blobfeldern geeignet ist, d.h. nur mit Speicherverlust (bis zum Schließen der Quelldatenbank). Würd' mich interessieren, ob noch andere dieses Problem haben. Ich persönlich werde wohl nichts weiter mehr machen, sondern das Problem anderweitig umgehen. Vielen Dank trotzdem an alle, die mir geholfen haben.
                        <PRE>
                        Meine Konstellation:
                        Borland Delphi Enterprise 5.0 (Compilierung 5.62)
                        Interbase 6 Open Edition Version 1.0.0.338
                        Blob-Datenfelder: 2 x Feldtyp BLOB SUB_TYPE TEXT SEGMENT SIZE 80
                        </PRE>

                        Werde jetzt alle Blob-Felder aus meiner Applikation verbannen müssen :-(

                        Mfg, Joachim Logisc

                        Comment


                        • #13
                          Hallo,

                          was passiert bei meinem 3. Weg (über TStream, der am Ende über FreeInstance explizit freigegeben wird)

                          Comment


                          • #14
                            Hallo,

                            es werden alle Daten kopiert, aber ich habe immer noch Speicherverlust. Es ist scheinbar völlig egal, wie ich auf die Daten zugreife. Immer wenn ich Blobfelder dabeihabe, geht mir der Speicher in der Größe des Inhaltes der Blobfelder flöten. Wie der Speicherverlust sich äußert: sie andere Diskussion.

                            Mfg, Joachim Logisc

                            Comment

                            Working...
                            X