AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

locate vor insert

Ein Thema von Delphi-Phil · begonnen am 29. Jan 2008 · letzter Beitrag vom 30. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Delphi-Phil

Registriert seit: 22. Jun 2007
410 Beiträge
 
#1

locate vor insert

  Alt 29. Jan 2008, 17:00
Datenbank: mysql • Zugriff über: ado
Hallo,
ich hätte da mal folgende Frage an alle Datenbank Experten...

Mit dieser Prozedur wird eine Neue Klasse in meiner Tabelle angelegt, jetzt würde ich gerne prüfen ob die klasse schon vorhanden ist und wenn ja eine Meldung ausgeben. Würdet ihr das mit Table.Locate machen oder wie macht man das am besten??

Delphi-Quellcode:
procedure THauptForm.Klasse1Click(Sender: TObject);
var
  Klasse : String;
begin
  Klasse := InputBox('Neue Klasse anlegen', 'Klasse:','');
  if Klasse <> 'then
  begin
    //Prüfen ob der eintrag nicht schon vorhanden ist!!
    TblKlassen.Insert;
    TblKlassen.FieldByName('Klassenname').AsString := Klasse;
    TblKlassen.Post;
    TblKlassen.First;
  end;
end;

Gruß Phil
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: locate vor insert

  Alt 29. Jan 2008, 17:24
Ja, das ginge folgendermassen (ungetestet):
Delphi-Quellcode:
procedure THauptForm.Klasse1Click(Sender: TObject);
var
  Klasse : String;
begin
  Klasse := InputBox('Neue Klasse anlegen', 'Klasse:','');
  if Klasse <> 'then
  begin
    //Prüfen ob der eintrag nicht schon vorhanden ist!!
    if TblKlassen.Locate('Klassenname', Klasse, [loIgnoreCase]) then
      ShowMessage('Klasse schon vorhanden')
    else
    begin
      TblKlassen.Insert;
      TblKlassen.FieldByName('Klassenname').AsString := Klasse;
      TblKlassen.Post;
      TblKlassen.First;
    end;
  end;
end;
Falls das DataSet gross ist, sollte ein Index auf UpperCase(KlassenName) erstellt sein.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Delphi-Phil

Registriert seit: 22. Jun 2007
410 Beiträge
 
#3

Re: locate vor insert

  Alt 29. Jan 2008, 20:21
also es war schon richtig nur an einer kleinen Sache war noch ein Problemchen...


Es muss richtig so sein:
Delphi-Quellcode:
procedure THauptForm.Klasse1Click(Sender: TObject);
var
  Klasse : String;
begin
  Klasse := InputBox('Neue Klasse anlegen', 'Klasse:','');
  if Klasse <> 'then
 begin
    //Prüfen ob der eintrag nicht schon vorhanden ist!!
    if TblKlassen.Locate('Klassenname', Klasse, [b][loCaseInsensitive][/b]) then
      ShowMessage('Klasse schon vorhanden')
    else
    begin
      TblKlassen.Insert;
      TblKlassen.FieldByName('Klassenname').AsString := Klasse;
      TblKlassen.Post;
      TblKlassen.First;
    end;
  end;
end;
Gruß Phil und vielen Dank für Eure Hilfe!
  Mit Zitat antworten Zitat
hoika

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

Re: locate vor insert

  Alt 30. Jan 2008, 10:04
Hallo,

du könntest das auch über einen unique index lösen.
Das Post schlägt dann fehl

try
Table.Post;
except
// Fehler
on E: EDBEngineError ....
end;


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: locate vor insert

  Alt 30. Jan 2008, 10:19
Zitat von hoika:
Hallo,

du könntest das auch über einen unique index lösen.
Das Post schlägt dann fehl

try
Table.Post;
except
// Fehler
on E: EDBEngineError ....
end;
Wobei wir wieder beim Thema unsinnige Verwendung von Exception sind.
In dem Beispiel mit dem Locate wird die Exception vermieden.
Bei Dir wird explizit eine Exception verursacht, wo keine nötig ist.

