Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Komischer Datenbankeffekt (https://www.delphipraxis.net/194462-komischer-datenbankeffekt.html)

sko1 24. Nov 2017 09:23

Datenbank: SQLite • Version: ? • Zugriff über: FDConnection / FDQuery

Komischer Datenbankeffekt
 
Hallo,

ein besserer Threadtitel fiel mir nicht ein, ich debugge seit Stunden und komme nicht weiter:

Folgender Ablauf:
Es gibt eine global deklarierte Klasse, welche unter anderem ein Array beinhaltet.
Dieses wird beim Erstellen der Klasse mit SetLength eingestellt und gefüllt.

Nun speichere ich in einer SQLite-DB folgendermaßen:

- Tabellen anlegen
- Tabellen füllen

Jedes Tabelle füllen erzeugt eine Connection zur DB, füllt die Tabelle und Destroid diese Connection wieder.
Das Füllen der ersten Tabellen funktioniert, bei der dritten Tabelle ist beim .Connected := true der FDConnection plötzlich das Array leer (High()=-1)!!!!!

Da ich absolut keinen Zusammenhang sehe, das Tabelle füllen bei den ersten Malen funktioniert, bin ich mit meinem Latein am Ende!

Hat irgend jemand eine Idee wo ich ansetzen könnte?

Ciao
Stefan

sakura 24. Nov 2017 09:33

AW: Komischer Datenbankeffekt
 
Das eine hat sehr wahrscheinlich nichts mit dem anderen zu tun... Aber ohne den Source Code wird das hier ein Jahrmarktsraten...

...:cat:...

TiGü 24. Nov 2017 09:48

AW: Komischer Datenbankeffekt
 
Guck dir mal das Tutorial an:
http://www.delphipraxis.net/41047-tu...ortgeschr.html

Speziell der Abschnitt Datenhaltepunkte.
Damit kannst du eventuell herausfinden, wann und warum dein Array verändert wird.

sko1 24. Nov 2017 09:53

AW: Komischer Datenbankeffekt
 
Jetzt habe ich mal etwas entdeckt, aber warum das so ist, vielleicht weiß jemand etwas:

Den kompletten (sehr umfangreichen) Code kann ich leider nicht zur Verfügung stellen, ich versuche mal zu skizzieren:

global deklariert:

Delphi-Quellcode:
type
  TFeld = record
    Eintrag1: integer;
    Eintrag2: integer;
    ...
  end;

type
  TSettings = record
    Eintrag1: integer;
    Eintrag2: integer;
    Stream1 : TMemoryStream;
    Stream2 : TMemoryStream;
    ...
  end;

type
  TVorlage = class
  private
  public
    Filename: string;
    Settings: TSettings;
    Felder : Array of TFeld;
Zum Schreiben in die Datenbank folgender Codeschnipsel:

Delphi-Quellcode:
    Vorlage.Settings.Stream1.Position := 0;
    TBlobfield(FDQuery.FieldByName('Stream1'))
          .LoadFromStream(Vorlage.Settings.Stream1);
      end;

und mit dieser Zeile LoadFromStream... ist das Array of TFeld leer!

Kann jemand damit etwas anfangen?

Ciao
Stefan

sakura 24. Nov 2017 09:56

AW: Komischer Datenbankeffekt
 
Bist Du Dir sicher, dass das Feld als TBlobfield erstellt wurde? Überprüfe mal den Datentyp.

...:cat:...

sko1 24. Nov 2017 10:02

AW: Komischer Datenbankeffekt
 
ich denke schon, das Speichern / Laden der Streams hat ja vorher funktioniert, jetzt möchte ich zusätzlich das Array speichern und es wird dabei zerstört!

Delphi-Quellcode:
SQL.TEXT := 'CREATE TABLE IF NOT EXISTS [Vorlage] (Seite INTEGER, Stream1 BLOB, .......);';


Ciao
Stefan

sakura 24. Nov 2017 10:11

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von sakura (Beitrag 1387067)
Bist Du Dir sicher

...
Zitat:

Zitat von sko1 (Beitrag 1387068)
ich denke schon

Denken ist nicht überprüfen. ;-)

