AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TableNames und die Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

TableNames und die Zugriffsverletzung

Ein Thema von Delbor · begonnen am 16. Mär 2017 · letzter Beitrag vom 17. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2      
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

TableNames und die Zugriffsverletzung

  Alt 16. Mär 2017, 17:09
Datenbank: MySQL • Version: 5.7 • Zugriff über: FireDac
Hi zusammen

In der Createprozedure meiner Mainform hab ich 2 Aufrufe:
Delphi-Quellcode:
    ServerInfoFrame1.CatalogInformation;
    Serverinfoframe1.TableInformation('contentmasterdata');
Beide Methoden tun problemlos, was sie sollen:
Delphi-Quellcode:
procedure TServerInfoFrame.TableInformation(Catalog: string);
  var LIndent : String;
begin
  LIndent := ' - ';
  Self.LBxTableNames.Items.AddStrings(FDMySQLDml.Contentmastertables);
  FDMySQLDml.FDConnectionMySql.GetTableNames(Catalog, '', '', FTablelist);
  if FTablelist.Count > 0 then
  begin
    Memo1.Lines.Add('TServerInfoFrame.TableInformation / '+ Catalog);
    Memo1.Lines.Add('FDMySQLDml.FDConnectionMySql.DatabaseName' + FDMySQLDml.FDConnectionMySql.Params.Database);
    Memo1.Lines.AddStrings(FTablelist)
  end
  else
  begin
    Memo1.Lines.Add('Keine Tabellen-Angaben zu '+Catalog+' vorhanden!');
    Memo1.Lines.Add('');
  end;
end;
und der Getter des Propertys FDMySQLDml.Contentmastertables:

Delphi-Quellcode:
function TFDMySQLDml.GetContentmasterTables: TStringlist; // Wird nach TMySQL verlegt
  var SqlString : String; I: integer;
begin
    SqlString := 'SHOW TABLES';
    FDQueryMain.Open(SqlString);
    FDQueryMain.First;
    while not FDQueryMain.Eof do
    begin
      FContentmastertables.Add(FDQueryMain.Fields.Fields[0].AsString);
      FDQueryMain.Next;
    end;
      FDQueryMain.Close;
  Result := (FContentmastertables);
 end;
Trotzdem erhalte ich die Fehlermeldung:

Zitat:
Im Projekt ContentMasterDXE8.exe ist eine Exception der Klasse EMySQLNativeException mit der Meldung '[FireDAC][Phys][MySQL] Table 'contentmasterdata.kategorien_tabelle' doesn't exist' aufgetreten.
Die entsprechende Abfrage:

Delphi-Quellcode:
procedure TFDMySQLDml.SelectCategoryRecords;
  var SQLString: UTF8String; Zero: Boolean;
      QueryCategory : TQueryResultClass; LCategory : String; LCategoryKey : Integer;
begin
  if FCategoryList.Count>0 then
     FCategoryList.Clear;
  if assigned(FOnStartCategoryQuery) then
  begin
     Zero := True;
     FOnStartCategoryQuery(Self, Zero);
  end;
  SQLString := 'SELECT Kath_ID as Kath_ID, Kategorie as Kategorie FROM kategorien_tabelle';
  FDQueryMain.SQL.Text := SQLString;
  FDQueryMain.Open; //<==Kategorientabelle wird nicht gefunden `` ` ` ``
  FDQueryMain.First;
  while not FDQueryMain.Eof do
  begin
    QueryCategory := TQueryResultClass.Create(Self);
    QueryCategory.KategoryTabelle.Kath_Id := FDQueryMain.FieldByName('Kath_ID').AsInteger;
    QueryCategory.KategoryTabelle.Kategory := UTF8ToUnicodeString(FDQueryMain.FieldByName('Kategorie').AsString);
    FCategoryList.Add(QueryCategory);
    if assigned(FOnFoundedCategory) then
    begin
      LCategory := QueryCategory.KategoryTabelle.Kategory;
      LCategoryKey := QueryCategory.KategoryTabelle.Kath_Id;
      FOnFoundedCategory(Self,LCategory,LCategoryKey);
    end;
    FDQueryMain.Next;
  end;
// CM_First.CmbxFrame1.ComboBox1.Items.Add(FCategoryList.CurrentRecord.KategoryTabelle.Kategory);
  FDQueryMain.SQL.Clear;
  FDQueryMain.Close;
end;
Wie aus dem Anhang ersichtlich, tun beide Abfragemethoden (die von Firedac und die Direktabfrage) genau, was sie sollen und listen die gesuchten Tabellen auf - inklusive der schlussendlich vermissten 'contentmasterdata.kategorien_tabelle'.

