Benutzer mit den meisten Antworten
Dataset Update funktioniert nicht...

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.):
- Datei -> Neues Projekt... -> WindowsForms Anwendung
- Datenbank-Explorer -> [Verbindung hinzufügen...]
- Datenquelle: SQL-Server Compact 3.5
- Datenbank: [Erstellen...]
- "Test" / DE-DE / Unencrypted
- [OK] [OK]
- Datenbank-Explorer: RechtsKlick Tabellen -> Tabelle erstellen
- Name: Test
- Spaltenname: Eingabe
- [OK]
- Datenquellen: [Neue Datenquelle hinzufügen] -> [Datenbank] -> [Datenset]
- (Pfad)+Test.sdf
- (ins Projekt kopieren) [Weiter]
- (TestConnectionString) [Weiter]
- Haken in Tabellen
- Datenquellen: Test-Pulldown -> Details
- Test in Form1 gezogen, Textbox Eingabe wird angezeigt, Navigation wird angezeigt, Form1 enthält: TestDataSet, TestBindingSource, TestTableAdapter, TableAdapterManager, TestBindingNavigator.
- Debugging starten
- 4 Eingaben getätigt, geblättert, soweit in Ordnung
- 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
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
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
-
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 / CurrencyManagerfindest 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
-> Datenbankfindest 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) -
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
-
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 DataBindingnet_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) -
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
-
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 -
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)