Unabhängig davon, es ist wahrscheinlich, dass der Fehler schon an anderer Stelle auftritt und durch einen Überlauf verursacht wurde. Wenn Du die Reihenfolge der Deklarationen in Deiner Klasse änderst, dann würdest Du evtl. den Inhalt einer anderen Variable zerstören.

...:cat:...

sko1 24. Nov 2017 10:22

AW: Komischer Datenbankeffekt
 
Wie bekomme ich solch einen Überlauf raus?
Selbst wenn ich den Stream auf Platte zwischenkopiere und daraus ins Datenbankfeld schreibe ist das Array futsch!

Delphi-Quellcode:
    Vorlage.Settings.Stream1.Position := 0;
    Vorlage.Settings.Stream1.SaveToFile('c:\temp\xxx');
    TBlobfield(FDQuery.FieldByName('Stream1')).LoadFromFile('c:\temp\xxx');
und zwar genau in dem Moment TBlobfield(FDQuery.FieldByName('Stream1')).LoadFro mFile

Ciao
Stefan

TiGü 24. Nov 2017 10:37

AW: Komischer Datenbankeffekt
 
Datenhaltepunkt...hallo? Irgendwer? Beitrag Nummer 3?

sko1 24. Nov 2017 10:39

AW: Komischer Datenbankeffekt
 
Ich habe umgebaut, es wird noch verwirrender:

Delphi-Quellcode:
 
   //umkopieren in anderen Stream
   ms:=TMemoryStream.Create();
   ms.Position := 0;
   ms.CopyFrom(Vorlage.Settings.Stream1, Vorlage.Settings.Stream1.size);
   ...
schon beim Kopieren in ms ist das Array Vorlage.Felder, was damit ja eigentlich überhaupt nichts zu tun hat, leer!

Ciao
Stefan

sko1 24. Nov 2017 10:40

AW: Komischer Datenbankeffekt
 
Zitat:

Datenhaltepunkt...hallo? Irgendwer? Beitrag Nummer 3?
ich debugge ja, was willst Du mir denn eigentlich damit sagen?

Ciao
Stefan

TiGü 24. Nov 2017 10:55

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von sko1 (Beitrag 1387075)
Zitat:

Datenhaltepunkt...hallo? Irgendwer? Beitrag Nummer 3?
ich debugge ja, was willst Du mir denn eigentlich damit sagen?

Ciao
Stefan

Hast du das Tutorial angeschaut?
Ein Datenhaltepunkt ist kein normaler roter Haltepunkt!
Du kannst explizit auf dein Array einen Datenhaltepunkt setzen und das Programm hält an, wenn auf der Adresse geschrieben wird.
Anhand des Call Stacks wirst du dann sicherlich schlauer.

sko1 24. Nov 2017 12:12

AW: Komischer Datenbankeffekt
 
Leider macht mich das überhaupt nicht schlauer, nur dümmer ;-)

Ich habe jetzt die Memorystreams in den Settings durch Strings ersetzt, welche ich an den entsprechenden Stellen dann wieder in einen Stream lade oder den Stream in String konvertiere.
Das Array bleibt ganz auch während des Wegschreibens in die Datenbank (FDQuery.fieldbyname('...').asstring aber dann beim FDQuery.Post ist das Array wieder weg!

Das kann doch alles nicht wahr sein!

Kommentiere ich das Schreiben dieser langen Strings aus ist nach Post alles noch in Ordnumg!

So langsam komme ich zu dem Eindruck, dass die FDQuery irgendwelche Probleme mit langen Feldinhalten hat?

Nur wie komme ich jetzt weiter?

Ciao
Stefan

TiGü 24. Nov 2017 12:34

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von sko1 (Beitrag 1387083)
Leider macht mich das überhaupt nicht schlauer, nur dümmer ;-)

Wenn du nicht genau verstanden hast wie es geht, dann frage doch einfach nach?!

Guck mal bitte hier ab Minute 31:30:
https://www.youtube.com/watch?v=eqs27gB7Zms

Zitat:

Zitat von sko1 (Beitrag 1387083)
Nur wie komme ich jetzt weiter?

Probiere mal folgendes.

Mache aus:
Delphi-Quellcode:
type
  TVorlage = class
  private
  public
    Filename: string;
    Settings: TSettings;
    Felder : Array of TFeld;
