Laden...

Auto_Increment in DataGridView zählt weiter obwohl kein Datensatz erstellt wurde

Erstellt von MChief vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.578 Views
M
MChief Themenstarter:in
11 Beiträge seit 2009
vor 15 Jahren
Auto_Increment in DataGridView zählt weiter obwohl kein Datensatz erstellt wurde

Guten Tag,

bin noch ziemlich unerfahren in C# mit Visual Studio 2005.
Bin im Moment dabei ein Lizenzveraltungsprogramm zu erstellen.
Im Hintergrund läuft ein SQL Server, in dem die nötigen Tabellen stehen.
Jede Tabelle hat einen Primärschlüssel, der unveränderbar ist und automatisch hochzählt.
Ich habe über die Datenquellen Ansicht eine Tabelle in eine Windows Form eingefügt.
Es wurde automatisch eine Tabelle und eine Leiste erstellt.

Nun mein Problem:
In der Tabelle steht ein Probedatensatz.
Wenn ich nun einen neuen Datensatz erstellen will, zählt der PS automatisch hoch.
So ist alles ok. Aber wenn ich den Datensatz verlasse (nicht erstellt!) und wieder einen neuen erstellen will, ist der PS wieder eins höher (also statt 2 eine 3) obwohl ich ja keinen mit der 2 erstellt habe. Dies geht immer so weiter.

Bilder dazu im Anhang

Wie bekomme ich es hin, dass er immer wieder beim kleinsten nicht benutzten Wert anfängt?

Gruß
MChief

1.200 Beiträge seit 2007
vor 15 Jahren

Du arbeitest wohl mit DataSets/DataTables, oder?

Ruf beim Verlassen ohne zu Speichern für die entsprechende DataRow mal die RejectChanges Methode auf. Wenn das nicht funktioniert, musst du wohl manuell den Start zurücksetzen.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

M
MChief Themenstarter:in
11 Beiträge seit 2009
vor 15 Jahren

Dnake werde ich gleich mal ausprobieren.
Hier noch das zweite Bild, da ja [ img ] nicht gewollt ist^^

G
131 Beiträge seit 2005
vor 15 Jahren

hi,

das verhalten ist eigentlich schon so korrekt. wird ein autoincrement schlüssel von der db abgerufen, steht dieser nie wieder zur verfügung. dabei ist es egal, ob er verwendet wird oder ob der eintrag nicht gespeichert wird. das muss so sein. stell dir mal vor, mehrere benutzer legen gleichzeitig ein datensatz an. würden alle die 2 bekommen, gewinnt am ende der, welcher als erstes speichert. das darf ja nicht sein. ist ne sicherheitsfunktion.

was hier noch nicht richtig läuft, ist das feedback der db. stelle mal in deinem dataset das autoincrement auf negative werte. diese werden dann bei einem speichern in der db (update mittels dbadapter) automatisch richtig vergeben.

M
MChief Themenstarter:in
11 Beiträge seit 2009
vor 15 Jahren

hmm also das habe ich mir aus Google Ergebnissen zusammengebastellt:

LizenzverwaltungDataSetErweiterung ds = new LizenzverwaltungDataSetErweiterung();
            ds.RejectChanges();

Lizenzverwaltung = Datenbank
Erweiterung = Tabelle

habe diesen Code nun nacheinander in RowLeave, RowRemoved und Zurücksetzen_Click(Button) eingesetzt, aber das einzige was sich ändert ist, dass er aus der zweiten Zeile in die Erste springt.

Mache ich etwas falsch?

Gruß
MChief

edit: habe den neuen Post gesehen und werde dies auch mal testen.

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Du kannst mal gucken, obde mit "Datenbank in 10 Minuten" auf Movie-Tuts klarkommst.

Was Generalissimo sagt, wundert mich - nach meiner Erfahrung geht das Updaten per dbAdapter nur bei client-seitiger Primkey-Generierung problemlos.
Aber werdich nochmal ausprobieren.

Der frühe Apfel fängt den Wurm.

M
MChief Themenstarter:in
11 Beiträge seit 2009
vor 15 Jahren

Danke erstmal für alle Antworten

Problem ist dank ErfinderDesRades denk ich mal gelöst. Habe mir das Tutorial angeguckt und da wird genau mein Problem behandelt. Muss es noch bei meinem Projekt ausprobieren.

Gebe dann Bescheid, ob das Thema geschlossen werden kann.

Gruß MChief

M
MChief Themenstarter:in
11 Beiträge seit 2009
vor 15 Jahren

So hab es nach dem Tutorial gemacht (war nicht so einfach, da es da in VB gemacht wird^^)
Nun habe ich in der DataSet.cs ein Event "Initialised" mit

private void LizenzverwaltungDataSetComputer_Initialized(object sender, System.EventArgs e)
        {
            this.Computer_Verwaltung.NummerColumn.AutoIncrement = true;
        }

NummerColumn ist mein PS
in der SQL Datenbank ist auto_increment ausgeschaltet und im Programm auch. Es sollte damit wieder aktiviert werden, wenn die Daten geladen werden.
Dies ist aber nicht der Fall. Ich bekomme nicht wie vorher eine Zahl vorgegeben, sondern kann sogar selber eine festlegen, was aber nicht Sinn der Sache ist.

Werde noch etwas rumprobieren, aber es ist genau wie im Tutorial, nur es geht nicht...

Gruß
MChief

Edit: Habe gerade mal das fertige Projekt von dem Tutorial ausgeführt und die haben den gleichen Fehler, wie ich die ganze Zeit.... Also hat das nix gebracht. Alles umsonst.

M
MChief Themenstarter:in
11 Beiträge seit 2009
vor 15 Jahren

Ok, habe das Problem halbwegs gelöst.
Es wird zwar immernoch hochgezählt, ohne dass ein Datensatz erstellt wurde,
aber es wird richtig in der Datenbank gespeichert!!!!
Habe nun die Nummer Spalte unsichtbar gemacht.
Und nun sieht es für den Anwender aus es würde alles funktionieren.

Also falls keiner noch ein richtige Lösung hat, kann das Thema geschlossen werden.

Gruß
MChief

5.299 Beiträge seit 2008
vor 15 Jahren

Äh, das ist die richtige Lösung, jedenfalls eine mögliche, nämlich eine mit clientseitiger Primkey-Generierung.
Natürlich werden die Schlüsselspalten vorm Anwender verborgen, das sind Datenverarbeitungs-Interna, die ihn nix angehen, wo er nur Blödsinn mit machen könnte.
Anforderung an eine Primkey-Generierung ist nicht, dass fortlaufende Nummern erzeugt werden, sondern nur, daß sich die Nummern nicht wiederholen.
Für Multiuser-Datenbanken müsste man dann System.Guid als Datentyp der Schlüsselspalten nehmen, jedenfalls bei clientseitiger Primkey-Generierung.

Der frühe Apfel fängt den Wurm.