Entwickler-Ecke

Datenbanken - ADO mit Datenmodul führt zum Absturz


tschinkes - Mi 02.02.05 10:37
Titel: ADO mit Datenmodul führt zum Absturz
Moin,
hab momentan folgendes Prob:
Ich habe auf einem Datenmodul einige ADO Komponenten, nun versuche ich aus einer ADOQuery aus dem datenmodul zuzugreifen um eine ListView im Hauptformular zu füllen, aber sobald ich das Programm starte, hängt es sich an der Stelle auf, indem ich zum ersten mal überhaupt auf das datenmodul zugreifen will! Es lässt sich nicht ansprechen.


Delphi-Quelltext
1:
2:
3:
4:
Daten.leihe_query.Close;
 Daten.leihe_query.SQL.Add('SELECT * FROM Video as V, Kontakt as K, Leihe as L WHERE V.id = L.Video_id AND K.id = L.Kontakt_id');
 Daten.leihe_query.Open;
...

Es brauch nur mit meinem Datenmodul (Daten) anfangen dann kommt schon eine Fehlermeldung 'EAccessViolation, Zugriffsfehler...'

Ich weiß echt nimmer weiter!

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


Robert.Wachtel - Mi 02.02.05 10:42
Titel: Re: ADO mit Datenmodul führt zum Absturz
tschinkes hat folgendes geschrieben:
Es brauch nur mit meinem Datenmodul (Daten) anfangen dann kommt schon eine Fehlermeldung 'EAccessViolation, Zugriffsfehler...'
Wie und wo wird das Datenmodul Daten erzeugt?


tschinkes - Mi 02.02.05 10:44

Statisch vorab, also habe es nicht während der Laufzeit generiert. Habe es auch schön in mein Hauptformular eingebunden per Uses, aber bringt nix!


Robert.Wachtel - Mi 02.02.05 10:51

tschinkes hat folgendes geschrieben:
Statisch vorab, also habe es nicht während der Laufzeit generiert.
Mhh, und Du bist gaaanz sicher, dass es zum Zeitpunkt des Zugriffs auch schon erzeugt ist?


tschinkes - Mi 02.02.05 10:54

ich denke schon! Denn als ich es mal mit einem DBGrid verbunden habe, hatte ich ja per dataSource ja auch zugriff auf die Daten aus meiner Query aus dem datenmodul! Nur jetzt wenn ich versuche per Code das Datenmodul anzusprechen dann hängt er sich auf!
Aber selbst wenn nicht, wie mache ich es dann?


tschinkes - Mi 02.02.05 11:03

Ok, doch mein Fehler, entschuldige, musste erst das datenmodul erzeugen, sorry!

DAAAANNNNKKKKKKKKEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!


Robert.Wachtel - Mi 02.02.05 11:03

tschinkes hat folgendes geschrieben:
ich denke schon!
Famous last words... :?
Zitat:
Denn als ich es mal mit einem DBGrid verbunden habe, hatte ich ja per dataSource ja auch zugriff auf die Daten aus meiner Query aus dem datenmodul!
Das hat nichts zu sagen.
Zitat:
Nur jetzt wenn ich versuche per Code das Datenmodul anzusprechen dann hängt er sich auf!
Aber selbst wenn nicht, wie mache ich es dann?
Erzeuge es eben dynamisch oder sorge dafür, dass es sicher erzeugt ist, bevor Du es aufrufst. Ich empfehle in so einem Fall den Einsatz von Assertions:

Delphi-Quelltext
1:
Assert(Assigned(Daten), 'Datamodule DATEN noch nicht erzeugt');                    


jasocul - Mi 02.02.05 11:06

Wenn die Form, von der du das DatenModul ansprichst, das Hauptformular ist, ist das DatenModul beim Start (im FormCreate) noch nicht erzeugt. Somit also auch nicht verfügbar.
Versuch es im FormActivate. Dort solltest du aber prüfen, ob die Query schon Aktiv ist, da das FormActivate auch durch andere Ereignisse ausgelöst wird.


Robert.Wachtel - Mi 02.02.05 11:18

jasocul hat folgendes geschrieben:
Versuch es im FormActivate. Dort solltest du aber prüfen, ob die Query schon Aktiv ist, da das FormActivate auch durch andere Ereignisse ausgelöst wird.
...und genau deshalb würde ich es auf keinen Fall im FormActivate machen. IMHO bietet sich in vielen Fällen eine Singleton-Implementierung für Datenmodule an, wobei die benötigte Instanz im Bedarfsfall automatisch erzeugt wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
type
  TmyDataModule = class(TDataModule)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

function myDataModule: TmyDataModule;

implementation

var
  _myDataModule: TmyDataModule = nil;

function myDataModule: TmyDataModule;
begin
  if not Assigned(_myDataModule) then
  begin
    try
      _myDataModule := TmyDataModule.Create(Application);
    except
      _myDataModule := nil;
    end;
  end;
  Result := _myDataModule;
  Assert(Assigned(Result), 'DataModule myDataModule nicht erzeugt!');
end;


jasocul - Mi 02.02.05 11:25

Du hast schon Recht. Deine Lösung ist der bessere Weg. Du hattest dein Posting aber abgesetzt, als ich meins gerade geschrieben hatte. Sonst hätte ich meine große Klappe gehalten. :wink:
Ich persönlich generiere sowieso die Fenster und Datenmodule zur Laufzeit.