Was soll das, bzw. was mache ich falsch?

Gruss
Delbor
Miniaturansicht angehängter Grafiken
tablenames.jpg  
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TableNames und die Zugriffsverletzung

  Alt 16. Mär 2017, 17:20
Hallo,
zum Ermitteln der Tabellennamen gibt es bereits was fertiges
http://docwiki.embarcadero.com/Libra....GetTableNames
aber nur am Rande.

Was mich wundert, ist deine unterschiedliche Herangehensweise bei den SQL-Abfragen.

Delphi-Quellcode:
 
SqlString := 'SHOW TABLES';
FDQueryMain.Open(SqlString);
Delphi-Quellcode:
 
SQLString := 'SELECT Kath_ID as Kath_ID, Kategorie as Kategorie FROM kategorien_tabelle';
FDQueryMain.SQL.Text := SQLString;
FDQueryMain.Open;
Beides Mal sieht es richtig aus, aber nimm doch mal testweise die obere auch unten.
Nur das
SQLString := 'SELECT Kath_ID as Kath_ID, Kategorie as Kategorie FROM kategorien_tabelle';
verstehe ich nicht, was soll das As hier bringen?
'SELECT Kath_ID, Kategorie FROM kategorien_tabelle';

Ausserdem ist es nicht Utf8String, sondern nur string.
Vielleicht ist das aber das gleiche (?).
Heiko

