none
Dataset Update funktioniert nicht... RRS feed

  • Frage

  • Hallo VB-Profis,

    ich gebe (noch) nicht auf und versuche trotz immer noch fehlender Hilfe (siehe http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/321f97cb-70f9-443a-9b29-9b11ba4ed636/#8cf3caba-ea54-418c-986b-a03413936a79), einem eigentlich einfachen Fehler auf die Schliche zu kommen, der meiner Meinung nach eigentlich gar nicht sein dürfte... :( Oder?

    Das Problem ist folgendes: Ich versuche, eine Datenbank (die Tabelle darin natürlich) mit Werten aus einer Textbox zu ändern. Alle möglichen Versuche und Recherchen im Forum führten jedoch nicht zum gewünschten Erfolg.

    Also habe ich jetzt mal folgendes "Standardverfahren" probiert, mit dem gleichen Resultat wie in meinem eigenen Programm, nämlich einer "InvalidOperationException" (Ich führe jetzt JEDEN meiner Schritte im Detail auf, vielleicht verbirgt sich ja da schon irgendwo der Fehler? Wenn ich es nicht explizit angegeben habe, habe ich die vorgegebenen Standardwerte nicht verändert.):

    1. Datei -> Neues Projekt... -> WindowsForms Anwendung
    2. Datenbank-Explorer -> [Verbindung hinzufügen...]
    3. Datenquelle: SQL-Server Compact 3.5
    4. Datenbank: [Erstellen...]
    5. "Test" / DE-DE / Unencrypted
    6. [OK] [OK]
    7. Datenbank-Explorer: RechtsKlick Tabellen -> Tabelle erstellen
    8. Name: Test
    9. Spaltenname: Eingabe
    10. [OK]
    11. Datenquellen: [Neue Datenquelle hinzufügen] -> [Datenbank] -> [Datenset]
    12. (Pfad)+Test.sdf
    13. (ins Projekt kopieren) [Weiter]
    14. (TestConnectionString) [Weiter]
    15. Haken in Tabellen
    16. Datenquellen: Test-Pulldown -> Details
    17. Test in Form1 gezogen, Textbox Eingabe wird angezeigt, Navigation wird angezeigt, Form1 enthält: TestDataSet, TestBindingSource, TestTableAdapter, TableAdapterManager, TestBindingNavigator.
    18. Debugging starten
    19. 4 Eingaben getätigt, geblättert, soweit in Ordnung
    20. 2. Eingabe geändert -> [Speichern] -> ##### FEHLER!!!!!!! #####
    Private Sub TestBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TestBindingNavigatorSaveItem.Click
    	Me.Validate()
    	Me.TestBindingSource.EndEdit()
    '--- hier kommt nun der Fehler:
    	Me.TableAdapterManager.UpdateAll(Me.TestDataSet)
    End Sub
    
    

    Die markierte Zeile erzeugt:

    InvalidOperationException wurde nicht behandelt.

    Für ein Update ist ein gültiger UpdateCommand erforderlich, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird.

    Tja, und da ich keine Hilfe verfügbar habe und sämtlicher Code automatisch erzeugt wurde, wende ich mich an euch. Was muss ich jetzt tun?

    • Bearbeitet Keep Cool Man Sonntag, 29. August 2010 09:58 Korrektur
    Sonntag, 29. August 2010 09:56

Antworten

  • Aus Deiner Aufzählung ist nicht ersichtlich, wie Datenzeilen in der Datenbank identifiziert werden. Der Designer nutzt dafür die Primärschlüsselspalte. Wenn diese fehlt oder nicht richtig konfiguriert ist, dann wei�? der Designer nicht, wie er den für die Aktualisierung vorgesehenen Datensatz identifizieren soll. Er verzichtet in solchem Fall auf die automatische Möglichkeit der Aktualisierung und bringt besagten Fehler. Wenn Du dem Designer keine gültige Primärschlüsselspalte bietest, musst Du die Aktualisierungs-Command-Objekte selbst erstellen und zuweisen. Daqs ist etwas aufwändig.

    --
    Viele Gruesse
    Peter

     
    • Als Antwort markiert Keep Cool Man Sonntag, 29. August 2010 10:33
    Sonntag, 29. August 2010 10:20

Alle Antworten

  • Aus Deiner Aufzählung ist nicht ersichtlich, wie Datenzeilen in der Datenbank identifiziert werden. Der Designer nutzt dafür die Primärschlüsselspalte. Wenn diese fehlt oder nicht richtig konfiguriert ist, dann wei�? der Designer nicht, wie er den für die Aktualisierung vorgesehenen Datensatz identifizieren soll. Er verzichtet in solchem Fall auf die automatische Möglichkeit der Aktualisierung und bringt besagten Fehler. Wenn Du dem Designer keine gültige Primärschlüsselspalte bietest, musst Du die Aktualisierungs-Command-Objekte selbst erstellen und zuweisen. Daqs ist etwas aufwändig.

    --
    Viele Gruesse
    Peter

     
    • Als Antwort markiert Keep Cool Man Sonntag, 29. August 2010 10:33
    Sonntag, 29. August 2010 10:20
  • Danke Peter,

    genau das war, zumindest in dieser Standard-Anwendung, der Fehler: Kein Primärschlüssel vergeben.

    Ob das auch der Fehler in meinem Programm ist, werde ich jetzt prüfen, aber vermutlich ist das so...

    Gruß Thomas

    Sonntag, 29. August 2010 10:32
  • Hallo Thomas,

    genau das war, zumindest in dieser Standard-Anwendung,
    der Fehler: Kein Primärschlüssel vergeben.

    Peter Fleischer hat ja schon darauf hingewiesen, dass
    ein Datensatz in einer DB-Tabelle nur dann bearbeitet
    (geändert, gelöscht) werden kann, wenn er gegenüber
    allen anderen Datensätzen in dieser Tabelle eben eindeutig
    identifizierbar ist. Überlicherweise geschieht dies durch
    Felder, die über die gesamte Tabelle eindeutige Werte
    enthalten wie z.B. ein Primärschlüsselfeld.

    Ob das auch der Fehler in meinem Programm ist, werde
    ich jetzt prüfen, aber vermutlich ist das so...

    Ich würde Dir empfehlen, statt ein Datenprojekt einfach mehr
    oder weniger blind via Designer zusammenzuklicken, Dich
    erst mal mit einigen Grundlagen vertraut zu machen.
    Dazu gehört u.a. das Wissen um die strikte Trennung
    zwischen Datenbank und lokalen (clientseitigen) Objekten
    wie DataTable, DataView, DataSet, Relation, DataAdapter,
    DataReader und später auch komplexeren Objekten wie z.B.
    BindingSource usw.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGridView
            -> DataTable / DataView / CurrencyManager

    findest Du eine Reihe von Beispielen, welche die
    Funktionalität der o.g. (lokalen) Objekte demonstrieren
    und auch verdeutlichen, dass es letztlich egal ist, welche
    Art von Datenbank die Daten speichert, bzw. liefert, wenn
    sie erst mal beim Client sind.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Datenbank

    findest Du Beispiele, welche ohne vom Designer autom.
    generierten Code, via eigenem Code auf verschiedene
    Arten von Datenbanken zugreifen.

        www.gssg.de -> Visual Basic -> VB.net

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 30. August 2010 08:33
  • Vielen Dank für Deinen Hinweis, Peter!

    Habe Deine Beiträge schon mehrfach verfolgt und auch schon Deine HP besucht. Leider ist mein erster Versuch, ein Snippet herunterzuladen, gescheitert... Nicht das Runterladen, aber das benutzen. VS2010 hat sich strikt geweigert (in diesem Fall bei net_tbdatabinding).

    Aber ich habe ja noch Notepad++ :)

    Hat mir sehr geholfen! War bestimmt nicht das letzte Mal bei Dir.

    Das mit dem Designer "rumklicken" mache ich :) Auch wenn ich anfangs mehrmals neu anfangen musste :( Leider scheint VS2010 noch nicht so ganz bugfree zu sein. Hatte z.B. plötzlich einen "fehlenden" ConnenctionString, aus heiterem Himmel. Dann im autogenerierten Code rumgehackt  - naja, das war's dann :) Mittlerweile weiß ich aber, dass ich VS (auch bei dem eben genannten - passiert häufiger) nur neu starten brauche, dann ist alles wieder in Ordnung :))

    Übrigens, der fehlende Primärschlüssel war tatsächlich auch der Fehler in meinem Prog...

    Gruß Thomas

    Montag, 30. August 2010 19:35
  • Hallo Thomas,

    Habe Deine Beiträge schon mehrfach verfolgt und auch schon
    Deine HP besucht. Leider ist mein erster Versuch, ein Snippet
    herunterzuladen, gescheitert... Nicht das Runterladen, aber das
    benutzen. VS2010 hat sich strikt geweigert (in diesem Fall bei
    net_tbdatabinding).

    Ich habe soeben mal das originale, in

        www.gssg.de -> Visual Basic -> VB.net
            -> DataTable / DataView / CurrencyManager
                -> Textbox DataBinding

    net_tb_databinding.zip bereitgestellte Projekt TextBox_DataBinding
    in VB2010 geladen und fehlerfrei konvertiert. Beim Konvertieren gibt
    es lediglich eine Warunung, die darauf hinweist, dass das Projekt
    auf Framework 2.0 aufsetzt.
    Das Projekt lässt sich hier in VB2010 fehlerfrei kompilieren und
    ausführen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 31. August 2010 06:56
  • Hallo Peter,

    Hm, also bei mir wird die SLN und VBPROJ konvertiert, die anderen 11 Dateien werden nicht konvertiert, es gibt aber auch keinen Fehlerhinweis oder Warnung. Das Projekt ist natürlich somit nicht verfügbar. Im Explorer steht nur "TextBox_Databinding (nicht verfügbar) Das Projekt wurde entladen."

    Mein VS2010 scheint auf meiner Maschine aber ohnehin merkwürdiges Verhalten zu zeigen (siehe mein Hilfe-Problem). Sei's drum, wie gesagt, habe ja Notepad++ und kann mir den Code dort ansehen :)

    Aber vielleicht hast du eine schnelle Idee für ein anderes "merkwürdiges" Verhalten, was ich grade bei meinem Prog beobachte:

    Ich habe 2 Formulare, jedes mit einer DGV, gebunden an eine andere Tabelle im gleichen Dataset. Zusätzlich zur DGV gibt's Textboxen, identisch gebunden, in denen die Eingaben getätigt werden. In einem Formular werden die Eingaben nach Wechsel der Textbox in die DGV übernommen und sind sofort sichtbar. Im anderen Formular nicht, sondern erst, nachdem ich Speichern gedrückt habe. Nun bin ich der Meinung, ich habe beide DGV's und auch die Textboxen mit identischen Eigenschaften versehen, bzw. außer Aussehen gar keine Eigenschaften geändert, in der zweiten DGV allerdings die Reihenfolge der Spaltenanzeige. Da ich auch noch nicht viel weiteren Code hinzugefügt habe, konnte ich beides noch übersichtlich vergleichen, und habe auch dort keine Unterschiede festgestellt.

    Was könnte ich "aus Versehen" an der einen DGV (oder überhaupt an dem Formular) geändert haben, das es einmal funktioniert mit der sofortigen Anzeige und einmal nicht?

    Einen Unterschied gibt's doch: Im zweiten Formular sind die TextBoxen in einem TabControl. Da ich sie aber testweise schon mal rausgenommen habe (hätte ja sein können, das das TabControl das aus irgendwelchen Gründen verhindert) und es aber trotzdem nicht funktioniert, schließe ich das TabControl als Ursache mal aus...

    Gruß Thomas

    Dienstag, 31. August 2010 09:14
  •  

    Hm, also bei mir wird die SLN und VBPROJ konvertiert, die anderen 11 Dateien werden nicht konvertiert, es gibt aber auch keinen Fehlerhinweis oder Warnung. Das Projekt ist natürlich somit nicht verfügbar. Im Explorer steht nur "TextBox_Databinding (nicht verfügbar) Das Projekt wurde entladen."

    Da passen vermutlich die Pfade nicht -> nicht geladenes Projekt entfernen und neu vom richtigen Pfad hinzufügen.

    Ich habe 2 Formulare, jedes mit einer DGV, gebunden an eine andere Tabelle im gleichen Dataset.

    Ist das wirklich so? Mit dem designer geht das nicht. Da muss man selbst statische Verweise oder konkrete Verweisübergaben hinzuprogrammieren.

    Zusätzlich zur DGV gibt's Textboxen, identisch gebunden, in denen die Eingaben getätigt werden. In einem Formular werden die Eingaben nach Wechsel der Textbox in die DGV übernommen und sind sofort sichtbar. Im anderen Formular nicht, sondern erst, nachdem ich Speichern gedrückt habe. Nun bin ich der Meinung, ich habe beide DGV's und auch die Textboxen mit identischen Eigenschaften versehen, bzw. au�?er Aussehen gar keine Eigenschaften geändert, in der zweiten DGV allerdings die Reihenfolge der Spaltenanzeige. Da ich auch noch nicht viel weiteren Code hinzugefügt habe, konnte ich beides noch übersichtlich vergleichen, und habe auch dort keine Unterschiede festgestellt.

    Ein Unterschied kann sein, dass zwar an gleichnamige Bezeichner gebunden wurde, es sich aber um unterschiedliche Objekte handelt.

    Was könnte ich "aus Versehen" an der einen DGV (oder überhaupt an dem Formular) geändert haben, das es einmal funktioniert mit der sofortigen Anzeige und einmal nicht?

    Unterschiedliche Datenquellen-Objekte, ggf. mit gleichem Name und Typ und Struktur.

    Einen Unterschied gibt's doch: Im zweiten Formular sind die TextBoxen in einem TabControl. Da ich sie aber testweise schon mal rausgenommen habe (hätte ja sein können, das das TabControl das aus irgendwelchen Gründen verhindert) und es aber trotzdem nicht funktioniert, schlie�?e ich das TabControl als Ursache mal aus...

    Das TabControl kann das Verhalten bei Focusverlust beeinflussen. Erst bei Verlassen eines Steuerelementes werden die im Steuerelement gepufferten Daten in die Datenquelle geschrieben (aktulaisiert). Das kann man aber einfach prüfen, indem man nicht die TabPage verlässt, sondern nur erst einmal das gebundene Steuerelement.

    --
    Viele Gruesse
    Peter

    Dienstag, 31. August 2010 10:49
  • Hallo Thomas,

    Hm, also bei mir wird die SLN und VBPROJ konvertiert, die anderen
    11 Dateien werden nicht konvertiert, es gibt aber auch keinen
    Fehlerhinweis oder Warnung. Das Projekt ist natürlich somit nicht
    verfügbar. Im Explorer steht nur "TextBox_Databinding (nicht verfügbar)
    Das Projekt wurde entladen."

    Kann es sein, dass die zum Projekt gehörenden Dateien in
    unpassenden Verzeichnissen stehen?
    Womit hast Du die Datei net_tb_databinding.zip entpackt?
    Stellt Dein zum Entpacken verwendetes Programm auch die
    in der *.zip enthaltenen Ordnerstrukturen richtig her?

    Mein VS2010 scheint auf meiner Maschine aber ohnehin merkwürdiges
    Verhalten zu zeigen (siehe mein Hilfe-Problem). Sei's drum, wie gesagt,
    habe ja Notepad++ und kann mir den Code dort ansehen :)

    Aber vielleicht hast du eine schnelle Idee für ein anderes "merkwürdiges"
    Verhalten, was ich grade bei meinem Prog beobachte:

    Ich habe 2 Formulare, jedes mit einer DGV, gebunden an eine andere
    Tabelle im gleichen Dataset.

    Wie sieht diese Datenbindung in konkretem Code aus?

    Zusätzlich zur DGV gibt's Textboxen, identisch gebunden,
    in denen die Eingaben getätigt werden.

    Auch hier die Frage nach dem konkreten Code für die Datenbindung
    dieser Textboxen.

    In einem Formular werden die Eingaben nach Wechsel der Textbox
     in die DGV übernommen und sind sofort sichtbar.

    Was meinst Du mit "Wechsel der Textbox"?
    Ist damit gemeint, dass der Focus von der Eingabetextbox zu einer
    anderen Textbox oder einem sonstigen Control wechselt?
    Das alleine wäre noch kein Grund etwas zu speichern, dazu
    müsste z.B. in Textbox_Validating entsprechender Code stehen.

    Im anderen Formular nicht, sondern erst, nachdem ich Speichern
    gedrückt habe. Nun bin ich der Meinung, ich habe beide DGV's und
    auch die Textboxen mit identischen Eigenschaften versehen, bzw.
    außer Aussehen gar keine Eigenschaften geändert, in der zweiten
    DGV allerdings die Reihenfolge der Spaltenanzeige. Da ich auch
    noch nicht viel weiteren Code hinzugefügt habe, konnte ich beides
    noch übersichtlich vergleichen, und habe auch dort keine Unterschiede
    festgestellt.

    Da ich keine einzige Zeile Deines relevanten Codes kenne, kann ich
    natürlich noch viel weniger irgendetwas vergleichen resp. irgendwelche
    Unterschiede feststellen.


    Was könnte ich "aus Versehen" an der einen DGV (oder überhaupt an
     dem Formular) geändert haben, das es einmal funktioniert mit der
    sofortigen Anzeige und einmal nicht?

    Ohne Kenntnis Deines relevanten Codes kann ich dazu beim
    besten Willen nichts sagen.
    Ich vermute mal, Du bist "Opfer" des vom Designer autom. generierten
    Codes geworden und weisst nicht, was dieser Code überhaupt macht,
    bzw. machen soll.


    Einen Unterschied gibt's doch: Im zweiten Formular sind die TextBoxen
    in einem TabControl.

    Mit dem TabControl kann sich das Verhalten der Textboxen beim Focusverlust
    ändern. Aber auch hier kann ich ohne Kenntnis Deines relevanten Codes
    nichts Konkretes sagen.

    Da ich sie aber testweise schon mal rausgenommen
    habe (hätte ja sein können, das das TabControl das aus irgendwelchen
    Gründen verhindert) und es aber trotzdem nicht funktioniert, schließe ich
    das TabControl als Ursache mal aus...

    Wie schon erwähnt, vermute ich, dass Du Deine Form inkl. Datenbindung
    Deiner Textboxen u. sonstigen Controls via Designer zusammengeklickt
    hast und dabei ist vermutlich einiges schief gelaufen. Binde Deine Controls
    via selbst geschriebenem Code an die jeweils gewünschten Datenquellen.
    Du bekommst so deutlich einfacheren und übersichtlicheren Code und weisst
    dann auch, was dieser Code macht.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 31. August 2010 15:36