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:
Beide Methoden tun problemlos, was sie sollen:
ServerInfoFrame1.CatalogInformation;
Serverinfoframe1.TableInformation('contentmasterdata');
Delphi-Quellcode:
und der Getter des Propertys FDMySQLDml.Contentmastertables:
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;
Delphi-Quellcode:
Trotzdem erhalte ich die Fehlermeldung:
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; Zitat:
Delphi-Quellcode:
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'.
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; Was soll das, bzw. was mache ich falsch? Gruss Delbor |
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:
Beides Mal sieht es richtig aus, aber nimm doch mal testweise die obere auch unten.SQLString := 'SELECT Kath_ID as Kath_ID, Kategorie as Kategorie FROM kategorien_tabelle'; FDQueryMain.SQL.Text := SQLString; FDQueryMain.Open; 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 (?). |
AW: TableNames und die Zugriffsverletzung
Hi hoika
Erstmal vielenDank für deine Antwort! Zitat:
Delphi-Quellcode:
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:
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;
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:
Zitat:
Gruss Delbor PS: Zitat:
Unicode => UTF8 : wahrscheinlich schon, umgekehrt aber wohl nicht. |
AW: TableNames und die Zugriffsverletzung
Hallo,
Unicode = UTF16, nicht UTF8 |
AW: TableNames und die Zugriffsverletzung
Hi hoika
Zitat:
Zitat:
Gruss Delbor |
AW: TableNames und die Zugriffsverletzung
Zitat:
Falls
SQL-Code:
die kategorien_tabelle zurück liefert, dann könnte man mal weiter schauen
Show tables in|from contentmasterdata
Gruß K-H |
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:
Show Tables bezieht sich immer auf die in der aktuellen Verbindung geöffnete Datenbank, weshalb eine From-Klausel überflüssig ist.
Self.LBxTableNames.Items.AddStrings(FDMySQLDml.Contentmastertables);
FDMySQLDml.FDConnectionMySql.GetTableNames(Catalog, '', '', FTablelist); Gruss Delbor |
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 |
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:
Gruss
[CMConnection]
Database=contentmasterdata User_Name=root Password=XXXXXXXX Server=localhost DriverID=MySQL Delbor |
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. |
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