Geändert von hoika (16. Mär 2017 um 17:24 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TableNames und die Zugriffsverletzung

  Alt 16. Mär 2017, 18:16
Hi hoika

Erstmal vielenDank für deine Antwort!
Zitat:
Was mich wundert, ist deine unterschiedliche Herangehensweise bei den SQL-Abfragen.
Das ist relativ einfach: Der Code entstand vor etlicher Zeit unter DelphiXE4 und DBExpress.

Delphi-Quellcode:
Delphi-Quellcode:
 
SqlString := 'SHOW TABLES';
FDQueryMain.Open(SqlString);
.....
Delphi-Quellcode:
 
SQLString := 'SELECT Kath_ID as Kath_ID, Kategorie as Kategorie FROM kategorien_tabelle';
FDQueryMain.SQL.Text := SQLString;
FDQueryMain.Open;
Du meinst damit, ich soll bei der unteren open-Anweisung den SQLString auch als Parameter anhängen? Hab ich soeben getan - mit dem selben Ergebnis. Ausserdem nachfolgend eine Prozedur, die genau das tut, was ich von ihr will - auch ohne jeden open-Parameter;

Delphi-Quellcode:
function TFDMySQLDml.GetMaxAllowedPacket : integer;
  var SQLString: AnsiString;
begin
  SqlString := 'SELECT Variable_Value FROM performance_schema.SESSION_VARIABLES WHERE VARIABLE_NAME = ''MAX_ALLOWED_PACKET''';
  FDMySQLQueryInfo.SQL.Text := SqlString;
  FDMySQLQueryInfo.Open; // Läuft Problemlos ab.
  if not FDMySQLQueryInfo.IsEmpty then
  begin
    Result := FDMySQLQueryInfo.Fields.Fields[0].AsInteger;
    FMaxAllowedPacket := Result;
  end;
  FDMySQLQueryInfo.Close;
end;
Zitat:
verstehe ich nicht, was soll das As hier bringen?
Das soll sicherstellen, das das Feld im Query dann auch genauso heisst. Ist nicht auf meinemMist gewachsen. Und wenn ich mich richtig erinnnere, wird dies auch von MySQL selbst, aber zumindest von Buchautoren, so empfohlen.

Zitat:
Ausserdem ist es nicht Utf8String, sondern nur string.
Das ist - oder war - unter DXE4/DBExpress/der damaligen MySQL-Installation/Konfiguration des Servers/der Verbindung wegen. Das könnte der Haken an der Sache sein.

Gruss
Delbor

PS:
Zitat:
Vielleicht ist das aber das gleiche (?).
Nein. Der Delphi-Datentyp String ist unter DXE8 (und IMHO seit Delphi9/10) ein Unicode-String. Ich weiss aber gerade nicht, ob das Problematisch ist/sein kann.
Unicode => UTF8 : wahrscheinlich schon, umgekehrt aber wohl nicht.
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (16. Mär 2017 um 18:22 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TableNames und die Zugriffsverletzung

  Alt 16. Mär 2017, 20:38
Hallo,

Unicode = UTF16, nicht UTF8
Heiko
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TableNames und die Zugriffsverletzung

  Alt 16. Mär 2017, 21:10
Hi hoika

Zitat:
Unicode = UTF16, nicht UTF8
Deshalb hab ich ja vermutet:
Zitat:
Unicode => UTF8 : wahrscheinlich schon, umgekehrt aber wohl nicht.
Muss aber nicht sein. Zumindest hab ich die entsprechende Deklaration mal in 'normalen' String abgeändert - mit dem selben Ergebnis.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: TableNames und die Zugriffsverletzung

  Alt 16. Mär 2017, 22:42
Wie aus dem Anhang ersichtlich, tun beide Abfragemethoden (die von Firedac und die Direktabfrage) genau, was sie sollen und listen die gesuchten Tabellen auf - inklusive der schlussendlich vermissten 'contentmasterdata.kategorien_tabelle'.
Zunächst einmal ist das - zumindest für mich - nicht ersichtlich.
Falls Show tables in|from contentmasterdata die kategorien_tabelle zurück liefert, dann könnte man mal weiter schauen

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TableNames und die Zugriffsverletzung

  Alt 17. Mär 2017, 00:14
Hi p80286

Die beiden unten stehenden Zeilen liefern beide die Tabellen der DB Contentmasterdata - wie du aus dem Jpeg entnehmen kannst, sind beide Listen - die im Memo und die im LBxTableNames(Listbox) genau gleich. Beide führen die 'vermisste' Tabelle auf.
Die Listbox ist rechts, das Memo links im Bild angeordnet.
Delphi-Quellcode:
  Self.LBxTableNames.Items.AddStrings(FDMySQLDml.Contentmastertables);
  FDMySQLDml.FDConnectionMySql.GetTableNames(Catalog, '', '', FTablelist);
Show Tables bezieht sich immer auf die in der aktuellen Verbindung geöffnete Datenbank, weshalb eine From-Klausel überflüssig ist.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (17. Mär 2017 um 00:16 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: TableNames und die Zugriffsverletzung

  Alt 17. Mär 2017, 06:16
Ich habe mir die Details nicht angesehen, nur mal 2 Hinweise:
1.Die Verfügbarkeit eines Tabellenkatalogs bzw. die dort aufgeführten Einträge sagen nichts darüber aus, ob und welche Zugriffsrechte ein angemeldeter Nutzer hat.
2.Die Tabelle ist ggf. keine Tabelle, sondern ein View oder ähnliches Objekte


zu1. Rechteverwaltung in mySQL ist ja eher rudimentär, also keine Ahnung, ob das der Punkt ist, würde ich aber mal prüfen.
zu2. mySQl verfügt über eine Reihe von Engines mit Sonderfunktionen, die "tabelle" ist vielleicht damit definiert, vielleicht ein Konfigurationsproblem
Gruß, Jo
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TableNames und die Zugriffsverletzung

  Alt 17. Mär 2017, 13:56
Hi jobo

Auch dir vielen Dank für deine Antwort.
Ich denke eigentlich nicht, dass es an den MySQL-Rechten liegt. Der User da ist Root, und das ist auch Teil der unter Delphi (im Datenexplorer) definierten Verbindung.

Gerade eben hatte ich Mysql-Workbench geöffnet. Da müssten unter Administration-Optionsfile Basicdir und DatabaseDir angegeben sein, was nicht der Fall war. Inwieweit das für mich von belang ist, weiss ich nicht genau, aber da es sich um eine Verbindung in MySQLWorkbench handlt, ist dies für die Verbindung unter Delphi wohl nicht massgebend. Ausser dass der Server natürlich wissen muss, wo er seine Daten findet. (Wobei dies in der .ini steht...)

Aus diesem Grund tippe ich eher auf einen Konfigurations-Fehler in FireDac. Aber da wird es doch etwas schwierigunübersichtlich.
Nach eine Beispiel von Embarcadero zur Verwendung des FDQuerys habe ich gar nichts falsch gemacht, weder in den Einstellungen der FDConnection noch in denen des Querys, auch wenn das Beispiel zu einer Access-DB verbindet.

Die Datei FDConnectiondefs.ini definiert die von mir im Datenexplorer angelegte Verbindung so:
Delphi-Quellcode:
[CMConnection]
Database=contentmasterdata
User_Name=root
Password=XXXXXXXX
Server=localhost
DriverID=MySQL
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: TableNames und die Zugriffsverletzung

  Alt 17. Mär 2017, 15:07
Hi zusammen

Mal eine grundsätzliche Frage: Wie konfiguriert ihr eine FireDac-Verbindung? Ein FireDac-Query? Was gibt es dabei zu beachten? Sind noch andere Eigenschaftswerte nebst Connectionname, ConenctionDefName, Drivername und und einige Parameterwerte wichtig?

Gruss
Delbor

I
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:27 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