Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi doppelter eintrag in db vergleichen (https://www.delphipraxis.net/51218-doppelter-eintrag-db-vergleichen.html)

missi 8. Aug 2005 15:20

Datenbank: sql • Zugriff über: ADOTable o. ADOCommand

doppelter eintrag in db vergleichen
 
Hab leider bei meiner suche nichts passendes gefunden.
(könnte auch sein das ich falsch gesucht habe ;)

ich hab eine db auf einem sql-server
tabelle: auftrag
column: seriennummer (primarykey)

ich möchte nun eine seriennummer dort eintragen aber davor überprüfen ob dieser key schon vorhanden ist.

im vorraus vielen dank missi

Generalissimo 8. Aug 2005 15:36

Re: doppelter eintrag in db vergleichen
 
dann setz in der DB ein unique-key auf die seriennummer. Wenn die dann schon vergeben ist, gibt es ne Fehlermeldung die man abfangen kann

im übrigen würde ich dir empfehlen 2 Spalten zu machen:

ID int ->PrimaryKey
SerienNr nvarchar(60)

Der Grund ist folgender. Noch mag man in dem Programm Seriennummern vergeben wollen, die reine Zahlen sind. Jedoch kann sich das schnell ändern.

missi 8. Aug 2005 15:45

Re: doppelter eintrag in db vergleichen
 
hm unique-key?
:wiejetzt:

und das mit der seriennummer ist vorgegeben.

aber ich habe es nun wohl gefunden mit locate kann ich überprüfen ob der eintrag schon vorhanden ist oder nicht.
würde mich aber trotzdem interessieren was ein unique-key ist :)

thx nochmal

TeronG 8. Aug 2005 15:48

Re: doppelter eintrag in db vergleichen
 
unique :mrgreen:
und locate haste ja schon selber gefunden :-D

missi 8. Aug 2005 16:02

Re: doppelter eintrag in db vergleichen
 
so das der eintrag den funktionierenden source drin hat

Delphi-Quellcode:
  if fMain.TB1.Locate('Seriennummer', EdtSerial.Text, []) = False then
  begin
    fMain.DBCom.CommandText := 'INSERT INTO .....';
    fMain.DBCom.Execute;
  end
  else begin
  ShowMessage('Seriennummer ist schon vorhanden!');
  end;
danke nochmal an alle :)

Jelly 8. Aug 2005 16:27

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von missi
so das der eintrag den funktionierenden source drin hat

Das ist aber unschön, dein Code, da du nämlich überhaupt nicht garantierst, dass nur eine Seriennummer wirklich in der DB steht. Was, wenn man mit einem anderen Tool direkt in die DB-Tabelle geht, und dort doppelte Seriennummern einträgt.

Sorge auf Datenbankebene dafür, dass dies nicht passieren kann. Und dazu gibts die unique keys. Wurd ja auch schon in diesem Thread erwähnt, du scheinst das aber zu ignorieren.

Luckie 10. Aug 2005 12:33

Re: doppelter eintrag in db vergleichen
 
Es fehlt wohl an Verständnis, was mit einem Unique Key gemeint ist.

@missi: Du sollst in der Datenbank dieses Feld als 'eindeutig' markieren. Dann übernimmt der Datenbanktreiber, die Prüfung, ob der Wert schon mal in der Spalte existiert oder nicht.

shmia 10. Aug 2005 12:48

Re: doppelter eintrag in db vergleichen
 
Ich verwende in solche Fällen immer eine Query, die entweder einen oder keinen Datensatz zurückliefert.
Mit [TDataset].IsEmpty pürfe ich, ob schon ein Datensatz vorhanden ist.
Mit [TDataset].Append oder [TDataset].Edit füge ich einen neuen Datensatz an, oder verändere den bestehenden Datensatz.
Delphi-Quellcode:
   // dst ist eine Query mit SQL= SELECT * FROM Tabelle WHERE Serialnum=:Serialnum
   dst.close;
   dst.Parameters.ParamValues['Serialnum'] := sernr;
   dst.open;

   update := not dst.IsEmpty;

   if update then
   begin
       dst.Edit
       dst['Changecount'] := dst['Changecount'] +1;
   end
   else
   begin
       dst.Append;
       dst['Serailnum'] := sernr;
   end;

   dst['lastchange'] := now;
   dst['.....'] := ....
   dst.post;
Diese Vorgehensweise hat mehrere Vorteile:
* man braucht nicht mit INSERT und UPDATE Anweisungen zuschreiben, die manchmal 50 Parameter benötigen
* man hat Zugriff auf die alten Werte und kann damit arbeiten
kleiner Nachteil:
* es werden Daten abgefragt, die meistens gar nicht benötigt werden (aber nur ein Datensatz, macht ja nix)

missi 10. Aug 2005 13:16

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von Jelly
Sorge auf Datenbankebene dafür, dass dies nicht passieren kann. Und dazu gibts die unique keys. Wurd ja auch schon in diesem Thread erwähnt, du scheinst das aber zu ignorieren.

ne ignorieren tu ich dies nicht. nur wir lesen die chipid vom chip aus. ich denke nicht das sich irgendeiner die mühe macht die chips über unser tool auszulesen und dann sie von hand in die db schreibt BG

