| Autor |
Beitrag |
UWER
      
Beiträge: 79
SUSE 8.1, XP Home
D7 Prof. , Kylix 3
|
Verfasst: Do 24.04.03 15:13
Hallo Leute,
ich habe das folgende Problem:
Ich greife über ODBC auf eine Datenbank zu. Das kann sowohl eine ACCESS als auch eine MSSQL-Datenbank sein. Nun sind im Laufe der Zeit ein paar Felder dazugekommen und die Datenbank ist in verschiedenen Versionen im Umlauf. Wie kriege ich raus welche Felder in den Tabellen verfügbar sind?
Gruß
UWER
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 24.04.03 16:27
Hi
dafür gibts die Methoden Table.Fields.CheckFieldName oder Table.Fields.CheckFieldNames. Die zweite dürfte für deine Zwecke besser geeignet sein. Du übergibst einen String mit den fraglichen Feldern durch Semikolon getrennt. Falls eines der Felder nicht enthalten ist, wird eine EDatabaseError Exception ausgelöst.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
UWER 
      
Beiträge: 79
SUSE 8.1, XP Home
D7 Prof. , Kylix 3
|
Verfasst: Fr 25.04.03 08:08
Hallo Lothar,
leider prallen hier Theorie und Praxis mal wieder aufeinander. Die Procedur CheckFieldName liefert mir grundsätzlich keine Exception, egal ob das Feld existiert oder nicht.
Ich habe auch mal mit FieldByName rumgespielt (die heuristische Methode ist oft immer noch die beste). Leider liefert mir FieldByName immer dann eine Exception wenn das Feld nicht im Feld-Editor eingetragen ist.
Gibts da noch eine andere Möglichkeit oder eine Schraube an der man drehen kann?
Gruß
UweR
PS: Ich habe D5 mit der BDE 5.2.02 im Einsatz und versuche mit der ACCESS-Treiber 4.00.62 mein Glück mit einer ACCESS97-Datenbank
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Sa 26.04.03 10:50
Hi
Eigenlich sollte das mit CheckFieldNames schon hinhauen. Ich werds mal selber testen. Als Alternative kannst du immer noch in einer Schleife die Felder durchgehen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function CheckIfFieldExists(Tabelle: TTable; FeldName: string): boolean; var i : integer; begin Result := False; for i := 0 to Tabelle.FieldCount - 1 do if Tabelle.Fields[i].FieldName = FeldName then begin result := True; break; end; end; |
Nicht getestet, aber sollte hinhauen.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
UWER 
      
Beiträge: 79
SUSE 8.1, XP Home
D7 Prof. , Kylix 3
|
Verfasst: Mo 28.04.03 07:49
Hallo,
das mit dem Durchsuchen von Fields war eigentlich mein erster Gedanke. Die Sache hat nur den Nachteil das ich nur die Felder kriege die ich schon im Feld-Editor eingetragen habe und nicht auch die die sich nur in der Tabelle befinden.
Kann das ganze damit zusammenhängen das ich nicht mit TTable sondern mit TQuery auf die Tabelle zugreife? Wobei hierbei allerdings mit "SELECT * FROM" zugegriffen wird.
Gruß
UWER
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 28.04.03 14:27
Hi
wenn du per Query zugreifst, kannst du's mal so probieren:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function CheckIfFieldExists(Tabelle: TQUERY; FeldName: string): boolean; var i : integer; begin Result := False; Tabelle.FieldDefs.Update; for i := 0 to Tabelle.FieldCount - 1 do if Tabelle.FieldDefs[i].Name = FeldName then begin result := True; break; end; end; |
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
UWER 
      
Beiträge: 79
SUSE 8.1, XP Home
D7 Prof. , Kylix 3
|
Verfasst: Mo 28.04.03 15:08
DANKE!!
Das war der entscheidende Hinweis.
Ich habe allerdings noch eine kleine Anpassung vorgenommen und die Schleife nicht bis "Tabelle.Fieldcount-1" sondern bis "Tabelle.FieldDefs.Count-1" laufen lassen. Das ganze sa dann so aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function CheckIfFieldExists(Tabelle: TQUERY; FeldName: string): boolean; var i : integer; begin Result := False; Tabelle.FieldDefs.Update; for i := 0 to Tabelle.FieldDefs.Count - 1 do if Tabelle.FieldDefs[i].Name = FeldName then begin result := True; break; end; end; |
Kaum macht mans richtig, schon funktionierts. (altes chinesisches Sprichwort)
Gruß
UWER
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 28.04.03 17:29
Hi
| UWER hat folgendes geschrieben: | Ich habe allerdings noch eine kleine Anpassung vorgenommen und die Schleife nicht bis "Tabelle.Fieldcount-1" sondern bis "Tabelle.FieldDefs.Count-1" laufen lassen. Das ganze sa dann so aus:
|
Test bestanden. Eins.  Ne, im Ernst, hab ich übersehen.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|