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
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!
Dnake werde ich gleich mal ausprobieren.
Hier noch das zweite Bild, da ja [ img ] nicht gewollt ist^^
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.
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.
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.
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
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.
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
Ä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.