Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL um Tabellen und Feldnamen rauszufinden? (https://www.delphipraxis.net/148907-sql-um-tabellen-und-feldnamen-rauszufinden.html)

Yc4s1vtz 10. Mär 2010 17:39

Datenbank: allgemeine • Version: ?? • Zugriff über: BDE

SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

also ich wusste nicht wo ich das thema hinschieben sollte.

Ich frage mich wie ich die Tabellen namen und Feldnamen anzeigen lassen kann?

ziel der ganzen sache ist das ich die Tabellen inklusive Spalten in einer listbox anzeigen lassen möchte

wie sollte ich da vorgehen?

VG Ötzgür

Jürgen Thomas 10. Mär 2010 18:03

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

dazu gibt es keine allgemeine Lösung. SQL-Standard sind Abfragen auf INFORMATION_SCHEMA, aber jeder DB-Hersteller kann es anders lösen. Und die BDE schränkt die Abfragemöglichkeiten erheblich ein.

Du musst die Frage also schon genauer spezifizieren.

Gruß Jürgen

PS. Datenbanken ist schon das richtige Unterforum.

Yc4s1vtz 10. Mär 2010 19:12

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
verdammt :(

das ist ja grade das problem
ich weiss es nicht genauer

ich will es ja allgemein halten

Yc4s1vtz 10. Mär 2010 19:14

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
es wäre schön

wenn ich zumindest die einzelnen datenbanken rausfinden würde
das wäre ein schritt in die richtige richtung

es muss unter mssql, oracle, db2, postgresql und mysql laufen
andere datenbanken setzen wir nicht ein

und da dachte ich mir ich mache das allgemeingültig

sprich man weiss ja nie wann man das nochmal gebrauchen kann :(

mkinzler 10. Mär 2010 19:19

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Das geht aber leider nicht allgemeingültig.

Btw: Bitte nicht Pushen. Hat noch niemand geantwortet, dann bearbeite bitte deinen letzten Beitrag

mschaefer 10. Mär 2010 21:14

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Du kannst ja ein Select auf die Systemtabellen der jeweiligen Datenbank absetzen.
Gibt es einen Fehler, dann war es halt die Falsche. Mit try .. except geht man dann zur nächsten über.

Grüße // Martin

Stevie 11. Mär 2010 06:20

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Ich weiß nicht, wie sehr du an die BDE gebunden bist, aber evtl wären die Zeos-Komponenten einen Blick wert, dort gibts eine Komponente (TZSQLMetadata), die dir die benötigten Daten aus einer Datenbank liefert. Und sämtliche von dir genannten Datenbanken werden unterstützt.

alzaimar 11. Mär 2010 06:32

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Die TADOConnection kann das.

hoika 11. Mär 2010 06:51

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

bei der BDE geht es zumindestens auf DB-Ebene

DataBase.GetTables

Aber woher soll ein Programm wissen,
welche Datenbanken auf einem Server existieren ???

c:\data\data.db
d:\data\data.db
e:\data\data.db uups CD-Rom ;)
f:\data\data.db


Vergiss es am besten gleich oder besorg dir schon mal ein
schickes Wässerchen gegen die grauen Haare, die du bekommen wirst ;)


Heiko

nahpets 11. Mär 2010 07:27

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

so riesig dürfte das Problem mit der BDE nun aber auch wieder nicht sein:

TSession liefert die Datenbanken.

Werden die dann der Reihe nach mit einer TDatabase verbunden, so können mit GetTableNames die Tabellen ermittelt werden und mit GetFieldNames die Spalten.

Sind also ca. drei Methodenaufrufe in drei geschachtelten For-Schleifen.

Über die ADO-Komponenten dürfte das mit einem ähnlichen Aufwand zu realisieren sein, man ist aber nicht mehr abhängig von der BDE, die auf neueren Betriebssystemen leider immer häufiger Probleme bekommt.

Jürgen Thomas 11. Mär 2010 08:11

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Für die genannten DB-Systeme gibt es ein paar passende SELECT-Befehle unter [Wikibooks] Einführung in SQL: Tipps und Tricks. Jürgen

Yc4s1vtz 11. Mär 2010 17:29

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
ich hab das mal mit der TSession probiert

da ich mit ODBC arbeite ist das ein riesen problem
weil ich immer nur die namen der ODBC verbindungen bekomme :(

total doof

hmm klar das ich mich dahin verbinden muss
mach ich ja auch

aber dennoch läft getdatabasename leider nicht :(

ich würde ja gerne mit zeos arbeiten
aber ich glaube zeos arbeitet nicht mit odbc
und das ist pflicht

komisches projekt :(

hoika 11. Mär 2010 21:40

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

Zitat:

TSession liefert die Datenbanken.
Nee !!!

Tschulligung ;)

Wie ich schon geschrieben habe,
gibt es keine (Standard-)-Möglichkeit,
alle Datenbanken einer DB zu ermitteln.

Bsp.: Firebird:
Die Datei kann sich überall auf dem Server befinden.


Heiko

nahpets 12. Mär 2010 08:01

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo Hoika,
Zitat:

Zitat von hoika
Hallo,

Zitat:

TSession liefert die Datenbanken.
Unsinn !!!

Tschulligung ;)

Wie ich schon geschrieben habe,
gibt es keine (Standard-)-Möglichkeit,
alle Datenbanken einer DB zu ermitteln.

Bsp.: Firebird:
Die Datei kann sich überall auf dem Server befinden.


Heiko

hast Du schon mal in die Hilfe geschaut?
Zitat:

Zitat von delphihilfe
Die Methoden der Klasse TSession werden hier gezeigt.

Public Methoden
Name Beschreibung
AddAlias Fügt einen bestimmten Alias der Borland Database Engine (BDE) in die Sitzung eines SQL-Datenbankservers ein.
AddDriver Fügt einen bestimmten Alias der Borland Database Engine (BDE) in die Sitzung eines SQL-Datenbankservers ein.
AddPassword Fügt ein Kennwort in die aktuelle Sitzung ein, um auf verschlüsselte Paradox- oder dBASE-Tabellen zuzugreifen.
AddStandardAlias Fügt einen Standardalias der Borland Database Engine (BDE) für Paradox-, dBASE oder ASCII-Tabellen in die Sitzung ein.
Close Trennt die Sitzung von allen Datenbanken und schließt die Sitzung.
CloseDatabase Schließt eine der aktuellen Sitzung zugeordnete Datenbankverbindung.
DeleteAlias Entfernt einen bestimmten Alias der Borland Database Engin (BDE) aus der Sitzung.
DeleteDriver Entfernt einen bestimmten Alias der Borland Database Engine (BDE)-Treiber aus der Sitzung.
DropConnections Gibt alle inaktiven temporären Datenbankkomponenten frei, die einer Sitzung zugeordnet wurden.
FindDatabase Durchsucht in einer Sitzung die Liste der Komponenten nach einer angegebenen Datenbank.
GetAliasDriverName Stellt den Namen des Datenbanktreibers bereit, der von dem angegebenen und der Sitzung zugeordneten Alias der Borland Database Engine (BDE) verwendet wird.
GetAliasNames Fügt die Namen der dauerhaften Aliase der Borland Database Engine (BDE) in eine Stringliste ein.
GetAliasParams Ermittelt die Parameter, die einem Alias der Borland Database Engine (BDE) zugeordnet sind.
GetConfigParams Ruft Informationen über die Konfiguration der Borland Database Engine (BDE) ab.
GetDatabaseNames Fügt die Namen der dauerhaften Aliase der Borland Database Engine (BDE) und die Namen der in der Sitzung bekannten Datenbankkomponenten in eine Stringliste ein.
GetDriverNames Fügt die Namen der in der Sitzung verfügbaren Treiber der Borland Database Engine (BDE) in eine Stringliste ein.
GetDriverParams Fügt die Parameter eines bestimmten Treibers der Borland Database Engine (BDE) in eine Stringliste ein.
GetFieldNames Fügt die Feldnamen einer bestimmten Tabelle in eine Stringliste ein.
GetPassword Löst in der Sitzung die Ereignisbehandlungsroutine für OnPassword aus oder zeigt das Standarddialogfeld für die Kennworteingabe an.
GetStoredProcNames Fügt die Namen aller gespeicherten Prozeduren in eine Stringliste ein, die einer angegebenen, mit einem SQL-Datenbankserver verbundenen Datenbankkomponente zugeordnet sind.
GetTableNames Fügt die Namen der einer bestimmten Datenbankkomponente zugeordneten Tabellen in eine Stringliste ein.
IsAlias Legt fest, ob es sich bei einem String um einen bestehenden und in der Sitzung bekannten Datenbankalias der Borland Database Engine (BDE) handelt.
ModifyAlias Fügt Parameter in einen Alias der Borland Database Engine (BDE) ein oder ändert dessen Parameter.
ModifyDriver Fügt Parameter in einen Alias der Borland Database Engine (BDE) ein oder ändert dessen Parameter.
Open Startet eine Sitzung. Die Sitzung wird zur aktuellen Sitzung.
OpenDatabase Öffnet eine bestehende Datenbank oder erstellt und öffnet eine temporäre Datenbankkomponente.
RemoveAllPasswords Löscht alle Kennwörter für verschlüsselte Paradox-Tabellen, die in die aktuelle Sitzung eingefügt wurden.
RemovePassword Löscht einzelne Kennwörter für verschlüsselte Paradox-Tabellen, die in die aktuelle Sitzung eingefügt wurden.
SaveConfigFile Überträgt die aktuellen Informationen im BDE-Speicher aus dem Arbeitsspeicher in die BDE-Konfigurationsdatei auf der Festplatte.




Die Eigenschaften der Klasse TSession werden hier gezeigt.

Public Eigenschaften
Name Beschreibung
ConfigMode Legt fest, wie die Aliase der Sitzung von der Borland Database Engine (BDE) verwendet werden sollen.
DatabaseCount Gibt die Anzahl der aktiven Datenbankkomponenten an, die der Sitzung aktuell zugeordnet sind.
Databases Enthält ein indiziertes Array mit den Namen aller aktiven Datenbanken einer Sitzung.
Handle Legt das BDE-Handle für die Sitzung fest.
Locale Legt den Sprachtreiber der Borland Database Engine (BDE) für die Sitzung fest.
TraceFlags Legt die Datenbankoperationen fest, die zur Laufzeit mit dem SQL-Monitor überwacht werden.

Dazu noch folgenden Quelltext:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Database1: TDatabase;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
         i : Integer;
         k : Integer;
         sl1 : TstringList;
         sl2 : TstringList;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
  Session.GetAliasNames(memo1.lines);
  for i := 0 to memo1.lines.Count - 1 do Begin
    Database1.Close;
    Database1.AliasName := memo1.Lines[i];
    Database1.DatabaseName := memo1.Lines[i];
    Try
      Database1.Open;
      Database1.GetTableNames(sl1);
      memo2.Lines.Add('--- Datenbank ' + memo1.Lines[i]);
      for k := 0 to sl1.Count - 1 do begin
        memo2.Lines.Add('--- Feldauflistung zur Tabelle ' + sl1[k]);
        Database1.GetFieldNames(sl1[k],sl2);
        memo2.Lines.Add(sl2.Text);
      end;
    Except
      on e : Exception do begin
        memo2.Lines.add('--- ' + e.Message);
      end;
    End;
  End;
  sl2.Free;
  sl1.Free;
end;

end.
und Du hast das vom Threadersteller gewünschte Ergebnis über die BDE für alle Datenbanken die Tabellennamen und Feldname aufzulisten. Beim Einsatz der BDE kann man selbstverständlich nur die der BDE bekannten Datenbanken, Tabellen und Feldnamen auflisten. Die Aufgabenstellung lautet ja nicht: Liste mir alle für den Rechner theoretisch oder praktisch verfügbaren Datenbanken auf, von denen ich nicht mal weiß, ob es sie überhaupt gibt und von denen ich nicht mal weiß, wie ich auf sie zugreifen könnte.
Die BDE kann auf alle für sie konfigurierten Datenbanken zugreifen, hierzu zählen auch die auf dem Rechner eingerichteten ODBC-Treiber. Mehr ist nicht gefordert.

Spar die bitte in Zukunft solche Kommentare a la Unsinn.

Bernhard Geyer 12. Mär 2010 08:13

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Muss es denn BDE sein? Über BDE hast du eh das Problem das bei vielen neueren Datentypen von Oracle, MS SQL Server etc. über die BDE nur Müll ankommt. AFAIK bekommst du teilweise für NVARCHAR-Spalten den Inhalt nicht geliefert.

Also wenn ODBC gesetzt ist, ist ADO immer noch die bessere Wahl als BDE.

hoika 12. Mär 2010 08:13

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

Tschuldigung ..

Aber

Zitat:

es muss unter mssql, oracle, db2, postgresql und mysql laufen
Es steht hier nicht
"Wie lese ich die Alias-Namen aus"

Ich muss keinen Alias-Namen in der BDE-Konfiguration haben,
um z.B. per TDataBase auf eine MS-SQL-DB zuzugreifen.
Es ist nur der Name des Servers und der DB selber notwendig (plus der Kleinkram ala User/Passwort).


Heiko

nahpets 12. Mär 2010 08:28

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,
Zitat:

Zitat von hoika
Zitat:

es muss unter mssql, oracle, db2, postgresql und mysql laufen

und genau das funktioniert auf dem von mir beschriebenen Weg.

p80286 12. Mär 2010 09:33

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
So bekommst Du die Namen der ODBC-Verbindungen:
Delphi-Quellcode:
function GETDBS(var ll:tstringlist):boolean;
var
  reg : tregistry;
begin
  result:=true;
  reg:=tregistry.create;
  reg.rootkey:=HKEY_LOCAL_MACHINE;
  if reg.openkeyreadonly('\SOFTWARE\ODBC\ODBC.INI\ODBC DATA sources') then begin
    reg.getvaluenames(ll);
  end
  else result:=false;
  reg.closekey;
  reg.free;
end;
Und im Anhang Tabellen und Felder aus einer Oracle-DB.
Ich nutze zwar mODBC aber da kannst Du ohne große Probleme auf ADO umsteigen.

Gruß
K-H

nahpets 12. Mär 2010 10:02

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

wi der Zugriff über das Information_Schema funktioniert, kann man unter http://en.wikipedia.org/wiki/Information_schema nachlesen.

Yc4s1vtz 16. Mär 2010 19:19

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
hmm

entzwischen nutze ich auch mODBC

also ich glaube ich drücke mich falsch aus
also Tabellen und Felder gehen nun ohne probleme

aber z.b. haben wir das problem das wir eine große DB2 einsetzen
wir stellen Zement her

haben deutschlandweit halt gruben wo wir den krams halt fördern.

nun kaufen wir oft firmen und verkaufen sie auch wieder
ist halt sehr beliebt bei uns

dummerweise hat jede ihre eigene datenbank

und die kommen dann auf die große DB2
aber unter einen neuen schema

da haben wir z.b.
LBnord,
sus_Sued,
ftsued,
heidelberg
und so weiter

wie bekomme ich nun mit modbc bitteschön die schemas raus?

und noch eine frage

wenn ich in SQL angebe
SQL-Code:
 Create Database lbNord
was erstellt er da
ein schema ? eine datenbank ?
aus meiner sicht eine Datenbank
aber was ist nun ein schema?

p80286 17. Mär 2010 17:33

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Zitat:

Zitat von Yc4s1vtz
wie bekomme ich nun mit modbc bitteschön die schemas raus?

nutze mODBC.Query1.SQL.Text.

Aber Vorsicht, die Speicherverwaltung ist nicht so ausgefeilt, da könnte es schon einmal eng werden (bei mehreren 10.000 Datensätzen).

Zitat:

Zitat von Yc4s1vtz
.....aber was ist nun ein schema?

Platt gesagt ist ein Schema eine Datenbank, aber nur der Teil, der auch dem entsprechenden Benutzer gehört.
Wobei wahrscheinlich in den meisten Fällen Schema=Datenbank richtig ist, aber nicht immer!

Jürgen Thomas 17. Mär 2010 17:53

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Zitat:

Zitat von p80286
Platt gesagt ist ein Schema eine Datenbank, aber nur der Teil, der auch dem entsprechenden Benutzer gehört.
Wobei wahrscheinlich in den meisten Fällen Schema=Datenbank richtig ist, aber nicht immer!

Nein, so nicht! Allenfalls kann man sagen: "Schema = Datenbank ohne Daten", also nur die Struktur. Jürgen

hoika 18. Mär 2010 05:58

Re: SQL um Tabellen und Feldnamen rauszufinden?
 
Hallo,

also ein Schema ist ein Katalog,
der Informationen über sämtliche Datenbank-Objekte enthält,
naja, zumindestens soll er das ;).

Datenbank-Objekte sind
- Datenbanken selber
z.B. stehen in ms-sql alle DB's in einer sysXXX-Tabelle
unter Firebird ist das nicht so (ich lasse die firebird.conf mal aussen vor)

- DB-User
unter FB sind die User in einer eigenen Tabelle
können aber ab der 2.5 per SQL gemanaged werden

unterhalb einer Tabelle wäre dann folgendes
- Tabellen
- Felder
- Constraints
- Indizes

zu DB2 habe ich das hier gefunden
DB2 Schema

MS-SQL
Schema MS-SQL

Eine kurze Erklärung (allerdings für MySQL)
Schema MySQL

Die Google-Suche nach "db2 schema information" sollte was finden

Ich habe mich hier nicht auf DB2, sondern auf mssql und Firebird bezogen.
DB2 kenne ich nicht so.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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