Frei nach dem Motto:
Ich schütte halt mal Benzin in den Tank das Autos -> try
Wenn es halt einen Dieselmotor hat, dann geht halt was kaputt -> Exception.
Dann kann ich das ja versuchen zu reparieren -> except: Tank reinigen, Motor austauschen

==> Holzhammermethode. #@§#@#$£
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: locate vor insert

  Alt 30. Jan 2008, 10:26
Zitat von RavenIV:
Wobei wir wieder beim Thema unsinnige Verwendung von Exception sind.
In dem Beispiel mit dem Locate wird die Exception vermieden.
Bei Dir wird explizit eine Exception verursacht, wo keine nötig ist.
Doch, genau da ist eine Exception nötig, weil die Konsistenz der Daten in der DB gefährdet ist.

Ein Locate prüft nur lokal im Dataset. Wenn sich nach dem Öffnen der Tabelle an einer anderen Stelle ein Insert in die Klasse gemacht wird, so kriegt das Dataset das nicht mit. Locate findet nix, und es wird unter Umständen eine Klasse doppelt eingefügt. Deshalb ist eine Exception schon richtig.

ES IST IMMER ANGELEGENHEIT DER DATENBANK, DIE KONSISTENZ DER DATEN ZU GEWÄHRLEISTEN.

Glaub mir. Das erspart viele Fehler in späteren Phasen eines Projektes, und man sollte sich erst gar nicht angewöhnen, solche Probleme falsch anzugehen.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: locate vor insert

  Alt 30. Jan 2008, 10:35
[quote="Jelly"]
Zitat von RavenIV:
Doch, genau da ist eine Exception nötig, weil die Konsistenz der Daten in der DB gefährdet ist.

Ein Locate prüft nur lokal im Dataset. Wenn sich nach dem Öffnen der Tabelle an einer anderen Stelle ein Insert in die Klasse gemacht wird, so kriegt das Dataset das nicht mit. Locate findet nix, und es wird unter Umständen eine Klasse doppelt eingefügt. Deshalb ist eine Exception schon richtig.

ES IST IMMER ANGELEGENHEIT DER DATENBANK, DIE KONSISTENZ DER DATEN ZU GEWÄHRLEISTEN.
Es ist schon richtig, dass dafür die DB zuständig ist.

Aber Exception = Ausnahme = unerwarteter Fehler
Und Exception <> Allheilmittel

Wenn ich einen Fehler vorhersehen kann und vorher abprüfen kann, dann verwende ich keine Exception.
Locate - Insert - Post - Commit.
Da kann mir doch kein anderer Insert dazwischen pfuschen.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
hoika

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

Re: locate vor insert

  Alt 30. Jan 2008, 11:56
Hallo,

zwischen Locate und Post kann aber schon
ein anderer Client den gleichen Wert in die DB geschrieben haben.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: locate vor insert

  Alt 30. Jan 2008, 12:27
Zitat von RavenIV:
Es ist schon richtig, dass dafür die DB zuständig ist.

Aber Exception = Ausnahme = unerwarteter Fehler
Es ist ein unerwarteter Fehler, wenn der Datensatz schon existiert. Zumindest seh ich das so, dass aus Client Sicht ein Einfügen des Records einen Fehler auslösen soll, wenn es auf Datenbankebene fehl schlägt... Warum Client-seitig etwas prüfen, wofür der Server zuständig ist.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: locate vor insert

  Alt 30. Jan 2008, 12:31
Zitat von Jelly:
Es ist ein unerwarteter Fehler, wenn der Datensatz schon existiert. Zumindest seh ich das so, dass aus Client Sicht ein Einfügen des Records einen Fehler auslösen soll, wenn es auf Datenbankebene fehl schlägt... Warum Client-seitig etwas prüfen, wofür der Server zuständig ist.
So gesehen...
Dann ist es OK, hier eine Exception zu verwenden.
Ich lasse mich gerne belehren und bekehren.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  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:49 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