Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Existiert ein Feldname einer TQuery ? (https://www.delphipraxis.net/57690-existiert-ein-feldname-einer-tquery.html)

spacewolf 25. Nov 2005 10:02

Datenbank: MS Access :-) • Version: BDE • Zugriff über: BDE

Existiert ein Feldname einer TQuery ?
 
kann man eigendlich feststellen ob ein bestimmter Feldname in der TQuery Existiert.
In der Registry kann man z.B. per
Delphi-Quellcode:
registry.valueexists('feld')
ermitteln ob eine value existiert. Geht das auf per

Delphi-Quellcode:
TQuery.ValueExists('feldname')
???

:P euer Andreas

dfried 25. Nov 2005 10:13

Re: Existiert ein Feldname einer TQuery ?
 
Du könntest es mit Query.FieldList.Find('Feldname') machen, wenn das Result NIL ist, hat er ein entsprechendes Feld nicht in der Query gefunden.

marabu 25. Nov 2005 10:46

Re: Existiert ein Feldname einer TQuery ?
 
Hallo Andreas,

musst du fürchten, dass sich der Tabellenaufbau zwischen zwei Programmstarts verändert hat? In dem Fall solltest du zu Beginn des Programms prüfen, dass der Aufbau deinen Erwartungen entspricht. Das geht mit den Methoden der Database-Komponente: GetTableNames() und GetFieldNames().

Grüße vom marabu

eddy 25. Nov 2005 11:28

Re: Existiert ein Feldname einer TQuery ?
 
Hallo spacewolf,

Delphi-Quellcode:
if Query1.FindField('Fldname') = nil then begin
  // Feld fehlt
end;
mfg
eddy

spacewolf 25. Nov 2005 18:34

Re: Existiert ein Feldname einer TQuery ?
 
danke Leute das funzt super !!! :bounce1: :hello: :hello: :party:

joehd 30. Sep 2018 11:59

AW: Existiert ein Feldname einer TQuery ?
 
Aber wie gebe ich denn dann an in welcher Tabelle er das Feld suchen soll ?

Delphi.Narium 30. Sep 2018 12:05

AW: Existiert ein Feldname einer TQuery ?
 
Delphi-Quellcode:
query1.sql.text := 'select * from InDerTabelleWirdDasFeldGesucht';
query1.open;
if Query1.FindField('Feldname') = nil then begin
  // Feld fehlt
end;

joehd 30. Sep 2018 13:20

AW: Existiert ein Feldname einer TQuery ?
 
Habe es jetzt so gelöst

Code:
Procedure Tform1.UpgradeBetreiber;
var Tabname : String;
begin

Try
  ztable1.TableName := 'Betreiber';
  Tabname := ztable1.TableName;
  ztable1.Active := true;
  if ztable1.Fields.FindField('Webseite') = nil
      then
      Begin // Feld erzeugen
        zquery1.SQL.Text := 'ALTER TABLE '+Trim(TABNAME)+' ADD COLUMN Webseite TEXT'+ ';';
        zquery1.ExecSQL ;
      End;

  if ztable1.Fields.FindField('Support') = nil
      then
      Begin // Feld erzeugen
        zquery1.SQL.Text := 'ALTER TABLE '+Trim(TABNAME)+' ADD COLUMN Support TEXT'+ ';';
        zquery1.ExecSQL ;
      End;

Ztable1.active := false;
except

End;
end;

joehd 30. Sep 2018 13:21

AW: Existiert ein Feldname einer TQuery ?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1414520)
Delphi-Quellcode:
query1.sql.text := 'select * from InDerTabelleWirdDasFeldGesucht';
query1.open;
if Query1.FindField('Feldname') = nil then begin
  // Feld fehlt
end;

Danke das ist auch Cool !und wieder so einfach wenn man drauf kommt ...

himitsu 30. Sep 2018 17:06

AW: Existiert ein Feldname einer TQuery ?
 
Nahezu jedes DBMS bietet irgendwie Zugriff auf virtuelle Tabellen mit Datenbankinformationen.

für MS Access z.B.
SQL-Code:
SELECT NOT EXISTS(SELECT * FROM sys.columns WHERE name = 'columnName' AND object_id = OBJECT_ID('tableName'))


