![]() |
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; |
AW: Field exists
Entweder Datenmenge einschränken
SQL-Code:
o.ä.
select ... where <PK> = -1;
Oder eine Abfage auf die Metadaten ![]() |
AW: Field exists
Zitat:
Code:
Und dann durch die Fields-Auflistung gehen ob das Feld drin ist.
select * from tabellenname where 0 = 1;
Damit man das nicht permanent machen muss wird das dann gemerkt welche Felder die Tabelle hat. |
AW: Field exists
Zitat:
|
AW: Field exists
Zitat:
|
AW: Field exists
Zitat:
![]() Hat halt den Nachteil das diese API auch installiert sein muss. |
AW: Field exists
Und dann gibt es auch noch
![]() 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). |
AW: Field exists
Zitat:
![]() ![]()
Delphi-Quellcode:
Beide Proceduren liefern eine Stringliste zurück, die die gewünschten Daten enthält. Die FeldListe befragst du dann mit
// Tabellen abfragen - der Boolean-Parameter ist für Systemtabellen
ADOConnection1.GetTableNames(TabellenListe, False); // Felder abfragen ADOConnection1.GetFieldNames(TabellenName, FeldListe); ![]() |
AW: Field exists
Zitat:
Zitat:
Zitat:
|
AW: Field exists
Aber am Ende baut auch diese Funktion eine Verbindung zur Datenbank auf und macht eine Query.
SQL-Code:
Diese Varianten haben aber auch einen Vorteil, nämlich wenn man seinen Code unabhängig vom DBMS und den Zugriffskomponenten bauen will.
SELECT * FROM &Table WHERE False -- Assigned(FindField(FieldName))
SELECT &FieldName FROM &Table WHERE False -- Try-Except -> False 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 02:09 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-2025 by Thomas Breitkreuz