Datenbenk Fehler Abfangen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
mr.mc.mauser
Beiträge: 33
Registriert: Di 8. Jun 2010, 19:38

Datenbenk Fehler Abfangen

Beitrag von mr.mc.mauser »

Hallo,

ich habe in einer Datenbank mehrere Tabellen mit einer 1-1 Anweisung miteinander verknüpft.
Damit es keine 2 gleichen Einträge gibt habe ich UNIQUE benutzt.

Alls klappt soweit wirklich gut
nur wenn ich dann doch mal einen doppelten Eintrag habe bricht mein Programm mit folgender Fehlermeldung ab:
Projekt project1 hat Exception-Klassen "EZQLException" ausgelöst mit der Meldung:
SQL Error: Duplicate entry '1-1' for key 'adressen_id'
Das Programm besteht aus verschiedenen Fenstern und die Datenbank ist in ein Datenmodul (zugriff über ZEOS DB) ausgelagert.
Wie gesagt es klappt bis auf diese eine stelle.

Ich Rufe das so auf:

Code: Alles auswählen

try
     Daten_Modul.ZQuery1.Edit;
     Daten_Modul.ZQuery1adressen_id.Value:=DBGrid1.DataSource.DataSet.FieldValues['id'];
     Daten_Modul.ZQuery1altersklassen_id.Value:=DBGrid1.DataSource.DataSet.FieldValues['altersklassen_id'];
     Daten_Modul.ZQuery1bogenklassen_id.Value:=DBGrid1.DataSource.DataSet.FieldValues['bogenklassen_id'];
     Daten_Modul.ZQuery1turnier_id.Value:=Turnier_ID;
     Daten_Modul.ZQuery1.Post;
except
        showMessage('Ups, da ist wohl was schief gelaufen!');
end;
hat jemand ne Idee wie ich den UNIQUE Fehler abfangen kann ?

MYSQL Sendet einen:
#1062 - Duplicate entry '1-1' for key 'adressen_id'
Gruß
Robert

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datenbenk Fehler Abfangen

Beitrag von MmVisual »

Vorher einen SELECT auf die Tabelle machen und nachschauen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

mr.mc.mauser
Beiträge: 33
Registriert: Di 8. Jun 2010, 19:38

Re: Datenbenk Fehler Abfangen

Beitrag von mr.mc.mauser »

Ja das ist auch ne Idee... ich hatte mich ganz in das abfangen des Fehlers verbissen...

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

Re: Datenbenk Fehler Abfangen

Beitrag von af0815 »

Was ist da schlimm an der Exception. Wenn der Benutzer die Daten eingibt, dann kann er auch mit den Folgen konfrontiert werden. In einen Sinnvollen Dialog packen und ab zum Benutzer. Oder ist ein Fehler von der Anzeigelogik ? Daher den Benutzer zuwenig geführt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mr.mc.mauser
Beiträge: 33
Registriert: Di 8. Jun 2010, 19:38

Re: Datenbenk Fehler Abfangen

Beitrag von mr.mc.mauser »

Tja Benutzer gibt aber keine Daten ein......

Es gibt 2 Tabellen einmal Adressen und einmal Turnier Teilnehmer, der Benutzer sucht in Adressen nach einen Namen Klickt auf Übertragen dann wird der zu Turnier hinzugefügt.
Wenn einer schon beim Turnier gemeldet ist sollte eine Freundliche Meldung kommen, und keine Datenbankfehler....
Desweiteren bricht das Programm komplett ab nach der Fehlermeldung !!

Ich werde jetzt per select anweisung nachsehen ob es den Teilnehmer schon im Turnier gibt, und dann ne Freundliche Meldung ausgeben !
Soetwas gehöhrt auch zur Benutzerfreundlichkeit

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datenbenk Fehler Abfangen

Beitrag von MmVisual »

So lautet meine Devise:

Immer möglichst alle Fehler abfangen, behandeln wenn möglich oder Benutzer SINVOLL fragen.
Keine kryptischen System Fehler, wenn doch, dann loggen in ein Protokoll inclusive Aufruf-Hirarchie der Funktionen so dass der Programmierer später nachvollziehen kann was der User verbrochen hat.

Oder wie was das noch mit der Dialogbaox:

Want Sie den Error Beheben?
[Abbrechen] [Abbrechen]

Es einfach knallen lasen, sogar noch ohne Try Except kann ja jeder.
EleLa - Elektronik Lagerverwaltung - www.elela.de

mr.mc.mauser
Beiträge: 33
Registriert: Di 8. Jun 2010, 19:38

Re: Datenbenk Fehler Abfangen

Beitrag von mr.mc.mauser »

Hallo,

hab jetzt ne wirklich Elegante Lösung gefunden für das Problem....
Es geht Ohne Lazarus über MYSQL die Werte die Eingefügt werden sind nur ein Beispiel...

Code: Alles auswählen

INSERT INTO Runden_Teilnehmer (turnier_teilnehmer_id,turnier_id,runde,punkte) VALUES (1,2,3,4)
ON DUPLICATE KEY UPDATE runde=3,punkte=4
Was macht das Ganze jetzt ?
Findet INSERT einen doppelten Wert für einen PRIMARY KEY oder ein UNIQUE Feld wird das UPDATE ausgeführt, andernfalls läuft der INSERT ganz Normal durch.


P.S. Manchmal ist es wirklich gut wenn man sich die Doku von MYSQL nochmal reinzieht !!