Jenes:
Delphi-Quellcode:
TWorkaround = class
public
  Felder : Array of TFeld;
end;

type
  TVorlage = class
  private
  public
    Filename: string;
    Settings: TSettings;
    FelderPerWorkaround :TWorkaround
...
  function GetFelder: Array of TFeld;
...
function TVorlage.GetFelder: Array of TFeld;
begin
  Result := FelderPerWorkaround.Felder;
end;
Das Array also in einer inneren Klasse "verstecken".

sko1 24. Nov 2017 12:54

AW: Komischer Datenbankeffekt
 
Danke für den Tip, werde ich sofort versuchen umzusetzen!

Inzwischen habe ich was ganz witziges entdeckt:

Vor dem Datenbankhandling erzeuge ich ein zweites Feldarray und fülle dieses aus der Vorlage.

Jetzt wird beim Datenbankschreiben das Originalarray nicht mehr zerstört!
Ich dachte als Würg-around dieses dann am Ende zurückzuschreiben...
Ist aber gar nicht notwendig!

Ich verstehe so langsam die Welt nicht mehr!

Ciao
Stefan

sko1 24. Nov 2017 13:09

AW: Komischer Datenbankeffekt
 
funktioniert nicht, "Bezeichner erwartet aber "Array" gefunden...

Delphi-Quellcode:
function GetFelder(): Array of TFeld;


Ciao
Stefan

TiGü 24. Nov 2017 13:14

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von sko1 (Beitrag 1387095)
funktioniert nicht, "Bezeichner erwartet aber "Array" gefunden...

Delphi-Quellcode:
function GetFelder(): Array of TFeld;


Delphi-Quellcode:
  TMeineKrassenFelder = Array of TFeld;

function GetFelder(): TMeineKrassenFelder;

sko1 24. Nov 2017 14:04

AW: Komischer Datenbankeffekt
 
Danke, hatte ich inzwischen auch gefunden...

Leider ist das jetzt mit dem Testen so eine Sache, an hunderten Stellen im Programm greife ich auf dieses Array zu, die muss ich jetzt alle erst mal auf den Workaround umbauen und diese Miniklasse auch dafür entsprechend erweitern...

Ich überlege ob ich alles, was da so noch verwendet wird, in eine extra Klasse auslagere, wer weiß ob es demnächst nicht auch noch andere Arrays "zerlegt"?

Was ich wie gesagt gar nicht verstehe, der alleinige Zugriff auf das Array vor dem Datenbankhandling bewahrt es vor der Zerstörung durch dieses....

Ciao
Stefan

TiGü 24. Nov 2017 14:24

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von sko1 (Beitrag 1387101)
Was ich wie gesagt gar nicht verstehe, der alleinige Zugriff auf das Array vor dem Datenbankhandling bewahrt es vor der Zerstörung durch dieses....

Sagt dir der Begriff FastMM etwas?
FullDebugMode mit externer FastMM-DLL?
https://github.com/pleriche/FastMM4

Das würde ich mal auf deine Anwendung loslassen.
Lesestoff:
http://delphibistro.com/?p=186
https://stackoverflow.com/questions/...om-fastmm?rq=1

(mal gucken wann der erste Schlaubi Schlumpf um die Ecke kommt und sagt: "FastMM ist seit Delphi ElfDrölf integriert" - leider ist das sehr rudimentär und hilft nur begrenzt beim Suchen solcher Fehler)

sko1 28. Nov 2017 07:38

AW: Komischer Datenbankeffekt
 
So, ich melde mich mal wieder...

Das verstecken in einer kleinen Klasse hat nichts gebracht, hinzu kommt dass das beschriebene Phänomen nicht mehr auftritt wenn ich den identischen Code auf dem Notebook (mit identischem RAD Studio) debugge!

Wie könnte man nun noch weiterkommen?

Ciao
Stefan

TiGü 28. Nov 2017 08:31

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von sko1 (Beitrag 1387312)
Wie könnte man nun noch weiterkommen?

Besteht das Problem jetzt nur noch darin, dass auf einen (1!) Entwicklungsrechner merkwürdige Phänomene auftreten?

sko1 28. Nov 2017 14:55

