Gibt es eine Möglichkeit die Feldnamen, Feldtypen und Primärschlüssel
einer Tabelle ohne TTabel zu ermitteln?
Zur Zeit gehe ich folgendermaßen vor:
var
tabinfo: tTable;
begin
tabinfo:= tTable.create(DataModul);
tabinfo.active:= False;
tabinfo.databasename:= Databasename;
tabinfo.tablename:= TabName;
tabinfo.active:=true;
und greife dann auf tabinfo.fielddefs und tabinfo.indexfields zu.
Leider hat dieses Vorgehen zumindest bei Mysql und Interbase die
unangenehme Eigenschaft, daß Delphi intern ein "select * from
tabname" ausführt, was dazu führt, daß der gesamte Datenbankinhalt
einmal übermittelt wird.
Bye
Sven
Sven Bursch schrieb:
> Leider hat dieses Vorgehen zumindest bei Mysql und Interbase die
> unangenehme Eigenschaft, daß Delphi intern ein "select * from
> tabname" ausführt, was dazu führt, daß der gesamte Datenbankinhalt
> einmal übermittelt wird.
Verwende statt TTable ein TQuery und führe eine Abfrage durch, die
dir zwar alle Spalten, aber keine Zeilen liefert:
SELECT * FROM TableName WHERE (1 = 0)
Über TQuery.Fields kannst du dann auf die Spaltennamen und Typen
zugreifen. Informationen über die Schlüssel stehen so leider nicht
zur Verfügung.
Was auch funktionieren könnte, ist bei TTable die Eigenschaft Filter
auf einen entsprechenden Ausdruck zu setzen, der immer falsch ist.
Ich bin mir aber nicht sicher, ob der Filter in diesem Fall vom
SQL-Server ausgewertet wird, was der obigen SQL-Abfrage entspräche,
oder erst alle Daten kopiert und dann gefiltert wird.
Traubensaft gibt Traubenkraft
Christian "NineBerry" Schwarz
--
You've been hanging from a rope of mediocrity
Strung up by your insecurities
You can shine for me Somebody has to shine for me
It's difficult not to shine for me
Probier mal direkt die BDE-Aufrufe (BDE32.HLP)
DbiOpenFieldList und DbiOpenIndexList
Dieter
Danke. Hat mir ziemlich geholfen. Leider hat sich ein neues Problem
ergeben:
Ich benutze DbiOpenFieldList und DbiGetNextRecord um auf die
einzelnen Feldnamen und Feldtypen zuzugreifen. DbiGetNextRecord
liefert mir eine Variable vom Typ flddesc zurück.
flddesc.ifldtype sollte den Feldtyp enthalten, aber wenn ich diesen
Wert nach tfieldtype caste, kommen nur unsinnige Feldtyp heraus.
Wahrscheinlich ist mein cast unsinnig. Wie mache ich es richtig?
Der Parameter bPhyTypes in DbiOpenFieldList habe ich auf False
gesetzt und somit sollten laut Anleitung "logical types"
zurückgeliefert werden.
Bye
Sven
Das eine sind die Feldtypen der BDE und die sind natürlich _nicht_ die
gleichen wie in Delphi. Schau dir mal den Sourcecode von
TBDEDataSet.AddFieldDesc (DBTables.pas) an, der benutzt Mappings aus
DBCommon.pas: FieldType := DataTypeMap[iFldType]
Dieter
Folgende Abfrage (nur für Interbase) liefert Dir zur gegebenen Tabelle
TABLENAME die Indexe mit den zugehörigen Feldnamen.(in der richtigen
Reihenfolge).
select rdb$indices.rdb$index_name,rdb$index_segments.RDB$field_name from
rdb$indices,
rdb$index_segments where
(rdb$index_segments.rdb$index_name= rdb$indices.rdb$index_name) and
(rdb$indices.rdb$relation_name=:TABLENAME)
order by rdb$indices.rdb$index_id,rdb$index_segments.rdb$field_position
Die dazugehörigen Datentypen kannst Du ebenfalls aus den Systemtabellen
lesen wenn Du Tabellenname/Spaltenname hast.
Für Interbase ist es sinnvoll die Systemtabellen (alle in RDB$RELATIONS)
genauer unter Die Lupe zu nehmen.
(select RDB$RELATION_NAME from rdb$relations where rdb$relation_name like
"RDB$%") Da findet sich alles was
man braucht und es ist unabhängig von der BDE.
Gruss,
Martin