Problem mit der Update-Methode eines TableAdapters



  • Ich habe eine Tabelle welche über einen TableAdapter gefüllt und mit Update(DatSet/Table) die Daten gespeichert werden. Dazu erzeugt der TableAdapter ja die benötigten SQL-Befehle für die Insert, Delete und Update-Methoden. Anscheinend hat er aber die für die Update nicht richtig erzeugt; ich kann keine Änderungen an der Tabelle speichern (Meldung "Benötigt eine gültige Update-Methode"). Habe manuell den Assistenten durchlaufen lassen, welcher diese Abfragen erzeugen soll, das Projekt neu erstellt usw. aber es hilft nichts. Was kann ich tun? Kann ich den Update-Befehl irgendwie manuell zuweisen oder was braucht's da? Der SELECT wäre:

    SELECT     Nummer, Lied, Länge, [Nr.]
    FROM         TracksTable
    

    Vielen Dank



  • Mal nachgeschaut ob ein Update eingetragen ist ?



  • Nein, weiss nicht wie; wo finde ich die einzelnen Befehle? Wollte ich auch suchen aber kam da nur auf den Assistenten zum Erzeugen der Befehle.
    Habe gerade vorhin ein Erfolgserlebnis gehabt mit SQL Compact, da kann ich gar nichts grafisch erzeugen etc. und habe ein DataSet erfolgreich mit einer Datenbank verbunden und da hatte ich einen SQLCeCommandBuilder welcher die Befehle liefert und dem Adapter zuweisen kann; müsste schauen ob das beim "grossen" ebenfalls geht ich meinte aber auch die Eigenschaften für die einzelnen Befehle nicht gesehen zu haben (aber nicht 100% sicher)

    EDIT: Hab's soeben versucht, leider sind die Properties beim TableAdapter nicht vorhanden wie beim CETableAdapter.



  • Du kannst mal einen CommandBuilder nehmen, ihm den DataAdapter präsentieren und ihm den Update-Befehl erzeugen lassen (macht er automatisch aus dem Select-Befehl)



  • Ach wie bei SQLCE ja, das klappte aber nicht da ich einen TableAdapter habe.
    Habe nun gesehen die Delete und Update-Befehle sind leer geblieben. Eigenartig, sollte ja nicht sein? Versuchte aus einer anderen Tabelle zu rekonstruieren um ihn manuell hinzuzufügen ist aber etwas kompliziert 🙂
    Falls das jemand hinbekommen möchte, der Select-Befehl ist einfach

    SELECT     Nummer, Lied, Länge, [Nr_]
    FROM         TracksTable
    


  • Stell doch mal ein Beispielprojekt mit Datenbank ins Netz. So ist es doch einfach nur ein paar Krümel hinwerfen und auf ne Lösung hoffen.



  • Das ist eine gute Idee; ich dachte eben das Problem sei vielleicht bekannt. Habe noch eines bei dieser Gelegenheit; wie ich jeweils die zusammengehörigen Daten der beiden Tabellen laden kann (und nicht die ganze) habe ich hinbekommen, doch beim Löschen gibt es - wie man sich denken kann - das Problem dass zuerst alle Einträge der Tracks-Tabelle gelöscht werden müssen. Das ist noch was an dem ich herumhirnte!

    Das Projekt findet sich hier (inkl Datenbankdateien):

    http://rebenstudio-it.ch/CDArchiv.zip

    Ach ja; ist es normal dass ALTER INDEX ... REORGANIZE bei ExecuteNonQuery -1 zurück gibt; oder liegt das an den wenigen Daten dass es da nichts zu reorganisieren gibt?



  • Ich habe mal das Projekt runtergeladen ausgeführt und mit dem Debugger reingeschaut. Die Update-Methode fehlt tatsächlich in Deiner TracksTable. In der anderen Table sind die Befehle vorhanden. Ich würde die TracksTable im Designer neu einbinden oder zu der bestehenden die Update-Anweisung mit dem QueryBuilder nachtragen.



  • Es reicht wenn man im Designer die Updatemethode anlegt. Tabelle auswählen, Felder auswählen und fertig 🤡



  • So einfach geht das doch auch nicht? Der Update-Befehl der anderen Tabelle ist ja reichlich lang; so etwas habe ich nicht hinbekommen.



  • So, ich habe nun nochmal in das Projekt geschaut. Der Designer baut das nicht automatisch weil du einen zusammengesetzten Primkey in deiner tracks-Tabelle verwendest, über Nummer = id der cd und Lied = Name des Tracks. Ich würde vorschlagen dass du auch mit Surrogatschlüsseln in der tracks-Tabelle arbeitest, damit der Designer dir hilft:

    * Nummer - ist Fremdschlüssel zu cd.tab und nicht mehr Primkey
    * Lied - ist Name des Songs und ebenfalls nicht mehr primkey
    * Länge - bleibt
    * Nr_ - ist Position des Tracks auf der cd
    * idtrack - ist neuer Primkey, du müsstest diese am besten als Identity-Spalte umsetzen.

    dann fügt der Designer auch den update-Befehl ein. Du müsstest die idtrack erst auf Typ int setzen, manuell befüllen (ab 1 einfach durchnummerieren, bei den paar Zeilen einfach zu machen) und dann not null, primary key, identity.
    Wenn Du willst noch ein unique auf (Nummer,Nr_)
    Von der Modellierung her ist es keine 3NF mehr weil beispielsweise Lied jetzt von Nr_ und von idtrack abh. ist. Dafür hast du designer Support. Mußt du wissen.



  • Super, das habe ich mal versucht; danke. Nun kommt aber eine "Parallelitätsverletzung: der Update-Command hat sich auf 0 der 1 Datensätze ausgewirkt". Wahrscheinlich habe ich etwas falsch gemacht; aber idtrack ist jetzt Primary Key ohne Beziehung, und Nummer - Nummer die Beziehung zwischen den Tabellen.

    Beim Löschen habe ich noch ein Problem, weiss nicht ob das auch damit zusammen hängt:

    Die DELETE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung "FK_TracksTable_CDsTable". Der Konflikt trat in der "C:\DOKUMENTE UND EINSTELLUNGEN\OBRECHT ANDREAS\EIGENE DATEIEN\CDSDB.MDF"-Datenbank, Tabelle "dbo.TracksTable", column 'Nummer' auf.
    Die Anweisung wurde beendet.
    




  • Ich habe natürlich die Einträge der Tracks-Liste zuerst gelöscht (einen eigenen Löschen-Button über die BindingSource); aber ob der Aufruf des TableAdapter eine Rolle spielt, die Reihenfolge? Wie wird das i.A. gehandhabt dass die abhängigen Einträge mitgelöscht werden und keine solchen Fehler entstehen?



  • Ich bin nun weiter, nach langer Zeit: Einfügen, ändern und alles funktioniert soweit sofern alle Datensätze ins DataSet geladen werden. Nun habe ich ein paar gespeicherte Prozeduren in der Datenbank welche nach Suchkriterien oder die ersten 10 Einträge zurückgeben (FillByInterpret usw), da es ja nicht ganz der Sinn ist die ganze Datenbank zu laden (wenn sie sehr gross wird).
    Wenn man allerdings nur diese ausgesuchten Teile lädt und dann beginnt zu editieren oder neue Datensätze einzugeben gibt es ein Problem mit der Nummern-Spalte. Was kann ich dadenn nun tun?
    Das Projekt ist aktualisiert unter http://rebenstudio-it.ch/CDArchiv.zip zu finden (zum testen Speicherort der Datenbank korrekt angeben).

    Vielen Dank!


Log in to reply