Laden...

Datensatz prüfen mit Hilfe von LINQ, ob er schon in der Datenbank vorhanden ist

Erstellt von Julia23 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.657 Views
J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren
Datensatz prüfen mit Hilfe von LINQ, ob er schon in der Datenbank vorhanden ist

Hallo
Ich habe folgendes Problem.
Ich würde gerne abprüfen, ob mein Datensatz den ich per insert erstellen will
bereits existiert.(Visual Studio 2013, SQL Server 2008) Es könnte ja passieren, das mein Insert aus irgendeinem Fehler nicht ganz gelesen wird. Ausserdem rechne ich in meinem Code immer einen Tag zurück mithilfe einer Schleife.
Etwa so:


for (int j = -1; j < 5; j--)
            {

                dateTime = dateTime.AddDays(-1);

Und so müssen auch nur die Tage geprüft werden, die ich
noch nicht habe.

Meine Idee war das schon in der Entitätsklasse zu regeln.
Eigentlich will ich 3 Spalten miteinander vergleichen. Wenn die
Gleich sind, gibt es dublikate in meiner Datenbank.
Also so sieht die DB_Tabelle aus:
ID ProduktID Datum Zeitraum weitereSpalten…

Da es „group by ProduktID“ ist, darf es also keine zwei Zeilen
geben, in denen ProduktID Datum Zeitraum gleich sind.

Könnt Ihr mir hier weiterhelfen?

16.842 Beiträge seit 2008
vor 9 Jahren

Wenn Du solche starren Abhängigkeiten hast, dann solltest Du das über einen Key über beide Spalten umsetzen und nicht in der Logik.
Compound key

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

D.h ich müsste nur die drei Spalten in meinem SQL Management Studio anklicken und dann
einen Indizies/Schlüssel hinzufügen.

Sehe ich das richtig?

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

Also ich werde das jetzt mal so versuchen. hätte da nur eine Frage.
Wenn ich nun ienen Indizie erstelle und dann "ja" bei
"Tabellen-DesignerDoppelte Schlüssel ignorieren" wähle.

Dann würde ich ja nicht verhindern, dass das mein Program ja
immer versuchen würde die Daten in die DB zu speichern.
Das wäre doch aus Performancegründen schlecht oder?

Da es sich bei mir um eine sehr große Datenmenge handelt, wäre
das wichtig für mich.

Wenn ich "nein" auswähle was macht das Programm dann.
Kann ich dass dann in der Log-Datei einfach festhalten.
(ISt eine Konsolenanwendung) Dann wäre aber immernoch das Performance
Problem da...

16.842 Beiträge seit 2008
vor 9 Jahren

Sehe ich das richtig?

Nein. Les bitte den Artikel, den ich verlinkt habe und eigne Dir die Grundlagen dazu an.

Du willst eine Eindeutigkeit von 2 Spalten definieren; wieso willst Du dann 3 Spalten anklicken, um den Primary Key zu bilden? Damit hast 0 gewonnen.

Das wäre doch aus Performancegründen schlecht oder?

Ich kann mir beim besten willen nicht vorstellen, dass Du mit Datenmengen arbeitest, die hier irgendeine größere Relevanz zu Performance haben.
Dein Wissen scheint ja nicht soooo riesig bei Datenbanken zu sein, dass Du riesige komplexe Themen verwalten würdest 😃

Aber zum Thema:
Wenn Du sicher gehen willst, dass es diese beiden Eigenschaften niemals 2 mal gibt, dann muss es zwingend als Key umgesetzt sein.
Ansonsten könntest Du ganz schnell in eine Race-Condition wandern.
Nur weil Du in einem Query erkannt hast, dass zwei Spalten eben wie gewünscht nicht doppelt vor kommen heisst das noch lange nicht, dass ein anderes System in der Zwischenzeit etwas eingetragen hat.
Ergo kommst Du um einen entsprechenden Constraint mit einer passenden Fehlerbehandlung gar nicht drumrum.

Ich denke Dir würde es da gut tun, dass Du Dich 2-3 Tage wirklich sehr intensiv mit Datenbanken beschäftigst und nicht so einzelne Stücke hin und wieder behandelst.
Ist ein gut gemeinter Rat.

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

Ich will doch eben 3 Spalten miteinander vergleichen und die dürfen nicht gleich sein.
Zudem habe ich ja noch ein ID (also einen Primary Key) in meiner Tabelle.

T
314 Beiträge seit 2013
vor 9 Jahren

Warum machst Du dann nicht einfach ein Group By über alle 3 Spalten mit nem Having Count(*) > 0?

Unabhängig davon kannst Du es wie schon gesagt auch der Datenbank überlassen. Entweder über einen entsprechenden PK (den du jedoch ja schon hast).

Zumindstens bei MSSQL kannst Du aber auch einen Unqiue Index definieren, der dann auch entsprechend zum Fehler führt, wenn Du versucht eine gleiche Kombination einzufügen.

16.842 Beiträge seit 2008
vor 9 Jahren

Sorry, mit den 2 und 3 Spalten falsch gelesen.
Dann erstell einfach einen unique constraint (keinen key) über die 3 Spalten und fang die entsprechende Exception in der Anwendung ab, falls es eine Doppelung geben sollte.

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

Wie genau fange ich den Fehler aus der Datenbank dann ab?

if(?)
meineDB.SubmitChanges(meineTabelle);

ich muss das dann beim Submit-Vorgang machen oder?

16.842 Beiträge seit 2008
vor 9 Jahren

Na wie men eben Exceptions abfängt: try-catch.

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

Ich hätte es jetzt auch mit try und Catch gemacht.
Aber dann habe ich diesen Link gefunden:

http://stackoverflow.com/questions/4014482/how-to-enforce-unique-constraint-with-linq-to-sql

16.842 Beiträge seit 2008
vor 9 Jahren

ja und? dort steht doch: try-catch verwenden.

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

Naja anscheinend ist es ja der gängige Vorgang.

Ich denke mir nur warum sollte ich da überhaupt eine exception machen.
Warum sollte ich einen Fehler in meinem Code definieren, den ich ja eigentlich
verhindern will.

2.207 Beiträge seit 2011
vor 9 Jahren

Naja, du machst ja keine. Du fängst sie nur auf, falls eine fliegt. Das ist normale Fehlerbehandlung.

Gruss

Coffeebean

J
Julia23 Themenstarter:in
36 Beiträge seit 2015
vor 9 Jahren

Ok, dann werde ich das so umstetzen. Danke für eure Hilfe.