AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tabellen Abfragen

Ein Thema von TheMason · begonnen am 18. Apr 2009 · letzter Beitrag vom 18. Apr 2009
Antwort Antwort
TheMason

Registriert seit: 18. Apr 2009
3 Beiträge
 
#1

Tabellen Abfragen

  Alt 18. Apr 2009, 15:18
Datenbank: MySQL • Version: 5.1 • Zugriff über: ODBC MySQL Driver
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:
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;
LG
TheMason

[edit=MrSpock]Delphi Code-Tags eingefügt. Mfg, MrSpock[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 15:57
Versuch mal
SELECT * FROM INFORMATION_SCHEMA.TABLES anstelle von SHOW TABLES.
  Mit Zitat antworten Zitat
TheMason

Registriert seit: 18. Apr 2009
3 Beiträge
 
#3

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 16:17
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
  Mit Zitat antworten Zitat
TheMason

Registriert seit: 18. Apr 2009
3 Beiträge
 
#4

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 16:29
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 ...
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 16:47
Zitat von TheMason:
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 ...
Nun, eine TQuery Komponente ist eher dazu da, SQL Statements wie SELECT an den Server zu senden und die Ergebnisse entgegenzunehmen. "SHOW" oder "DESCRIBE" liefern in der Shell eventuell Ergebnisse, werden aber anscheinend nicht als gültige SQL Statements von TQuery verarbeitet. Schau mal nach, ob diese Befehle laut Doku ausser in der Shell auch in Skripten inn / Triggern / Prozeduren verwendet werden können (ich tippe auf nein).

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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 17:04
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 18:42
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
http://dev.mysql.com/doc/refman/5.1/...on-schema.html
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Tabellen Abfragen

  Alt 18. Apr 2009, 19:30
Benutze eine Connection-Komponente deiner Wahl und schau dir mal die Eigenschaft GetTableNames an.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz