Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Feldnamen, Primaerschluessel ohne ttable ermitteln

30 views
Skip to first unread message

Sven Bursch

unread,
Jun 24, 2001, 6:55:28 AM6/24/01
to
Hi

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

Christian NineBerry Schwarz

unread,
Jun 24, 2001, 10:58:45 AM6/24/01
to
Hallo 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

Dieter Nöth

unread,
Jun 24, 2001, 2:52:42 PM6/24/01
to
Sven Bursch wrote:
>Gibt es eine Möglichkeit die Feldnamen, Feldtypen und Primärschlüssel
>einer Tabelle ohne TTabel zu ermitteln?


Probier mal direkt die BDE-Aufrufe (BDE32.HLP)
DbiOpenFieldList und DbiOpenIndexList

Dieter

Sven Bursch

unread,
Jun 25, 2001, 6:19:17 AM6/25/01
to
Dieter Nöth wrote:

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

Dieter Nöth

unread,
Jun 25, 2001, 2:32:32 PM6/25/01
to
Sven Bursch wrote:
>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?


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


Martin Mittelmann

unread,
Jun 26, 2001, 2:09:24 PM6/26/01
to

"Sven Bursch" <nos...@bursch.com> schrieb im Newsbeitrag
news:0vg4h9...@bursch.com...

> Hi
>
> Gibt es eine Möglichkeit die Feldnamen, Feldtypen und Primärschlüssel
> einer Tabelle ohne TTabel zu ermitteln?
>

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

0 new messages