Hallo zusammen,
ich arbeite an einer Benutzeroberfläche für die Firebird Datenbank Versionen FB2.5 bis FB5.0.
Aus Kompatibilitätsgründen arbeite ich mit C# .net Version 4.7.2.
Wenn ich mit der Funktion "GetSchemaTable()" aus dem "FirebirdSql.Data.FirebirdClient" die Spalten einer Firebird Tabelle auslesen werden bei Anwendung auf eine FB4.0 Datenbank und höher die Spaltennamen nach 31 Zeichen abgeschnitten obwohl 63 Zeichen möglich sind.
Weiterhin wird mir für "IsKey" ein falscher Wert ausgegeben.
Da die "FirebirdSql.Data.FirebirdClient" Funktionen auf Funktionen aus "System.Data:Common" von .net basieren habe ich es mit den "original" Funktionen probiert - mit dem gleichen Ergebnis.
Ist dieses Problem bekannt?
Wird es eine Verbesserung geben?
Wie geht Ihr damit um?
Viele Grüße
der Maddin
Spaltennamen werden nach 31 Zeichen abgeschnitten
Moderator: martin.koeditz
Am Besten nach einer kostenlosen Registrierung hier eine Meldung abgeben:
https://github.com/FirebirdSQL/NETProvider/issues
https://github.com/FirebirdSQL/NETProvider/issues
Hi Maddin,
2. Selber die Systemtabellen abfragen, das ist treiberunabhängig, setzt aber Wissen über die Systemtabellen voraus. Martin (Köditz) hatte hier https://www.firebirdforum.de/viewtopic.php?p=1331#p1331 mal ein Statement gepostet, das ich auf die Schnelle angepasst habe, um Name der Relation erweitert und die Einschränkung auf eine bestimmte Tabelle entfernt, relation_type hinzugefügt (TABLE / VIEW / GTT inkl Variante).
Es liefert Dir die Metadaten aller Tabellen und Views einer DB, sortiert nach Tabellennamen und Feldposition, aber nicht die Indizes:
Vielleicht hilft Dir das weiter. Die Indexinfos könnte man da noch dranklemmen, wenn der Ansatz für Dich überhaupt in Frage kommt.
Du kannst die Abfrage zb in einen View oder eine SP packen, dann ist es nicht so ein Klotz in der Anwendung.
Grüße vr
1. Ja. Aber je nach Treiber kannst Du noch 10 Jahre warten. Und ab Version 6 unterstützt Firebird auch Schemas. Nur da auch wieder: auch Dein Treiber muss das können.Martin hat geschrieben: Mo 6. Jul 2026, 15:15 Wird es eine Verbesserung geben?
Wie geht Ihr damit um?
2. Selber die Systemtabellen abfragen, das ist treiberunabhängig, setzt aber Wissen über die Systemtabellen voraus. Martin (Köditz) hatte hier https://www.firebirdforum.de/viewtopic.php?p=1331#p1331 mal ein Statement gepostet, das ich auf die Schnelle angepasst habe, um Name der Relation erweitert und die Einschränkung auf eine bestimmte Tabelle entfernt, relation_type hinzugefügt (TABLE / VIEW / GTT inkl Variante).
Es liefert Dir die Metadaten aller Tabellen und Views einer DB, sortiert nach Tabellennamen und Feldposition, aber nicht die Indizes:
Code: Alles auswählen
select rf.rdb$relation_name relation_name,
decode(rt.rdb$type, 0, 'TABLE', 1, rt.rdb$type_name, 'TABLE (' || trim(rt.rdb$type_name) || ')') relation_type,
rf.rdb$field_name field_name,
case f.rdb$field_type
when 7 then
case f.rdb$field_sub_type
when 0 then 'smallint'
when 1 then 'numeric(' || f.rdb$field_precision || ', ' || (-f.rdb$field_scale) || ')'
when 2 then 'decimal'
end
when 8 then
case f.rdb$field_sub_type
when 0 then 'integer'
when 1 then 'numeric(' || f.rdb$field_precision || ', ' || (-f.rdb$field_scale) || ')'
when 2 then 'decimal'
end
when 9 then 'quad'
when 10 then 'float'
when 12 then 'date'
when 13 then 'time'
when 14 then 'char(' || trunc(f.rdb$field_length / ch.rdb$bytes_per_character) || ') '
when 16 then
case f.rdb$field_sub_type
when 0 then 'bigint'
when 1 then 'numeric(' || f.rdb$field_precision || ', ' || (-f.rdb$field_scale) || ')'
when 2 then 'decimal'
end
when 27 then 'double'
when 35 then 'timestamp'
when 37 then 'varchar(' || trunc(f.rdb$field_length / ch.rdb$bytes_per_character) || ')'
when 40 then 'cstring' || trunc(f.rdb$field_length / ch.rdb$bytes_per_character) || ')'
when 45 then 'blob_id'
when 261 then 'blob sub_type ' || f.rdb$field_sub_type
else 'rdb$field_type: ' || f.rdb$field_type || '?'
end field_type,
iif(coalesce(rf.rdb$null_flag, 0) = 0, null, 'not null') field_null,
ch.rdb$character_set_name field_charset,
dco.rdb$collation_name field_collation,
coalesce(rf.rdb$default_source, f.rdb$default_source) field_default,
f.rdb$validation_source field_check,
rf.rdb$description field_description
from rdb$relation_fields rf
join rdb$fields f on f.rdb$field_name = rf.rdb$field_source
left join rdb$character_sets ch on ch.rdb$character_set_id = f.rdb$character_set_id
left join rdb$collations dco on dco.rdb$collation_id = f.rdb$collation_id and dco.rdb$character_set_id = f.rdb$character_set_id
join rdb$relations r on r.rdb$relation_name = rf.rdb$relation_name
join rdb$types rt on rt.rdb$type = r.rdb$relation_type and rt.rdb$field_name = 'RDB$RELATION_TYPE'
where coalesce(rf.rdb$system_flag, 0) = 0
order by 1, rf.rdb$field_position;Du kannst die Abfrage zb in einen View oder eine SP packen, dann ist es nicht so ein Klotz in der Anwendung.
Grüße vr