Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TableNames und die Zugriffsverletzung (https://www.delphipraxis.net/192048-tablenames-und-die-zugriffsverletzung.html)

Delbor 16. Mär 2017 16:09

Datenbank: MySQL • Version: 5.7 • Zugriff über: FireDac

TableNames und die Zugriffsverletzung
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

hoika 16. Mär 2017 16:20

AW: TableNames und die Zugriffsverletzung
 
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 (?).

Delbor 16. Mär 2017 17:16

AW: TableNames und die Zugriffsverletzung
 
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.

hoika 16. Mär 2017 19:38

AW: TableNames und die Zugriffsverletzung
 
Hallo,

Unicode = UTF16, nicht UTF8

Delbor 16. Mär 2017 20:10

AW: TableNames und die Zugriffsverletzung
 
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

p80286 16. Mär 2017 21:42

AW: TableNames und die Zugriffsverletzung
 
Zitat:

Zitat von Delbor (Beitrag 1364426)
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
SQL-Code:
Show tables in|from contentmasterdata
die kategorien_tabelle zurück liefert, dann könnte man mal weiter schauen

Gruß
K-H

Delbor 16. Mär 2017 23:14

AW: TableNames und die Zugriffsverletzung
 
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

jobo 17. Mär 2017 05:16

AW: TableNames und die Zugriffsverletzung
 
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

Delbor 17. Mär 2017 12:56

AW: TableNames und die Zugriffsverletzung
 
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

Delbor 17. Mär 2017 14:07

AW: TableNames und die Zugriffsverletzung
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 1 von 2  1 2      

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