Fehlerbehandlung

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Joachim Raap
Beiträge: 57
Registriert: Mo 30. Mär 2020, 12:37

Fehlerbehandlung

Beitrag von Joachim Raap »

Hallo - ja, ich habe in der Suchfunktion gesucht...
Wie werden in Lazarus Fehler behandelt? Z.B. habe ich mit "

Code: Alles auswählen

if fileexists('Name')
then begin
       end
else begin
        (Ausgabe einer Fehlermeldung)
       end;
eine Routine geschrieben. Abgefragt wird eine Tabelle einer Datenbank. Nur kommen z.B. vom Debugger Meldungen, die ich aber nicht haben will. Kann man "Systemmeldungen" irgendwie abschalten???
Ach ja - ich bin Anfänger!!!
Zuletzt geändert von Joachim Raap am Di 19. Mai 2020, 10:18, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4370
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Fehlerbehandlung

Beitrag von af0815 »

Du fragst nur ab ob eine Datei vorhanden ist. Das hat nichts mit einer Tabelle einer Datenbank direkt zu tun. Indirekt kann es sein, das Desktopdatenbanken ihre Tabellen als Datei anlegen.

Kann sein, das die Datenbank die Datei sperrt und du deswegen eine Systemmeldung bekommst. Welche Meldung ist es ? Welches Betriebssystem.

Lazarus läuft auf verschiedenen Betriebssytemen, deshalb auch die Frage, damit die Systemmeldung richtig zugeordnet werden kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 57
Registriert: Mo 30. Mär 2020, 12:37

Re: Fehlerbehandlung

Beitrag von Joachim Raap »