aber der tip ist in meinem hinterstübchen gespeichert und werde ich beim nächsten bearbeiten von der db realisieren ;)

lg ela

Jelly 10. Aug 2005 13:19

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von shmia
Diese Vorgehensweise hat mehrere Vorteile:
* man braucht nicht mit INSERT und UPDATE Anweisungen zuschreiben, die manchmal 50 Parameter benötigen

Wenn du 50 Felder hast, musst du auch so über deine Methode die einzelnen Felder füllen. Kürzer wird das nicht

Zitat:

Zitat von shmia
kleiner Nachteil:
* es werden Daten abgefragt, die meistens gar nicht benötigt werden (aber nur ein Datensatz, macht ja nix)

Das gilt aber nur bei einem
SQL-Code:
select * from...
Du musst doch aber nicht alle Felder einbeziehen. Statt dem * wählst du nur die du brauchst.

missi 10. Aug 2005 13:22

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von Luckie
Dann übernimmt der Datenbanktreiber, die Prüfung, ob der Wert schon mal in der Spalte existiert oder nicht.

crashed es dann nicht wenn ich versuche nen doppelten eindrag dann in die db zu speichern?

:wiejetzt:

Jelly 10. Aug 2005 13:32

Re: doppelter eintrag in db vergleichen
 
Ja, es löst eine Exception aus, die du in Delphi auswerten kannst und entprechend drauf reagieren kannst.

Treffnix 10. Aug 2005 13:32

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von missi
Zitat:

Zitat von Luckie
Dann übernimmt der Datenbanktreiber, die Prüfung, ob der Wert schon mal in der Spalte existiert oder nicht.

crashed es dann nicht wenn ich versuche nen doppelten eindrag dann in die db zu speichern?

:wiejetzt:

Jau. Aber soweit sollte es ja im Idealfall nicht kommen. Dazu baut man dann sowas wie shmia. Aber falls das aus irgendwelchen Gründen mal schiefgeht ist zumindest Datenbankseitig 100% sichergestellt, dass es keine Doubletten gibt.

//edit
*sing* wo sind all die roten Kästchen hin?.... */sing*

missi 10. Aug 2005 13:36

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von Jelly
Ja, es löst eine Exception aus, die du in Delphi auswerten kannst und entprechend drauf reagieren kannst.

das tu ich ja schon mit locate bevor ich es in die db schreibe *verwirrt ist*

warum sollte es besser sein erst in die db zu schreiben auf ne exception zu warten und dann sagen das sie bereits vorhanden ist?

ausserdem lesne wir ja den chip aus und wenn er in der db vorhanden ist springt er gleich zu diesem datensatz. also ist es unmöglich den chip zweimal darein zu schreiben. und ein chip hat eine eindeutige id.

shmia 10. Aug 2005 13:42

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von shmia
Diese Vorgehensweise hat mehrere Vorteile:
* man braucht nicht mit INSERT und UPDATE Anweisungen zuschreiben, die manchmal 50 Parameter benötigen

Wenn du 50 Felder hast, musst du auch so über deine Methode die einzelnen Felder füllen. Kürzer wird das nicht

Man braucht aber keine 50 Parameter hinschreiben, sondern kann bequem über die "Collection" TFields arbeiten.
Also kann man auch eine Schleife von 0 bis Fields.Count-1 durchlaufen, um die Felder zu füllen.
Da man die Daten über TField schreibt, kann man auch vom OnSetText profitieren.
Zitat:

Zitat von Jelly
Zitat:

Zitat von shmia
kleiner Nachteil:
* es werden Daten abgefragt, die meistens gar nicht benötigt werden (aber nur ein Datensatz, macht ja nix)

Das gilt aber nur bei einem
SQL-Code:
select * from...
Du musst doch aber nicht alle Felder einbeziehen. Statt dem * wählst du nur die du brauchst.

Es müssen alle Felder, die die Eigenschaft NOT NULL besitzen, in der Feldliste aufgeführt werden, da sonst das Einfügen nicht funktioniert. Diese Felder werden also auch dann gelesen, obwohl man diese nur zum einfügen braucht. (da würde ich mir aber nur Gedanken drum machen, wenn Tausende Datensätze eingefügt/updatet werden sollen)
Aber du hast recht, wenn es Felder gibt, die nicht befüllt werden, kann man sparen, indem man alle benötigten Felder bei SELECT auflistet.

Sharky 10. Aug 2005 16:30

Re: doppelter eintrag in db vergleichen
 
Zitat:

Zitat von missi
... das tu ich ja schon mit locate bevor ich es in die db schreibe *verwirrt ist*

Hai,

das alles entscheidende "Zauberwort" ist -> Multiuserfähigkeit.

Mit deiner Methode und auch der von shima wird nur gepüft ob es in diesem Moment noch keinen Datensatz mit der selben Seriennummer gibt. Es kann aber Clientseitig nie geprüft werden ob nicht 1 Taktzyklus nach eurer "Prüfung" von einem anderen User diese Seriennummer erfasst wurde.

Solch eine Prüfung kann nur vom DB-Server durchgeführt werden.

Darum legt man auf ein Feld deren Inhalt einmalig sein soll einen Unique Key. Wenn nun ein zweiter Datensatz mit dem selben Inhalt eingefügt werden soll wird vom DB-Server ein entsprechender Fehler erzeugt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 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