![]() |
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ß. |
AW: Field exists
Solche Sachen hab ich immer im Datenmodul: Liste der verfügbaren Tabellen ermitteln, Liste der Feldnamen der jeweiligen Tabelle und sonstige wichtige Daten über die jeweilige Tabelle. Wenn ich richtig gelesen habe, kann doch XE5 schon FireDac, und damit kann man doch dann alle DBMS connecten, oder? Dann bräuchte man ja keine Fremdkomponenten mehr.
![]() ![]() ![]() |
AW: Field exists und ergänzen
Der Thread ist zwar schon älter aber als er mir keine Antwort gab dachte ich dann gebe ich hier mal eine Antwort die ich erarbeitet habe.
Als Tabelle übergebe ich ein ein TTable das funktioniert prima :-) Auf dem Form benötigt man dann natürlich ein TScript Benutzen tue ich den Code bei Firebird. Viel Spaß
Code:
Function tsqldbform.Checkdatab_field(Tabelle:Tdataset;Tabname:String;Feldname:String;feldtyp:String):Boolean;
var _feldtyp :tfieldtype; sqlbastel : String; findres : Integer; findfield : Tfield; Begin // schauen ob das Datenfeld existiert findfield := Tabelle.FindField(UPPERCASE(Feldname)); if findfield = nil then begin showmessage('Datenbank Feld:'+Feldname + ' nicht vorhanden ! / Wird erzeugt ! '); sqlbastel := 'alter table ' + Trim(Tabname) + ' add ' + Trim(UPPERCASE(Feldname)) + ' ' + Trim(UPPERCASE(Feldtyp)) +';'; ibscript1.Transaction.Active := true; ibscript1.Script.Text := sqlbastel; // Tabelle.SQL.add(sqlbastel); ibscript1.ExecuteScript; // Open ; // ExecSQL; // SQL.BeginUpdate; // ibscript1.Script.Clear; // SQL.Clear; ibmaintransaction.CommitRetaining; showmessage(ibScript1.Script.Text ); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 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