none
Daten im Dataset ändern und gegn die Datenbank updaten RRS feed

  • Frage

  • Hallo,

    ich versuche mich gerade an den Grundlagen der Datenanbindung. Dazu habe ich ein kleines Testprogramm geschrieben, mit dem ich ein Datenfeld in einer Datatable ändere und versuche diese mit der verbundenen Datenbank zu übertragen.

    Die Datenbank ist eine Access-Datenbank (mdb).

    Hier ist mein Beispiel-Code. Er läuft in der Zeile Adapter.Update auf einen Fehler, den ich mir nicht erklären kann. Was ist daran falsch?

    Gruß

    Michael

    Sub edit()

       'ändern der Daten

       Dim
    dataSet AsDataSet= NewDataSet

       Dimconnection AsNewOleDbConnection

       connection.ConnectionString = My.Settings.Connection

       Dimadapter AsNewOleDbDataAdapter("select * from kunden", connection)

       adapter.Fill(dataSet, "Kunden")

       Me.DataGridView1.DataSource = dataSet.Tables("kunden")

       Dimr AsDataRo

       r = dataSet.Tables("kunden").Rows(0)

       r.BeginEdit()

       r!firma2 = "XXX"

       r.EndEdit()

       adapter.Update(Me.DataGridView1.DataSource)

    EndSub

    Sonntag, 9. März 2014 09:54

Antworten

  • Hallo Michael,

    erst mal würde ich entweder "Kunden" oder "kunden" schreiben, aber nicht beides gemischt.

    Ansonsten sieht der Code von Peter i.O. aus, außer das mir hier ein Open und Close fehlt, aber daran scheint es ja nicht zu liegen.

    Dein Fehler kommt sicherlich von einem falschen Update-Command. Du kannst Dir im Debugmode die einzelnen Command anschauen die der Commandbuilder erstellt hat. Vergleiche das Update-Command mit Deinem SQL-Update-Statement.

    Gruß Scotty

    Montag, 10. März 2014 11:59

Alle Antworten

  • Hallo Michael,

    auf den ersten Blick würde ich sage das es an der übergabe der DataSource des Grids liegt.

    Über gib da mal die Tabele wie z.B. hier im Beispiel. Sonst gib bitte noch den Fehler an den du bekommst.

    Als Hinweise noch.

    Bei VB kann es hilfreich sein die Optionen Expliziet und Strict auf on zu setzen.

    Wenn du ein neues Projekt startest ist der Datenzugriff über das EntetyFramework vielleicht ganz interessant.

    MFG

    Björn


    • Bearbeitet Palin Sonntag, 9. März 2014 10:24
    Sonntag, 9. März 2014 10:24
  • Hi Michael,
    in Deinem Code fehlt der CommandBuilder, der das UpdateCommand bereitstellt. Außerdem verträgt Update kein Objekt. Da solltest Du eine Typkonvertierung einbauen. Der Codeschnipsel funktioniert wie nachfolgend:

      Sub edit()
        'ändern der Daten
        Dim dataSet As DataSet = New DataSet
        Dim connection As New OleDbConnection
        connection.ConnectionString = My.Settings.Connection
        Dim adapter As New OleDbDataAdapter("select * from kunden", connection)
        Dim cb As New OleDbCommandBuilder(adapter)
        adapter.Fill(dataSet, "Kunden")
        Me.DataGridView1.DataSource = dataSet.Tables("kunden")
        Dim r As DataRow
        r = dataSet.Tables("kunden").Rows(0)
        r.BeginEdit()
        r!firma2 = "XXX"
        r.EndEdit()
        adapter.Update(CType(Me.DataGridView1.DataSource, DataTable))
      End Sub

    --
    Peter

    Sonntag, 9. März 2014 19:02
  • Hallo Peter,

    ich habe bereits viele Varianten dieses Codeschnipseln probiert. Auch den Ansatz von Björn, ich kriege es nicht zum Laufen. Ich erhalte immer folgende Fehlermeldung:

    "Ein Ausnahmefehler des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."

    Auch Dein Beispiel erzeugt diesen Fehler.

    In der Tabelle "Kunden" der Datenbank ist ein Primärschlüssel gesetzt, ich habe auch das Shema eingelesen, alles mit dem gleichen Ergebnis. Schreibe ich die Daten per SQL mit einem Update-Kommando, dann funktioniert es. Ich möchte mit dieser Übung aber gerade die enthaltenen Boardmittel für die Aktualisierung benutzen.

    Wo kann ich noch suchen oder gibt es ein einfaches Beispiel, an dem ich dem Fehler langsam auf die Spur kommen kann.

    Gruß

    Michael

    Sonntag, 9. März 2014 19:25
  • Hallo Michael,

    erst mal würde ich entweder "Kunden" oder "kunden" schreiben, aber nicht beides gemischt.

    Ansonsten sieht der Code von Peter i.O. aus, außer das mir hier ein Open und Close fehlt, aber daran scheint es ja nicht zu liegen.

    Dein Fehler kommt sicherlich von einem falschen Update-Command. Du kannst Dir im Debugmode die einzelnen Command anschauen die der Commandbuilder erstellt hat. Vergleiche das Update-Command mit Deinem SQL-Update-Statement.

    Gruß Scotty

    Montag, 10. März 2014 11:59
  • Hallo,

    ich habe das Problem dank dem Hinweis von Scotty lösten können. Dazu habe ich die Anweisung

    MsgBox(cb.GetUpdateCommand.CommandText)

    in den Code eingebaut und dadurch gesehen, das ein Datenfeld den Namen "KD-NR" hat. Da ist bei der manuellen Erstellung der Updateanweisung kein Problem, bei der automatischen wohl schon. Ich habe das Datenfeld umbenannt und schon funktioniert es. (eigentlich hatte ich das schon gemacht, aber da ist mir dieser "Fehler" nicht aufgefallen :))

    Danke an alle Beteiligten.

    Gruß
    Michael

    Dienstag, 11. März 2014 18:54
  • Hallo Michael,

    grundsätzlich solltest Du nur den Zeichenrat a-z, A_Z, 0-9 und _(Tiefstrich) benutzen. Andere Zeichen und Umlaute verursachen meist Probleme. Bspw. wird machst Du dann aus "Überschrift-1" "Ueberschrift_1".

    Gruß Scotty

    Mittwoch, 12. März 2014 13:08
  • Hi Karsten,
    wenn Du mit dem DataAdpter arbeitest, benötigst Du kein Open und Close der Verbindung. Der DataAdapter analysiert den Zustand, den er vorfindet. Wenn die Verbindung geschlossen ist, wird diese geöffnet und nach getaner Arbeiter wieder geschlossen. Damit wird ein effektives ConnectionPooling ohne zusätzlichen Programmieraufwand unterstützt.

    --
    Peter

    Montag, 17. März 2014 09:36