Benutzer mit den meisten Antworten
Hantieren mit dem DataGrid Autoincrement

Frage
-
Guten Tag liebe Forengemeinde,
vorab: ich bin relativ neu in dem Segment C# und Visual Studio 2010. Und erbitte somit um Antworten die leicht verständlicherklärt sind :)
Mein Problem ist das ich die Eigenschaft AutoIncrementSeed und AutoIncrementStep meiner Konfiguration anpassen möchte. (Es handelt sich um das Feld ID in einem DataGrid). Leider besitze ich nicht das wissen wie das geht. Da wenn ich versuche mir diese zu manipulieren (AutoIncrementSeed = größte ID in der DB +1) (AutoIncrementStep = 1 zum Raufzählen), das gesamte Formular auf einmal mit wahnwitzigen Fehlermeldungen um die ecke kommt.
Dies und jenes Feld sei plötzlich nicht mehr definiert, ganz skurios oder vllt. auch angebracht nur wie gesagt ich weiß es leider alles noch nicht.
Meine Frage lautet somit: Wie bekomme ich es hin das ich nicht wie üblich im DataGrid in einem Feld -1 als Startwert sehe und dieser immer um einen reduziert wird sondern, das der Startwert die größte ID aus der Datenbank +1 ist und dieser beim anlegen neuer Datensätze im DataGrid auch raufgezählt wird?
Mfg
Cogeck
- Verschoben Robert BreitenhoferModerator Mittwoch, 14. März 2012 09:40 Visual C# (aus:Visual Studio)
Antworten
-
Hallo,
Du solltest erst gar nicht versuchen, den Autoincrement Wert dem der Datenbank anzupassen.
Denn in einem Mehrbenutzer-Umfeld kann sich der Wert zwischenzeitlich ändern und passt dann nicht mehr.Günstiger ist vielmehr mit einem negativen Autoincrement zu starten;
damit sind neue Datenzeilen leicht zu identifizieren
und überschneiden sich i. a. nicht mit bereits vergebenen Werten.Die DataAdapter können beim Speichern entsprechend konfiguriert werden,
dass sie den von der Datenbank übergebenen Wert beim Speichern übernehmen.
Siehe dazu: Abrufen von Identitäts- oder AutoWert-Werten (ADO.NET)Gruß Elmar
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Freitag, 16. März 2012 14:43
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. März 2012 10:40
-
Du solltest nochmals genauer durchdenken, wie mit dem Autowert umzugehen ist. Üblicherweise wird der Autowert intern als Datensatzidentifikation genutzt und hat den Anwender nicht zu interessieren. Deshalb ist er auch nicht anzuzeigen und der Wert in einem konkreten Datensatz ist für den Anwender ohne Bedeutung. Deshalb sind auch negative Autowerte kein Problem.Falls es doch erforderlich ist, dass der Anwender den automatisch in der Anwendung vergebenen Wert sehen muss, dann kann ein beliebiger Startwert genutzt werden. Das funktioniert solange gut, solange dieser beliebige Wert nicht für Beziehungen z.B. zu anderen Datensätzen genutzt wird.Beim Speichern neuer Datensätze vergibt der Datenbankserver selbständig eigene Werte, die von den im Programm erzeugten Werten abweichen können. Das ist insbesondere in Mehrnutzerumgebungen der übliche Fall. Erst nach dem Hinzufügen des Datensatzes im Datenbankserver (INSERT) steht auch der endgültige Wert fest. Dieser kann sofort nach den Hinzufügen zurückgelesen werden und ist damit im Programm bekannt und kann z.B. für Fremdschlüsselbezüge genutzt werden.Damit es aber bereits vor dem Speichern möglich ist, den Autowert zweifelsfrei zu nutzen, muss im Programm ein Wert generiert werden, der nicht in Konflikt mit anderen Werten, z.B. in Fremdschüsselfeldern in anderen Tabellen im Datenbankserver steht. Das wird mit negativen Autowerten gewährleistet. Diese sind nur im konkreten Client-Programm bekannt und werden beim Abspeichern im Datenbankserver durch die endgültigen Werte ersetzt. Im Prozess des Rücklesens können beispielsweise über kaskadiertes Aktualisieren die Fremdschlüsselwerte zweifelsfrei aktualisiert werden.Was Dein konkretes Problem betrifft, vermute ich, dass Du mit dem Designer arbeitest und bei jedem Erzeugen und Aktualisieren die Konfiguration der Autowerteinstellungen auf negative Werte zurückgesetzt wird.--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Robert BreitenhoferModerator Freitag, 16. März 2012 14:43
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. März 2012 10:40
Alle Antworten
-
private void AddAutoIncrementColumn() { DataColumn column = new DataColumn(); column.DataType = System.Type.GetType("System.Int32"); column.AutoIncrement = true; column.AutoIncrementSeed = 1000; column.AutoIncrementStep = 10; // Add the column to a new DataTable. DataTable table = new DataTable("table"); table.Columns.Add(column); }
Damit erstellst du den AutoIncrement. Die größte ID in der DB ermittelst du entweder per Abrage an die Datenbank, oder wenn du die Tabelle schon lokal hast mit:
int x = DataTable.Compute("Max(Spalte"),null)
Wenn der Fehler auch mit dem Code oben besteht, einfach mal posten vielleicht kann ich dir sagen woran es liegt.Mit freundlichen Grüßen,
Niko Mix
- Bearbeitet Niko Mix Mittwoch, 14. März 2012 09:38
-
Hallo,
Du solltest erst gar nicht versuchen, den Autoincrement Wert dem der Datenbank anzupassen.
Denn in einem Mehrbenutzer-Umfeld kann sich der Wert zwischenzeitlich ändern und passt dann nicht mehr.Günstiger ist vielmehr mit einem negativen Autoincrement zu starten;
damit sind neue Datenzeilen leicht zu identifizieren
und überschneiden sich i. a. nicht mit bereits vergebenen Werten.Die DataAdapter können beim Speichern entsprechend konfiguriert werden,
dass sie den von der Datenbank übergebenen Wert beim Speichern übernehmen.
Siehe dazu: Abrufen von Identitäts- oder AutoWert-Werten (ADO.NET)Gruß Elmar
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Freitag, 16. März 2012 14:43
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. März 2012 10:40
-
Erstmal danke für die schnelle Hilfe. :)
Ich habe die Ursache für die skuriosen leider Fehler nicht gefunden, obwohl ich den selben Lösungsansatz wie Nico hatte.
Diesmal habe ich die Zeilen Code nur ans Ende der Prozedur getan und, auf einmal funktionierte es.
Das mit dem nächsten Autoiuncrementwert Anzeigen funktioniert einwandfrei :)
Doch ich muss zugeben, im Multiuserbetrieb ist das ein echtes Problem! Zum Glück handelt es sich fürs erste nur um das Anzeigen da das Speichern und Setzen der Werte von anderen Sachen übernommen wird.Die ich nicht kenne, es scheint so als setze die Datenbank die Autoincrementwerte, ist ja auch kein Problem und kann weiter so bestehen.
Was ich mich aber nun Frage ist, wie ich es hinbekomme die Anzeige des Incrementwerts so zu gestalten das wenn ein andere zu gleichen Zeit einen Datensatz in die Tabelle beim Bearbeiten des DataGrids hinzugefügt hat, das ich das auch mitbekomme?
Um zu wissen welchen Datensatz ich gerade (numerisch) bearbeite? Denn in dem DataGrid befindet sich ein weiteres Feld wo man die Id, von vorherigen Datensätzen eingeben kann, um so Beziehungen herstellen zu können. Das aktualisieren der tatsächlichen Id ist somit unumgänglich.
-
Das kannst du entweder per Insert Trigger lösen, welcher überprüft ob die ID schon existiert oder noch einfacher du gibst beim Insert nicht, die ID mit an. Dann wird die Datenbank ihren eigenen Increment Counter verwenden. So besteht zwar ein unterschied zwischen der Lokalen ID und der ID die später auf der Datenbank ist. Welches sich aber nach einem neuen Abruf der Daten gelöst hätte.
-
Du solltest nochmals genauer durchdenken, wie mit dem Autowert umzugehen ist. Üblicherweise wird der Autowert intern als Datensatzidentifikation genutzt und hat den Anwender nicht zu interessieren. Deshalb ist er auch nicht anzuzeigen und der Wert in einem konkreten Datensatz ist für den Anwender ohne Bedeutung. Deshalb sind auch negative Autowerte kein Problem.Falls es doch erforderlich ist, dass der Anwender den automatisch in der Anwendung vergebenen Wert sehen muss, dann kann ein beliebiger Startwert genutzt werden. Das funktioniert solange gut, solange dieser beliebige Wert nicht für Beziehungen z.B. zu anderen Datensätzen genutzt wird.Beim Speichern neuer Datensätze vergibt der Datenbankserver selbständig eigene Werte, die von den im Programm erzeugten Werten abweichen können. Das ist insbesondere in Mehrnutzerumgebungen der übliche Fall. Erst nach dem Hinzufügen des Datensatzes im Datenbankserver (INSERT) steht auch der endgültige Wert fest. Dieser kann sofort nach den Hinzufügen zurückgelesen werden und ist damit im Programm bekannt und kann z.B. für Fremdschlüsselbezüge genutzt werden.Damit es aber bereits vor dem Speichern möglich ist, den Autowert zweifelsfrei zu nutzen, muss im Programm ein Wert generiert werden, der nicht in Konflikt mit anderen Werten, z.B. in Fremdschüsselfeldern in anderen Tabellen im Datenbankserver steht. Das wird mit negativen Autowerten gewährleistet. Diese sind nur im konkreten Client-Programm bekannt und werden beim Abspeichern im Datenbankserver durch die endgültigen Werte ersetzt. Im Prozess des Rücklesens können beispielsweise über kaskadiertes Aktualisieren die Fremdschlüsselwerte zweifelsfrei aktualisiert werden.Was Dein konkretes Problem betrifft, vermute ich, dass Du mit dem Designer arbeitest und bei jedem Erzeugen und Aktualisieren die Konfiguration der Autowerteinstellungen auf negative Werte zurückgesetzt wird.--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Robert BreitenhoferModerator Freitag, 16. März 2012 14:43
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. März 2012 10:40
-
Hallo Cogeck,
Haben Dir die Antworten geholfen?
Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Erstmal endschuldige ich mich dafür das ich mich erst jetzt melde, aber ich habe Donnerstags und Freitags Berufsschultag -.-
So, die Antworten sind erstmal so gesehen 1A.
Ich werde heute die genauen Anforderungen noch einmal ermitteln, da so wie es aussieht die Lösung nich gewollt ist.
Ich werde mich melden.
mfg und danke bis hier hin
Dennis
-
Hallo Cogeck,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.