AW: Komischer Datenbankeffekt
 
Gute Frage!

Ich traue dem Radstudio jetzt nicht mehr über den Weg!
Ich muss doch ein Projekt egal auf welchem Rechner zum gleichen Ergebnis kompilieren können!

Wie bekomme ich die kompletten RAD-Studio-Einstellungen vom Notebook auf den großen Rechner?

Ciao
Stefan

TiGü 28. Nov 2017 14:58

AW: Komischer Datenbankeffekt
 
Laptop virtualisieren und dann nur noch mit der VM entwickeln. 8-) :lol:

Bernhard Geyer 28. Nov 2017 15:00

AW: Komischer Datenbankeffekt
 
Welche Version ist betroffen?
Gabs da nicht eine mit einem kapitalen Fehler bei offenen Arrays (Array of TFeld)?

hoika 28. Nov 2017 15:15

AW: Komischer Datenbankeffekt
 
Hallo,
ich würde gern mal den kompletten DB-Code um das FieldByName sehen.
Denn muss das nicht ParamByName heißen?

Und bist du sicher, dass die auf beiden Rechnern mit der gleichen, identischen DB arbeitest?

hoika 28. Nov 2017 15:19

AW: Komischer Datenbankeffekt
 
Hallo,
fehlt vielleicht irgendwo ein TXStream.Create?

sko1 29. Nov 2017 08:33

AW: Komischer Datenbankeffekt
 
So, endlich kann ich positive Rückmeldung geben!

Die Datenbank war nicht das eigentliche Problem, wie FastMM4 mir mitgeteilt hat.
Problemursache war das Array of TSonderfeld wobei

Delphi-Quellcode:
type
  TSonderfeld = record
    Feld1: integer;
    Feld2: integer;
    ...
  end;

ein primitiver Record war.
Diesen habe ich jetzt in eine Klasse gepackt und benutze nun ein Array dieser Klasse.

Warum ein Array aus Records hier Probleme gemacht hat (es gibt auch weitere solche Arrays ohne negative Effekte) und die Probleme nun als Klassen-Array beseitigt sind, entzieht sich allerdings meiner Kenntnis...

Ich werde auf jeden Fall vorsorglich auch die anderen Records als Klassen deklarieren!

Ciao
Stefan

TigerLilly 30. Nov 2017 08:50

AW: Komischer Datenbankeffekt
 
Aber das Problem ist jetzt größer geworden! Du weißt nicht, was das Problem war, aber es taucht nicht mehr auf. Das ist ganz übel. Fehler vermeiden != Fehler beheben.

So wie du das beschreibst, gibt es irgendwo Probleme mit nicht oder bereits initialisierten Objekten. Deswegen ist das Problem auch nicht gut reproduzierbar.

Deshalb: Erkenne den Fehler!

p80286 30. Nov 2017 09:07

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von TigerLilly (Beitrag 1387550)

So wie du das beschreibst, gibt es irgendwo Probleme mit nicht oder bereits initialisierten Objekten. Deswegen ist das Problem auch nicht gut reproduzierbar.

Eigentlich hat Sakura bereits in #7 darauf hingewiesen, aber diese Ursache scheint per Definitionem unmöglich zu sein.

Gruß
K-H

TigerLilly 30. Nov 2017 09:48

AW: Komischer Datenbankeffekt
 
Zitat:

Zitat von p80286 (Beitrag 1387554)
Eigentlich hat Sakura bereits in #7 darauf hingewiesen

Ich wollte mich keineswegs mit den Erkenntnissen von sakuara-san schmücken. Mir ging es auch weniger darum, was das Problem jetzt wirklich ist, sondern, dass "es taucht nicht mehr auf" und "es ist behoben" nicht das gleiche und schon gar nicht dasselbe sind.

p80286 30. Nov 2017 10:00

AW: Komischer Datenbankeffekt
 
Da hast Du mich falsch verstanden, mir ging es nicht um "fremde Federn" eher um Wiederholung die in diesem Falle leider vergebens ist. Ich stimme mit Deinen Folgerungen vollkommen überein.

Gruß
K-H

TigerLilly 30. Nov 2017 10:05

AW: Komischer Datenbankeffekt
 
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz