Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query aus anderer Unit verändern (https://www.delphipraxis.net/194033-query-aus-anderer-unit-veraendern.html)

Luca Haas 10. Okt 2017 08:37

Datenbank: MSSQL • Version: ? • Zugriff über: ADO Query

Query aus anderer Unit verändern
 
Hi Leute,
wie im Titel bereits gesagt versuche ich die Query meiner Unit1, mithilfe eines Buttons der Unit2, zu verändern. Unit1Query soll dabei auch den selben SQL Text erhalten wie es Unit2Query aktuell hat. Gleichzeitig soll sich Unit2 über den Button auch noch schließen(was natürlich kein Problem ist).
Jetzt wollte ich fragen ob das überhaupt so geht oder ob es dafür andere Ansätze gibt.

p80286 10. Okt 2017 08:43

AW: Query aus anderer Unit verändern
 
Für die Kommunikation mit Datenbanken, gibt es die Datenmodule. In denen sollte alles versammelt sein, was für den Kontakt notwendig ist, incl. der Querytexte. Darum die Frage was hast Du vor?

Gruß
K-H

Luca Haas 10. Okt 2017 08:52

AW: Query aus anderer Unit verändern
 
Also meine Unit2 ist eine Suchmaske, auf der man einen SQL-Befehl erstellt. Diesen möchte ich mit Hilfe eines Buttons in eine Query in Unit1 packen, damit ich die gesuchten Daten in einem DBGrid in der Unit1 anzeigen kann.

nahpets 10. Okt 2017 11:04

AW: Query aus anderer Unit verändern
 
Lege dazu alle Querys ... in ein Datenmodul. Auf dieses kannst Du dann von beiden Units aus zugreifen.

Gehen wir davon aus, dass Du über Unit1, Unit2 und Unit3 verfügst.

Unit1 und Unit2 hast Du bereits. Unit3 wird das DataModule1 enthalten.
Sowohl in Unit1, als auch in Unit2 musst Du Unit3 in die Uses-Klausel einfügen.

Nun könntest Du aus Unit2 die Query sinngemäß im DataModule1 in dieser Form ansprechen:

Delphi-Quellcode:
Datamodule1.Query.SQL.Text := 'Ergebnis Deiner Zusammenstellung des SQLs.';


In Unit1 könntest Du diese Query dann in der Art ansprechen:

Delphi-Quellcode:
Datamodule1.Query.Open;


Der DataSource im in Unit1, die mit dem DBGrid verbunden ist, müsstest Du bereits im Objektinspektor die Query aus dem DataModule1 zuweisen können. Im Quelltext könnte das so gehen:

Delphi-Quellcode:
DataSource1.DataSet := DataModule1.Query;


Allerdings könntest Du beim Schließen der Suchmaske in etwa auch so vorgehen.

(Nur hingedaddelt und ungetestet)
Delphi-Quellcode:
procedure Form2.Button1Click(Sender : TObject);
begin
  Datamodule1.Query.Close;
  Datamodule1.Query.SQL.Text := 'Ergebnis Deiner Zusammenstellung des SQLs.';
  Datamodule1.Query.Open;
  Close;
end;
Damit musst Du dann nicht in beiden Formularen 'ne Query vorhalten und Dich in beiden Formularen um die Handhabung der Abfragen kümmern.

Luca Haas 10. Okt 2017 11:21

AW: Query aus anderer Unit verändern
 
Okay ich habs in der Zeit etwas anders gelöst, aber ich werde das hier auch später mal ausprobieren.

Ich habe es jetzt so gelöst, dass ich mir eine Variable erstellt habe, der ich den Wert des SQL-Befehls gegeben habe, welchen ich Unit1 einfach mit
Delphi-Quellcode:
unit Unit2;

interface

uses
unit1
übergeben habe. Wenn man darauf aufpasst, dass man nich beide Units gegenseitig zum interface, sondern zur implementation schreibt klappt das auch super. :thumb:

Delbor 11. Okt 2017 10:35

AW: Query aus anderer Unit verändern
 
Hi zusammen

Ich weiss, es gibt jede Menge Beispiele, auch solche von Embarcadero, die so vorgehen, dass ein User in einem Memo ein SQL-Statement eingeben kann und dieses dann ausführen lassen kann.
Ich halte dies für ein sehr sicherheitskritisches Problem - der User kann so ein x-beliebiges Statement eingeben. Ausser den korrekten Datenabfragen können so auch Metadatenabfragen eingegeben werden, um die DB auszuspionieren oder diese Metadaten zu verändern. Im schlimmsten Fall kann eine Datenbank auf diese Weise über den Jordan geschickt werden.

Am Beispiel einer Adress-Anwendung (ich sag hier bewusst nicht Adressverwaltung) würde ich in etwa so vorgehen:
Für die Suche nach einer bestimmten Person: Eingabe des Namens in einem Edit oder einem Memo. Ein Button startet die Anfrage.
Im Programmcode ist/sind das/die Statements definiert, mit denen die meist auf mehrere Tabellen verteilten Informationen aus der DB abgerufen werden. Diese Statements können, und das ist das Wichtige, vom User nicht direkt geändert werden.
Aber der User kann über Checkboxen wählen, dass er alle Infos über diese Person sehen will (wenn er zB.keine der angebotenen Checkboxen auswählt) oder nur die Handynummer wissen will (nur Checkbox 'chbxHandy ist ausgewählt).
Metainformationen (welche und wieviele Tabellen mit welchen Feldern, wer hat Bearbeitungsrechte) können so auch abgefragt werden - aber bitte nur von Usern, die dazu berechtigt sind (Anmelde-Dialog).

Im harmlosesten Fall können Statements, die direkt eingegeben werden können, zur Beschädigung der DB führen.

Ist dein Projekt Teil deiner Einarbeitung in die DB-Programmierung, hat dein Vorgehen bislang auch Vorteile: Du kannst dir vor Augen führen, was passiert, wenn du kein korrektes Statement eingibst und es verarbeiten lassen willst. Und du kannst dir vor Augen führen, was passiert, wenn du Metadaten veränderst.

Gruss
Delbor


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