![]() |
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 |
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. |
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 |
Re: doppelter eintrag in db vergleichen
|
Re: doppelter eintrag in db vergleichen
so das der eintrag den funktionierenden source drin hat
Delphi-Quellcode:
danke nochmal an alle :)
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; |
Re: doppelter eintrag in db vergleichen
Zitat:
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. |
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. |
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:
Diese Vorgehensweise hat mehrere Vorteile:
// 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; * 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) |
Re: doppelter eintrag in db vergleichen
Zitat:
aber der tip ist in meinem hinterstübchen gespeichert und werde ich beim nächsten bearbeiten von der db realisieren ;) lg ela |
Re: doppelter eintrag in db vergleichen
Zitat:
Zitat:
SQL-Code:
Du musst doch aber nicht alle Felder einbeziehen. Statt dem * wählst du nur die du brauchst.
select * from...
|
Re: doppelter eintrag in db vergleichen
Zitat:
:wiejetzt: |
Re: doppelter eintrag in db vergleichen
Ja, es löst eine Exception aus, die du in Delphi auswerten kannst und entprechend drauf reagieren kannst.
|
Re: doppelter eintrag in db vergleichen
Zitat:
//edit *sing* wo sind all die roten Kästchen hin?.... */sing* |
Re: doppelter eintrag in db vergleichen
Zitat:
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. |
Re: doppelter eintrag in db vergleichen
Zitat:
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:
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. |
Re: doppelter eintrag in db vergleichen
Zitat:
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 19:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz