Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADOConnection auf anderem Datenmodul wie TADOQuery (https://www.delphipraxis.net/182991-tadoconnection-auf-anderem-datenmodul-wie-tadoquery.html)

HolgerCW 2. Dez 2014 14:16

Datenbank: Oracle • Version: 10 • Zugriff über: ADO

TADOConnection auf anderem Datenmodul wie TADOQuery
 
Hallo zusammen,

will mich gerade von meiner BDE lösen und versuche mich jetzt gerade mit TADO ...

Ich habe die TADOConnection auf dem Datenmodul_1
Die TADOQuery liegt auf Datenmodul_2.
Der TADOQuery habe ich auch die Connection von Datenmodul_1 zuweisen können. Die Verbindung ist auch hergestellt da ich die Felder hinzufügen konnte.

Wenn ich im Programm aber jetzt TADOQuery.Open mache kommt die Meldung das eine Connection oder Connectionstring fehlt.

Packe ich jetzt beide auf das gleiche Datenmodul klappt es.

Möchte aber nicht auf jedem Datenmodul eine Connection haben. Woran könnte es liegen ?

In den uses des Datenmodul_2 ist auch das Datenmodul_1 eingetragen.

Gruss

Holger

p80286 2. Dez 2014 14:40

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Zitat:

Zitat von HolgerCW (Beitrag 1281985)

Möchte aber nicht auf jedem Datenmodul eine Connection haben. Woran könnte es liegen ?

Und warum nicht? ich habe für jede unterstützte DB falls notwendig ein eigenes Datenmodul, das war's dann.
teilweise mit 2 oder 3 connections, bisher hatte ich keine Probleme das zu handhaben.

Gruß
K-H

HolgerCW 2. Dez 2014 14:47

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Vorher mit den TDatabase-Komponenten hat das aber super funktioniert.

Ich habe in einem anderen Projekt festegestellt das wenn ich umso mehr Connections habe die Programme langsamer werden, da jedes Programm dann mehrere Connections gleichzeitig bedient und das mal die Anwender die das Programm nutzen.

Gibt es denn eine Idee wie ich die TQADOQuery auf ein anderes Datenmodul packen kann wie die TADOConnection ?

Gruss

Holger

p80286 2. Dez 2014 15:27

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Zitat:

Zitat von HolgerCW (Beitrag 1281992)
Ich habe in einem anderen Projekt festegestellt das wenn ich umso mehr Connections habe die Programme langsamer werden, da jedes Programm dann mehrere Connections gleichzeitig bedient und das mal die Anwender die das Programm nutzen.

Deine Programme machen was sie wollen?
Aber im Ernst, eine Connection,eine Query fertig.

Manchmal braucht man noch eine zweite oder dritte (Connection/Query) aber das ist zumindestens für mich seehr selten.

Gruß
K-H

Dejan Vu 2. Dez 2014 15:43

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Ich würde mal annehmen, in deinem Projekt wird erst das Datenmodul erzeugt, das die Query hat. Nun steht in der DFM unter Connection 'Module2.myADOConnection'... Aber 'Module2' gibt es ja noch nicht. Ergo steht da nun null drin.


Abhilfe: Setzte die Connection-Eigenschaft explizit. Ist eh besser, weil Du irgendwann ja doch die Einstellung verlierst (beim rumeditieren)

HolgerCW 3. Dez 2014 07:14

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Es ist genau umgekehrt.

Das Datenmodul mit der Connection ist von Anfang an da. Die einzelnen Datenmodule mit den entsprechenden Querys werden je nach Nutzung nachgeladen.

Muss ich da eventuell noch was auf Aktiv setzen ?

Aber warum ging das mit der BDE und den TQuerys ohne Probleme ? Habe ja jetzt nur testweise eine neue ADOConnection und eine neue TADOQuery dazu erstellt. Alles andere mit der BDE läuft weiterhin.

Gruss

Holger

Dejan Vu 3. Dez 2014 07:28

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Wie erstellst Du die Instanzen?

Aber das ist doch eigentlich nebensächlich. Setze die Verknüpfung explizit (was sowieso 1000x besser ist) und widme dich dem nächsten Problem.. ;-)

HolgerCW 3. Dez 2014 07:36

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Du meinst also ich soll den Connection String direkt in die Query setzen ?

Nur wäre dann bei der Auswahl eines Testservers die Notwendigkeit das ich allen Querys den neuen Server mitteilen muss und nciht nur einer. Gehen würde das, aber ist halt auch aufwendig und muss ich bei Erweiterungen des Programms auch immer dran denken.

