![]() |
Datenbank: MySQL • Version: 5.1 • Zugriff über: ODBC MySQL Driver
Tabellen Abfragen
Hallo,
ich habe ein Problemchen. Ich möchte per Turbo Delphi und der Komponente TQuery auf meine MySQL Datenbank zugreifen und die vorhandenen Tabellen ermitteln. Unter der MySQL Shell geht das mit "SHOW TABLES" auch wunderbar. Nutze ich hingegen TQuery unter TurboDelphi, und will mir die einzelnen Felder holen, funktioniert das nicht. Nicht funktionieren heißt das er auf keines der Felder in der Abfrage zugreifen kann. Ich habe mal weitergeforscht und siehe da : Er hat laut TQuery.FieldDefs ein Feld welches auch genauso heißt wie das Feld in der MySQL-Shell. In dem Falle : "Tables_in_test" (Die Datenbank hab ich einfallsloshalber mal test genannt). Record Count zeigt mir auch die Anzahl der Tabellen an, aber sobald ich mit TQuery.Fields [0].AsString drauf zugreifen möchte krachts in der Form das er meint das Array-Maxium wäre überschritten (also keine Einträge). Mich wundert nur a) das er sagt er hat einen Spaltennamen der stimmig ist, b) Recordcount mir die richtige Anzahl an Records anzeigt, aber c) ich auf keinen der Records zugreifen kann. Was kann das sein ?! Dasselbe gilt im übrigen auch für "SHOW DATABASES" und "DESCRIBE TABLES". Liegt das vllt irgendwie an ODBC (Einschränkung im Befehlssatz der an MySQL weitergegeben wird, oder vllt sogar am Treiber ?!) hier mal mein code-fragment :
Delphi-Quellcode:
LG
procedure TfrmMain.Button3Click(Sender: TObject);
var list : TStringList; tq : TQuery; begin tq := TQuery.Create(self); tq.DatabaseName := 'MySQL'; list := TStringList.Create; tq.Active := false; tq.SQL.Text:='SHOW TABLES'; tq.active := true; info (inttostr (tq.RecordCount)); while not tq.Eof do begin list.Add(tq.Fields[0].AsString); tq.Next; end; list.destroy; tq.Destroy; end; TheMason [edit=MrSpock]Delphi Code-Tags eingefügt. Mfg, MrSpock[/edit] |
Re: Tabellen Abfragen
Versuch mal
SQL-Code:
anstelle von SHOW TABLES.
SELECT * FROM INFORMATION_SCHEMA.TABLES
|
Re: Tabellen Abfragen
Mmmh ... hilft mir nur bedingt weiter ...
unter der MySQL Shell liefert der mir alles mögliche an Informationen (Aufbau, Engine Version, usw ...) Wäre theoretisch auch nicht das problem das entsprechend zu filtern, nur hab ich da direkt 2 Probleme : 1. Ich arbeite mit ODBC und habe nur die DSN (also Data Source Name), die ich mir aus der Registry raussuche (unter HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources). Da würde zwar der Datenbank Name (also in der Registry) drinstehen, aber ich finde mit "select * (<- bzw. relevanten Feldern) from information_schema.tables" keine datenbank-namen die zu der/den Tabellen passen, und 2. Ich habe in einer weiteren MySQL (gleicher Server : localhost) Datenbank (in dem Falle "BOMSorter" als Datenbankname) ebenfalls Tabellen mit den selben namen wie in der "test"-Datenbank. Der o.g. Tipp liefert mir meine Tabellennamen aber nur 1. (!) mal obwohl die tabellen 2 mal vorhanden sind (einmal in "BOMSorter" und einmal in "test") LG TheMason |
Re: Tabellen Abfragen
Mal ne generelle Frage :
Ich habs gerad mal mit "select table_name from information_schema.tables" in meinem Delphi Programm ausprobiert. Da dasselbe Progblem das er zwar Records findet, aber ich kann nicht darauf zugreifen (egal ob über TQuery.Fields[0].AsString oder TQuery.FieldbyName ("table_name") ). Irgendwie wurmt mich das er zwar sagt er würde zwar records finden, aber er eben nicht darauf zugreifen kann. Liegt das vllt wirklich an ODBC oder an der Delphi-Komponente TQuery ?! Ich möchte nicht unbedingt auf den Native SQL umsteigen da ich schon einiges getippert hab, und wenn er doch zumindest schonmal sagt das er was findet, dann sollte man doch auch irgendwie da dran kommen. Vor allem weil ich eben auch ganz gerne Befehle wie "SHOW DATABASES" und "DESCRIBE TABLE" nutzen möchte, um die Tabellen mit einer Delphi Routine zu sichern ... |
Re: Tabellen Abfragen
Zitat:
Es sollte natürlich einen Weg gehen, die Datenbank- und Tabellennamen aufzulisten, wenn die Shell das auch kann. Wenn es nicht mit SELECT * FROM (Systemtabellenname) geht, bietet DbExpress eventuell etwas im MySQL-Treiber. |
Re: Tabellen Abfragen
Um mit der veralteten BDE über ODBC auf eine MySQL-DB zuzugreifen mußt du im entsprechenden ODBC-DSN ein paar checkboxen setzen. Irgendwo auf der MySQL-Seite sind diese beschrieben.
Ich empfehle dir aber direkt mit MySQL zu kommunizieren. z.B. über Kompos von DevArt oder über ZEOS. Damit sind einige Probleme die es bei BDE/ODBC-Zugriff gibt nicht vorhanden. Show Variables z.B. funktioniert z.B. direkt wunderbar. |
Re: Tabellen Abfragen
Um der Schema einer MySQL-Datenbank abzurufen gibt es zwei Wege:
1. mit "SHOW DATABASES" und "DESCRIBE TABLE" 2. durch Abfragen von virtuellen Tabellen - das INFORMATION_SCHEMA Lösung 1. ist sehr kurzsichtig, weil nicht portabel und unflexibel. Auf Deutsch gesagt das ist eine Fehlkonstruktion von MySQL Lösung 2. ist wesentlich intelligenter. Dieser Ansatz erlaubt nur die Informationen abzufragen, die man gerade braucht. Die Filtermöglichkeiten durch die WHERE-Klausel sind sehr leistungsfähig. Durch Joins kann man sich die Informationen so zusammenbauen wie man sie gerade braucht. kurzgesagt: man kann die vorhandene SQL-Technik voll ausnützen Es ist jetzt auch egal, ob du ODBC, Zeos oder eine andere Zugriffstechnik verwendest. Es gibt Lösung 1 oder Lösung 2; du kannst dich für den guten oder den schlechten Weg entscheiden. PS: hier dir die Doku zum INFORMATION_SCHEMA ![]() |
Re: Tabellen Abfragen
Benutze eine Connection-Komponente deiner Wahl und schau dir mal die Eigenschaft GetTableNames an.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 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