Autor Beitrag
jattle
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 05.08.09 11:38 
Hallo,

ich hab leider auch ein Problem und schon gestern und heute im Internet auf der Suche nach einer Lösung verbracht. Ich programmiere mit C# und möchte eine Datenbank vom SQLServer im DataGridView anzeigen lassen. Soweit funktioniert das auch. Allerdings möchte ich nun auch das Update der Datenbank durchführen lassen und da streiks und ich komm nicht mehr weiter.
Drück ich auf den Button, der dann das Update durchführen soll kommt die Meldung "Aktualisieren erfordert einen gültigen UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird." Nungut, aber wo kann ich das UpdateCommand angeben. Ich habe gelesen, dass er das normalerweise selbst erstellen kann oder man kann einen Wizzard benutzen um es zu erstellen, beides find ich aber nicht.
Mein Code sieht momentan so aus, dass ich mit dem Wizzard vom DataGridView die Datenbank als Quelle angegeben habe. Danach habe ich 3 neue Elemente gehabt und zwar "planungstoolDataSet1", "gVARTSTATKBindingSource" und "gVARTSTATKTableAdapter". Im Code wird beim Laden folgende Zeile aufgerufen:

ausblenden C#-Quelltext
1:
gVARTSTATKTableAdapter.Fill(planungstoolDataSet1.GVARTSTATK);					


Nun wenn ich das Update mit dem Button machen will ruf ich folgende Zeilen auf:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private void testbutton_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.gVARTSTATKBindingSource.EndEdit();
            this.gVARTSTATKTableAdapter.Update(this.planungstoolDataSet1.GVARTSTATK);
        }


Und dann kommt wie beschrieben die Meldung und das Debuggen wird unterbrochen. Kann mir jemand helfen ? Jemand eine Idee ?
Grüße
Jens


Zuletzt bearbeitet von jattle am Mi 05.08.09 14:43, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 05.08.09 12:17 
Hallo Jens und :welcome:

Für das beschriebene Problem fehlen eine Reihe von Fakten. Das Hauptproblem dürfte am ungeeigneten SELECT-Befehl liegen. Der DbDataAdapter kann i.V.m. DbCommandBuilder aus einem SELECT-Befehl (d.h. dem SelectCommand) die benötigten Befehle zum Speichern, also InsertCommand, UpdateCommand, DeleteCommand automatisch erstellen (wie du es auch schreibst), aber nur dann, wenn Bedingungen erfüllt sind:
  1. Der SELECT muss sich auf genau eine Tabelle der Datenbank beziehen. JOINs u.ä. sind unzulässig.
  2. Die DB-Tabelle und die DataTable müssen einen PrimaryKey (PK) enthalten.
  3. Der SELECT muss die Spalte(n) enthalten, die dem PK entsprechen.

Dies liegt daran, dass beim Update durch eine passende WHERE-Bedingung der zu ändernde Datensatz eindeutig identifiziert werden muss.

Wenn eine der Bedingungen nicht erfüllt ist, kannst du nur versuchen, mit einem manuell festgelegten UpdateCommand zu arbeiten. Besser ist es aber, die Struktur von DataSet usw. an diese Bedingungen anzupassen.

Zur weiteren Untersuchung des Problems brauchen wir Informationen, die sich auf meine Hinweise beziehen. Da du mit TableAdapter arbeitest, musst du (leider) auch das Datenmonster in der Designer.cs durchsuchen.

Gruß Jürgen

PS. Bitte zeichne deinen Code als solchen aus, das liest sich erheblich besser: Markiere den Text, wähle unter "Bereiche" das C# und aktiviere es mit dem Plus-Button. Das kannst du auch nachträglich erledigen mit dem Schere-Button.
jattle Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 05.08.09 14:54 
Hallo,

danke für das herzliche Willkommen !
Ich werde versuchen die ganzen Daten hier aufzulisten.
- Also die Tabelle hat einen kombinierten Primärschlüssel, der aus 4 Spalten (JAHR, MONAT, KKAT, ARTIKEL, KUNDE) besteht. Diese Spalten werden alle per SELECT geholt. Der SELECT-Befehl sieht so aus:
SELECT JAHR, MONAT, VL, VLBEZ, BL, BLBEZ, KKAT, ARTIKEL, AGRP, AGRPBEZ, AUGRP, AUGRPBEZ, UMSKUM, UMSMON, WEKUM, WEMON, DB1KUM, DB1MON, DB1PKUM, DB1PMON, UMSKVJ, UMSMVJ, WEKVJ, WEMVJ, DB1KVJ, DB1MVJ, DB1PKVJ, DB1PMVJ, PRIORGRP, KDNR, KDBEZ, ZLV, ZLVBEZ, KAM, KAMBEZ, REGION, REGIONBEZ, PRODGRP, PRODGRPBEZ, MONMENG, KUMMENG, MONPREK, MONSEK, MONPRGK, MONPRSU, JAHPREK, JAHSEK, JAHPRGK, JAHPRSU, EINRUECK, ARTNR, STATUS, KUNDE, ME_KOMP, ABS_I_PAL, ABS_I_VKE, ABSJANEIN, WARVER, DBP, DBPPROZ, UMVEPRUME, PRODMASCH, UMSLJ_PL, DB1LJ_PL, ABSST_PL, VKST_PL, MEST_PL, ME_PL, DB1PR_PL, PRODKST_PL, DBP_PL, DBPPR_PL, STATUS_PL, AUSSOR_PL, NEUART, ART_TYP, PAL_GR, ANZ_PRU, VK_ME, PRKPU_PL, AKTION, LISTUNG, ABS_I_PVJ, ABS_I_VVJ, DBPVJ, DBPPVJ, ERZ, LVKPR, SORTIERUNG, WAEHR, SAVABSST, SAVVKSTPL, SAVMESTPL FROM dbo.GVARTSTATK sagt der Wizzard. Es sind also alle Spalten enthalten.

Die Bedingungen sind also erfüllt.

Falls es eine Möglichkeit gibt das einfacher mit dem SqlConnection, SqlDataAdapter etc... zu machen wäre ich auch offen. Ich hatte dies auch versucht, allerdings habe ich da nicht mal die Tabelle ohne Update zum laufen gebracht. Daher hab ich mich für den Wizzard-Weg des DataGridView entschieden.

Grüße
Jens
jattle Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 10.08.09 08:18 
Leider bin ich bisher immernoch nicht weiter gekommen. Braucht ihr noch irgendwelche Daten oder habt ihr ne Idee ?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 10.08.09 18:17 
Erstelle mal explizit einen SqlDataAdapter und einen zugehörigen SqlCommandBuilder. Vielleicht gibt es so eine aussagekräftigere Exception, warum kein Update-Statement generiert wird.

_________________
>λ=