Wenn der Anwender einen bestimmten Programmteil benutzen will, create ich nur die entsprechende Form und das entsprechende Datenmodul mit den dazugehörigen Querys. Das Datenmodul mit der Connection ist aber immer erstellt. Wenn der Anweder einen anderen Programmteil nutzen möchte werden die wieder mit freeandnil gekillt und die neuen erstellt.

Gruss

Holger

HolgerCW 3. Dez 2014 07:42

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Habe gerade was herrausgefunden.

Wenn ich bei erstellen des Datenmoduls die Connection nochmal explizit zuweise klappt es:

Delphi-Quellcode:
procedure TDM_Systemoptionen.DataModuleCreate(Sender: TObject);
begin

 inherited;
 DM_Systemoptionen := Self;

 ADOQueryTreeView.Connection := DM_Menu.ADO_Con_SYSDBP;

end;
Aber warum muss ich das tuen ?

Gruss

Holger

Sir Rufo 3. Dez 2014 07:43

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Nur so als Beispiel
Delphi-Quellcode:
TADODataModule = class( TDataModule )
public
  procedure SetConnection( AConnection : TADOConnection );
end;

procedure TADODataModule.SetConnection( AConnection : TADOConnection );
var
  LIdx : Integer;
begin
  for Lidx := 0 to ComponentCount - 1 do
    if Components[LIdx] is TCustomADODataSet then
      ( Components[Lidx] as TCustomADODataSet ).Connection := AConnection;
end;

HolgerCW 3. Dez 2014 07:53

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Sowas war ich mir auch gerade am basteln:

Delphi-Quellcode:
procedure TDM_Systemoptionen.DataModuleCreate(Sender: TObject);
var
 ADOQuery: TADOQuery;
 I: Integer;
begin

 inherited;
 DM_Systemoptionen := Self;

 For I := 0 to DM_Systemoptionen.ComponentCount - 1 do
 begin

  if DM_Systemoptionen.Components[I] is TADOQuery then
  begin

    ADOQuery := TADOQuery(DM_Systemoptionen.FindComponent(DM_Systemoptionen.Components[I].Name));

    ADOQuery.Connection := DM_Menu.ADO_Con_SYSDBP;

  end;

 end;

 //ADOQueryTreeView.Connection := DM_Menu.ADO_Con_SYSDBP;

end;

Aber besser ist es natürlich in eine Funktion zu packen damit ich das für alle Datenmodule nutzen kann, wie bei Dir.

Aber warum das bei TADO so ist ?

Jumpy 3. Dez 2014 08:11

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Hätte statt

Delphi-Quellcode:
ADOQuery := TADOQuery(DM_Systemoptionen.FindComponent(DM_Systemoptionen.Components[I].Name));
nicht auch

Delphi-Quellcode:
ADOQuery := TADOQuery(DM_Systemoptionen.Components[I]);
gereicht?

Davon abgesehen ist das schöne an Sir Rufos Methode, dass sie mehr entkoppelt ist, d.h. das ursprüngliche Datenmodul "DM_Menu" muss in den folgenden nicht bekannt sein, es wird einfach über den Setter die Connection übergeben. GGf. könnte man doch auch das create des Datenmoduls überschreiben (oder?) und da direkt die Connection übergeben?
Da man da ggf. auch bereits weiß wie alle Querys heißen, muss man dann auch nicht durch alle Komponenten nach den Querys suchen.
Umgekehrt ist die Setter-Funktion natürlich in anderen Datenmodulen wiederverwertbar egal wie die Querys dsa heißen.

Sir Rufo 3. Dez 2014 08:21

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Das tut doch schon beim Schreiben weh, oder?
Delphi-Quellcode:
procedure TDM_Systemoptionen.DataModuleCreate(Sender: TObject);
var
 ADOQuery: TADOQuery;
 I: Integer;
begin

 inherited;
 DM_Systemoptionen := Self;
Wie kann man nur auf dieses schmale Brett kommen? :wall:

HolgerCW 3. Dez 2014 08:41

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Jetzt bekomme ich Sie aber richtig hier ;)

Daher hatte ich diese Schmuddellösung:

http://www.delphipraxis.net/170594-f...stellen-3.html

Vielleicht gibt es ja was besser, aber es konnte nichts besseres gefunden werden ...

Die Lösung von Sir Rufos habe ich nun auch so übernommen ;)

Sir Rufo 3. Dez 2014 09:26

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Natürlich gibt es was Besseres und das wurde dort auch genannt.

Diese Lösung wurde als Schmuddelnotlösung bezeichnet und ist eigentlich noch schlimmer.

HolgerCW 3. Dez 2014 09:57

AW: TADOConnection auf anderem Datenmodul wie TADOQuery
 
Dennoch danke. Werde mal schauen wenn ich dazu komme mich mit dem Thema nochmal zu befassen, da es ja eigentlich stabil läuft ;)


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