Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Field exists (https://www.delphipraxis.net/183214-field-exists.html)

bernhard_LA 20. Dez 2014 12:51

Datenbank: MSSQL • Version: 12 • Zugriff über: ADO

Field exists
 
Hallo ,


wie frage ich denn am besten bei einer sehr großen DB Tabelle ab ob ein bestimmtes Feld existiert oder nicht

Ich möchte ***Keine *** Query oder Tabelle öffnen ... mit doesem Code habe ich deshalb so meine Probleme



Delphi-Quellcode:
function FindFieldInDB (DataSet: TDataSet; FieldName: String): Boolean;
var
  findField: TField;
begin
  Result := false; {Posit failure}

  findField := nil;
  findField := DataSet.FindField(FieldName);
  if Assigned(findField) then
  begin
    Result := not (findField.Calculated);
  end;
end;

mkinzler 20. Dez 2014 13:03

AW: Field exists
 
Entweder Datenmenge einschränken

SQL-Code:
select ... where <PK> = -1;
o.ä.

Oder eine Abfage auf die Metadaten

http://msdn.microsoft.com/en-us/magazine/cc164065.aspx

Bernhard Geyer 20. Dez 2014 13:26

AW: Field exists
 
Zitat:

Zitat von mkinzler (Beitrag 1284182)
Entweder Datenmenge einschränken

SQL-Code:
select ... where <PK> = -1;
o.ä.

Das mache ich seit jahren so:

Code:
select * from tabellenname where 0 = 1;
Und dann durch die Fields-Auflistung gehen ob das Feld drin ist.
Damit man das nicht permanent machen muss wird das dann gemerkt welche Felder die Tabelle hat.

vagtler 20. Dez 2014 14:18

AW: Field exists
 
Zitat:

Zitat von mkinzler (Beitrag 1284182)
Entweder Datenmenge einschränken

SQL-Code:
select ... where <PK> = -1;
o.ä.

Oder eine Abfage auf die Metadaten

http://msdn.microsoft.com/en-us/magazine/cc164065.aspx

Beides ist mit dem Öffnen einer Query verbunden und entspricht somit nicht den Anforderungen des TE (ganz unabhängig davon, wie sinnfrei diese sein mögen).

Uwe Raabe 20. Dez 2014 14:31

AW: Field exists
 
Zitat:

Zitat von vagtler (Beitrag 1284184)
Beides ist mit dem Öffnen einer Query verbunden und entspricht somit nicht den Anforderungen des TE (ganz unabhängig davon, wie sinnfrei diese sein mögen).

Wenn die Einschränkung einzig aus dem Grund existiert, um die Datenmenge klein zu halten, ist es doch durchaus zulässig, auf diese spezielle Form der Query hinzuweisen, oder? Schließlich gilt es hier, ein real existierendes Problem zu lösen und nicht eine Quizfrage: "Wie ermittele ich die Felder einer Tabelle ohne eine Abfrage zu öffnen?"

Bernhard Geyer 20. Dez 2014 14:47

AW: Field exists
 
Zitat:

Zitat von vagtler (Beitrag 1284184)
Beides ist mit dem Öffnen einer Query verbunden und entspricht somit nicht den Anforderungen des TE (ganz unabhängig davon, wie sinnfrei diese sein mögen).

Der MS SQL-Server hat auch noch weitere API. Die gewünschten Infos sollten auch über SMO abfragbar sein.
Hat halt den Nachteil das diese API auch installiert sein muss.

sx2008 20. Dez 2014 15:25

AW: Field exists
 
Und dann gibt es auch noch ADOX (ADO Extensions).
ADOX ist unabhängig vom Datenbank Provider.
Man muss eigentlich nur die Typbibliothek importieren und am Besten gleich beim Import die Klassennamen umbenennen um Namenskollisionen zu vermeiden (zumindest bei älteren Delphi Versionen die das Namespace Konzept noch nicht kennen ist das sinnvoll).

Perlsau 20. Dez 2014 21:42

AW: Field exists
 
Zitat:

Zitat von bernhard_LA (Beitrag 1284181)
wie frage ich denn am besten bei einer sehr großen DB Tabelle ab ob ein bestimmtes Feld existiert oder nicht
Ich möchte ***Keine *** Query oder Tabelle öffnen ... mit doesem Code habe ich deshalb so meine Probleme

Wenn ich dich richtig verstanden habe, möchtest du nicht auf irgendwelche Feldinhalte prüfen (das wäre eine SQL-Query), sondern nachschauen, ob in einer bestimmten Tabelle ein bestimmtes Feld existiert. Da du wohl die dbGo-Komponenten verwendest, würde es sich doch anbieten, über deine Connection-Komponente zuerst die verfügbaren Tabellen abzufragen und danach über dieselbe Komponente die in der jeweiligen Tabelle existierenden Felder:
Delphi-Quellcode:
// Tabellen abfragen - der Boolean-Parameter ist für Systemtabellen
  ADOConnection1.GetTableNames(TabellenListe, False);

// Felder abfragen
  ADOConnection1.GetFieldNames(TabellenName, FeldListe);
Beide Proceduren liefern eine Stringliste zurück, die die gewünschten Daten enthält. Die FeldListe befragst du dann mit IndexOf nach dem gesuchten Feldnamen (ein String).

vagtler 21. Dez 2014 07:25

AW: Field exists
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1284187)
[...]

Zitat:

Zitat von sx2008 (Beitrag 1284194)
[...]

Zitat:

Zitat von Perlsau (Beitrag 1284232)
[...]

Schade, dass es hier kein Like oder ein Voting für gute Antworten gibt... ;)

himitsu 21. Dez 2014 07:43

AW: Field exists
 
Aber am Ende baut auch diese Funktion eine Verbindung zur Datenbank auf und macht eine Query.

SQL-Code:
SELECT * FROM &Table WHERE False -- Assigned(FindField(FieldName))

SELECT &FieldName FROM &Table WHERE False -- Try-Except -> False
Diese Varianten haben aber auch einen Vorteil, nämlich wenn man seinen Code unabhängig vom DBMS und den Zugriffskomponenten bauen will.
Oder man schiebt den Aufruf von GetTableNames und Co. in eine eigene Funktion, welche man bei Änderungen dann anpassen kann/muß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.
Seite 1 von 2  1 2      

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