Gruß
Robert

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datenbenk Fehler Abfangen

Beitrag von MmVisual »

Ist eine coole Lösung!

Ich kenne jetzt nicht Deine Software, aber wenn du diese auch zum Download für jedermann anbieten möchtest, dann solltest du darauf achten, dass die SQL Befehle auch mit SQLite tun. Die ZEOS Komponente kann beide Datenbänke, damit kann man einfach umschalten.

Ich habe die Erfahrung gemacht, dass Leute schlichtweg mit der Installation von MySQL überfordert sind und bei SQLite einfach die DLL mit geben und alles läuft schon.

Ist nur so ein gedanke...
EleLa - Elektronik Lagerverwaltung - www.elela.de

mr.mc.mauser
Beiträge: 33
Registriert: Di 8. Jun 2010, 19:38

Re: Datenbenk Fehler Abfangen

Beitrag von mr.mc.mauser »

Hallo Mm Visual,

ich wollte eigentlich alles in Sqlite machen, aber teilweise habe ich Funktionen in meinen Abfragen bzw inserts, das ich entweder MYSQL oder Postgresql benutzen muss.
Da mein Programm eh nur für einen ziemlich kleinen Kreis von Leuten ist (Leute die Turniere für 3D oder Feldbogen anbieten) kann ich den Support für Mysql leisten..

Oder ich gebe es den Leuten auf einem Stick, wo Mysql drauf läuft ähnlich wie bei den Xampp to go Projekten.

Aber trotzdem vielen Dank für den Tipp.

Gruß
Robert

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datenbenk Fehler Abfangen

Beitrag von MmVisual »

Ich habe hier eine Suchen-Funktion:

Code: Alles auswählen

qSuch.Close;
  qSuch.SQL.Text := 'SELECT b.ID, l.ID AS LID, b.tree_typ_ID, b.Bezeichnung AS Bezeichnung,';
  qSuch.SQL.Add('l.Bezeichnung AS LBez, g.Bezeichnung AS CBez, l.SMD, l.SMD_Text,');
  qSuch.SQL.Add('k.Bezeichnung AS KBez, l.LagerNr, l.Menge, l.Haltbar, l.Barcode,');
  qSuch.SQL.Add('adr.Bezeichnung AS AdrBez, a.BestellNr,');
  Case iSQLTyp Of
  0: Begin  // SQLite kann CASE
      qSuch.SQL.Add('(CASE WHEN a.EPreis IS NULL THEN l.EPreis ELSE a.EPreis END) AS EPreis,');
      qSuch.SQL.Add('((CASE WHEN a.EPreis IS NULL THEN l.EPreis ELSE a.EPreis END) * l.Menge) AS GPreis');
    End;
  1: // MySQL kann IF()
    qSuch.SQL.Add('IF(a.EPreis IS NULL, l.EPreis, a.EPreis) AS EPreis, (IF(a.EPreis IS NULL, l.EPreis, a.EPreis) * l.Menge) AS GPreis');
  3: // Postgres kann man IF als FUNCTION hinterlegen
    qSuch.SQL.Add('"IF"(a.EPreis IS NULL, l.EPreis, a.EPreis) AS EPreis, ("IF"(a.EPreis IS NULL, l.EPreis, a.EPreis) * l.Menge) AS GPreis');
  Else Begin // Firebird kann es nicht
      qSuch.SQL.Add('a.EPreis, (a.EPreis * l.Menge) AS GPreis,');
      qSuch.SQL.Add('l.EPreis AS LEPreis, (l.EPreis * l.Menge) AS LGPreis');
    End;
  end;
  qSuch.SQL.Add('FROM bauteil b');
  qSuch.SQL.Add('LEFT JOIN bauteillager l ON (b.ID = l.Bauteil_ID)');
  qSuch.SQL.Add('LEFT JOIN bauteiladr a ON (l.ID = a.BauteilLager_ID)');
  qSuch.SQL.Add('LEFT JOIN ' + AnsiQuotedStr('case', cSQLQuote) + ' g ON (g.ID = l.Case_ID)');
  qSuch.SQL.Add('LEFT JOIN kiste k ON (k.ID = l.Kiste_ID)');
  qSuch.SQL.Add('LEFT JOIN adr ON (adr.ID = a.Adr_ID)');
  qSuch.SQL.Add('WHERE b.Bezeichnung LIKE ''' + s + '''');
  qSuch.SQL.Add('OR l.Bezeichnung LIKE ''' + s + '''');
  qSuch.SQL.Add('OR l.SMD_Text LIKE ''' + s + '''');
  qSuch.SQL.Add('OR l.LagerNr LIKE ''' + s + '''');
  qSuch.SQL.Add('OR l.Barcode LIKE ''' + s + '''');
  qSuch.SQL.Add('OR a.BestellNr LIKE ''' + s + '''');
  qSuch.SQL.Add('ORDER BY Bezeichnung');
  qSuch.Open;
Und dazwischen anhand dem SQL Server was umgeschaltet. Klappt prima.
EleLa - Elektronik Lagerverwaltung - www.elela.de

mr.mc.mauser
Beiträge: 33
Registriert: Di 8. Jun 2010, 19:38

Re: Datenbenk Fehler Abfangen

Beitrag von mr.mc.mauser »

Das mit dem Umschalten ist prima.....
mal schauen ob ich es dann doch nicht noch in SQLite gebastelt bekomme.

Super

Gruß
Robert

Antworten