Viele bieten aber inzwischen auch "allgemeine" im SQL standardisierte VIEWs mit Zugriff auf die systemeneigenen Daten.
Hierfür wäre das z.B. information_schema.columns
https://www.mssqltips.com/sqlservert...schemacolumns/
https://www.postgresql.org/docs/9.5/...a-columns.html

Delphi.Narium 30. Sep 2018 18:13

AW: Existiert ein Feldname einer TQuery ?
 
Prinzipiell ist das richtig, aber leider nicht so wirklich einheitlich umgesetzt.

Wenn man Software nur für eine bestimmte Datenbank schreibt, ist das klar der bessere Weg.

Muss man "allgemeinverbindlich" sein, hilft leider nur der Weg über 'ne mehr oder weniger sinnvolle Krücke.

Das select * from Tabelle hat den Nachteil: Bei vielen Daten in der entsprechenden Tabelle kann das schon was dauern. Man sollte also die Abfrage einschränken. Da gäbe es z. B.:
SQL-Code:
select first 1 * from tabelle;
select top 1 * from tabelle;
select * from tabelle where rownum <= 1;
select * from tabelle limit 1;
-- eventuell können dashier ja alle:
select * from tabelle where 1 = 2;
Irgendwie nach Jahrzehnten immernoch ein leidiges Thema :-(

kmartin 30. Sep 2018 18:51

AW: Existiert ein Feldname einer TQuery ?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1414542)

SQL-Code:
-- eventuell können dashier ja alle:
select * from tabelle where 1 = 2;
Irgendwie nach Jahrzehnten immernoch ein leidiges Thema :-(

Die letzte Lösung verwende ich in der Regel sehr gerne. Weiteres Problem zwischen verschiedenen DBMS ist die Frage, wie non Standard Tabellennamen verwendet werden.
Rechteckige Klammer oder doppelte Anführungszeichen.

p80286 30. Sep 2018 20:09

AW: Existiert ein Feldname einer TQuery ?
 
Zitat:

Zitat von kmartin (Beitrag 1414544)
Weiteres Problem zwischen verschiedenen DBMS ist die Frage, wie non Standard Tabellennamen verwendet werden.
Rechteckige Klammer oder doppelte Anführungszeichen.

Was meinst Du damit? Jede Datenbank hat die Tabellen(namen) die verwendet werden. Die kann man mögen oder nicht (gleiches gilt für die Zugriffskomponenten).

Gruß
K-H

jobo 30. Sep 2018 21:28

AW: Existiert ein Feldname einer TQuery ?
 
Ich denke er meint Tabellennamen mit nicht alphanumerischen Zeichen aus dem ASCII Raum, also so was wie
Select * from Oma's Küchentricks
Select * from [Oma's Küchentricks] (Access)
Select * from ´Oma's Küchentricks´ (mySQL)
Select * from "Oma's Küchentricks" (Oracle)
usw.

Ich würde da dann kuechentricks drauß machen und eine Spalte für den Urheber (Oma oder andere) anlegen.

joehd 1. Okt 2018 01:06

AW: Existiert ein Feldname einer TQuery ?
 
Meine Erfahrung ist es auch das es von DB zu Db verschieden ist.
Dies hier war ein Beispiel der sqlite ich nutze aber oft auch die Firebird. Ich meine das es da erhebliche Unterschiede gibt.
Ich habe die Sqlite für eine kleine Verwaltungssoftware genutzt die normal nur von einem Platz aus bedient wird. Sqlite ist glaube ich gelesen zu haben nicht so richtig Mehrplatz fähig... aber dafür echt leicht zu handeln

rokli 1. Okt 2018 07:24

AW: Existiert ein Feldname einer TQuery ?
 
Moin,

also ich kann mir im Moment kein in der Praxis relevantes Beispiel vorstellen, bei dem ich zur Laufzeit der Software noch Tabellenstrukturen anpassen müsste ... das muss doch vorher geklärt sein, maximal noch während der Entwicklung - oder?

Freilich - über die Prüfung der Felder, so wie Ihr es vorgestellt habt mit der Abfrage der FIELDS-Informationen ist das schon ok.

Grüße - und einen schönen Montag und ne gute Woche!

TigerLilly 1. Okt 2018 08:17

AW: Existiert ein Feldname einer TQuery ?
 
Zitat:

Zitat von rokli (Beitrag 1414565)
also ich kann mir im Moment kein in der Praxis relevantes Beispiel vorstellen, bei dem ich zur Laufzeit der Software noch Tabellenstrukturen anpassen müsste

Ich schon. 8-)

Software ist nichts statisches, sondern entwickelt sich. Sei es, weil die Kunden neue Anforderungen haben (Wir brauchen hier noch die Bezeichnung in Englisch!), sei es weil sich die Welt ändert (gesetzliche Vorschriften). Möglicherweise hat auch der Softwarehersteller eine coole Idee, die bei einem Update eingebracht werden soll.

Für mich ist es eher genau umgekehrt: Es ist davon auszugehen, dass sich die Tabellenstrukturen ändern werden.

Frickler 1. Okt 2018 09:07

AW: Existiert ein Feldname einer TQuery ?
 
Zitat:

Zitat von rokli (Beitrag 1414565)
Moin,

also ich kann mir im Moment kein in der Praxis relevantes Beispiel vorstellen, bei dem ich zur Laufzeit der Software noch Tabellenstrukturen anpassen müsste ... das muss doch vorher geklärt sein, maximal noch während der Entwicklung - oder?

Naja wie TigerLilly schon schrieb, es ändert sich nicht bloß die Software, sondern auch die Datenbank im Laufe der Jahre. Wir haben dafür bei unseren Kunden eine extra Software, die diese Änderungen vornimmt. Als erstes wird natürlich gecheckt, ob noch sonst wer in der Datenbank angemeldet ist - dann wird der Vorgang abgebrochen mit einer Meldung a la "User 'Meier' noch im Programm" - und ansonsten gehts los, wie beschrieben: Felder testen und ggfs. abändern (z.B. Strings verlängern), löschen oder neu hinzufügen.

Im "normalen Betrieb" der Software wird dann aber nichts mehr angepasst.

rokli 1. Okt 2018 09:35

AW: Existiert ein Feldname einer TQuery ?
 
Hallo,

das ist natürlich klar, aber wenn sich die Anforderung ändert, ändert sich neben der DB natürlich auch das Programm - aber dann sind wir ja wieder an der Weiterentwicklung ...

Und ganz allgemein: Wir bauen die DB in der Regel mit den Tools, die dafür zuständig sind: MS SQL Server Management Studio, IBM System i Navigator oder meinetwegen auch mit dem tollen DBeaver. Aber aus meiner (Anwendungs-)Software heraus, hab ich das quasi noch nie benötigt. Und "Data driven software" halte ich persönlich doch eher für schwierig.

Greez

p80286 1. Okt 2018 09:41

AW: Existiert ein Feldname einer TQuery ?
 
Zitat:

Zitat von TigerLilly (Beitrag 1414571)
Ich schon. 8-)

Wohl war, aber dann sollte auch bekannt sein, in welcher View/Tabelle die Feld/Tabellen-Namen zu finden sind.
Die vorgestellte Methode ist mMn nur sinnvoll, wenn man eine Oberfläche hat, die keine Information über die darunter liegende Datenbank hat.
Außerdem gibt es Schnittstellen (ADO zB) die mit einem speziellen Befehl Informationen über die darunter liegende DB liefern.

Grüße
K-H

joehd 3. Okt 2018 16:10

AW: Existiert ein Feldname einer TQuery ?
 
Also ich prüfe beim Start der Software ob die Strukturen stimmen. Ich habe die Software jetzt aber auch so geschrieben das die beim Start prüft ob die DB da ist wenn nicht die ganze Datenbank Version x erzeugt und dann laufen Prozesse die die neueren Felder prüfen. Somit ist es egal ob alle zwischenupdates vom Kunden gemacht wurden. Die Software zieht das immer hoch. Ist in dem Fall jetzt komfortabel ....


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 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 by Thomas Breitkreuz