es ist eine "Debuggerausnahmenachricht der Exception-Klasse ESQL-DatabaseError (?) mit der Meldung: Error executing query. Table "Name" doesn't exist.
Das stimmt so soweit, weil die Tabelle bei false über den Befehl create erst erzeugt werden muß. Aber genau das so das ERgebnis der Abfrage sein - eine Debuggermeldung will ich nicht haben....
Danach kommt noch eine Meldung (vermutlich von Windows(??) mit dem gleichen Inhalt und dann die zu Testzwecken eingebaute Fehlermeldung....

Bei mir läuft Lazarus auf Windows 10 mit MySQL. Bitte antworte so, daßs Du einen Anfänger "abholst"....
Gruß und Danke

charlytango
Beiträge: 212
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Fehlerbehandlung

Beitrag von charlytango »

Joachim Raap hat geschrieben:Das stimmt so soweit, weil die Tabelle bei false über den Befehl create erst erzeugt werden muß. Aber genau das so das ERgebnis der Abfrage sein - eine Debuggermeldung will ich nicht haben....

Bei mir läuft Lazarus auf Windows 10 mit MySQL. Bitte antworte so, daßs Du einen Anfänger "abholst"....


ich stelle einfach eine Vermutung an, dass möglicherweise ein Grundlegendes Verständnisproblem vorliegt.
Darauf aufbauend:

MySQL ist wie der Name schon sagt eine SQL-Datenbank, die intern Daten verwaltet. Damit hat man als Frontend-Entwickler und Benutzer einer SQL-Datenbank erstmal nichts zu tun. Man handhabt eine SQL Datenbank über die Verbindung zur Datenbank die unterschiedlich hergestellt werden kann. (zb SQLDB oder ZEOS) Diese Komponenten stellen die Verbindung zur Datenbank her und setzen auch die SQL-Befehle ab bzw stellen die angefragten Daten zur Verfügung.

https://wiki.freepascal.org/Portal:Databases
https://wiki.freepascal.org/SqlDBHowto

du fragst also mit fileexists('XYZ') ab ob eine Datei mit Namen 'XYZ' existiert, was aber mit der Existenz einer Tabelle mit Namen XYZ in der SQL Datenbank nichts zu tun hat, denn die SQL-DB legt ihre Daten selbständig ab ohne dass man von außen Zugriff hätte oder haben sollte.

Wenn du die SQL-Datenbank fragen willst, ob die Tabelle XYZ existiert dann ist es wichtig zu wissen, gegen welche SQL-DB die Abfrage geht denn jede hat ihren eigenen Dialekt bei der Abfrage-Syntax. In deinem Fall also MySQL, da findest du evtl hier etwas:
https://electrictoolbox.com/check-if-my ... le-exists/

Hoffe das hilft dir mal weiter

Joachim Raap
Beiträge: 57
Registriert: Mo 30. Mär 2020, 12:37

Re: Fehlerbehandlung

Beitrag von Joachim Raap »

o.k. das habe ich verstanden. Es ist ein Unterschied, ob ich nach der Existenz einer Datei oder einer Tabelle in einer Datenbank frage.
Welche Datenbank? MySQL Version 5.6.46 - ich hoffe Sie meinen das....
Aber gibt es denn eine Möglichkeit, aus Lazarus heraus MySQL zu "fragen", oder es eine bestimmt Datenbank und/oder eine Tabelle darin gibt?

Benutzeravatar
six1
Beiträge: 244
Registriert: Do 1. Jul 2010, 19:01

Re: Fehlerbehandlung

Beitrag von six1 »

Hi Joachim,
die MYSQL erzeugt für eine Database einen Ordner und für die Tabellen Dateien (mit verschiedenen Dateiendungen für Tabelle selbst und Indexe).
An diese Ordner und Dateien solltest du aber nicht dran gehen.
Die MYSQL Datenbank stellt über einen Port (default = 3306) den Zugriff auf die Daten (Database und Tabellen) zur Verfügung.
Dies kann über die ZEOS Komponenten erfolgen.

Du benötigst dazu eine Komponente vom Typ TZConnection und eine TZQuery.
TZConnection stellt die Verbindung zu deiner Datenbank her. Hier gibst du den Datennbankbenutzer, Port, Passwort an.
Der Benutzer muss bereits in der Datenbank angelegt sein und auch die nötigen Rechte haben!
Um die MYSQL zu administrieren hilft dir evtl. HeidiSQL weiter oder auch die Shell (cmd)

Die TZQuery dient dazu, SQL Statements zur MYSQL zu senden und Rückgaben zu erhalten.
Die Eigenschaft "Database" verbindest du mit der Komponente vom Typ TZConnection.

In die Eigenschaft "SQL" einer TZQuery kannst du folgendes eintragen oder zur Laufzeit zuweisen:

Abfrage, ob Datenbank existiert:

Code: Alles auswählen

 
SELECT SCHEMA_NAME
  FROM INFORMATION_SCHEMA.SCHEMATA
 WHERE SCHEMA_NAME = 'DBName'
 


Hier eine Abfrage, ob eine Tabelle existiert:

Code: Alles auswählen

 
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = 'databasename'
AND table_name = 'testtable';
 


Beispiel für Zugriffe zur Laufzeit deines Programms:

Code: Alles auswählen

 
MyQuery.active := false;
MyQuery.sql.clear;
MyQuery.sql.text:=
                             'SELECT table_name '+
                             'FROM information_schema.TABLES '+
                             'WHERE table_schema =:databasename '+
                             'AND table_name = :table; ';
MyQuery.Parambyname('databasename ').asstring:='MeineDatenbank';
MyQuery.Parambyname('table').asstring:='MeineTabelle';
MyQuery.active:=true;
if  MyQuery.recordcount = 0 then
  Showmessage('Tabelle existiert nicht')
else
  Showmessage('Tabelle existiert');
 


Da fehlt noch einiges zu dem Thema, ist aber schon mal ein Anfang...
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4370
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Fehlerbehandlung

Beitrag von af0815 »

Statt mit ZEOS kann man mit den direkt in Lazarus/fpc enthaltenen SQLdb Komponenten arbeiten. Damit entfällt die notwendigkeit externe Komponenten zu verwenden.

Siehe https://wiki.freepascal.org/SQLdb_Package

Dann die Beispiele von hier https://wiki.freepascal.org/SqlDBHowto mal ansehen, die englische Version ist aktueller.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten