Update in einer anderen Form durchführen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von diylab.

    Update in einer anderen Form durchführen

    Hallo

    Visual Basic:
    Ich möchte in Form1 Daten eingeben über einen Button Form2 anzeigen und zu der in Form1 eingegeben Daten, neue Daten hinzufügen(updaten)

    z.B eine Accessdatenbank mit 4 Datenfeldern(Seriennummer,Name,Alter,Führerschein), nun soll in Form1 Seriennummer(Primärschlüssel) und Name eingegeben und in Form 2 zu der Seriennummer, Alter und Führerschein(Ja/Nein) eingegeben werden

    Mein Code für Form1 sieht wie folgt aus:

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form1
    3. Dim myConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " & Environment.CurrentDirectory & "\myDatabase.accdb"
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim myConnection As New OleDbConnection(myConnString)
    6. myConnection.Open()
    7. Dim myCommand As New OleDbCommand("INSERT INTO tbl (Seriennummer, Nom) VALUES (@Seriennummer, @Nom)", myConnection)
    8. myCommand.Parameters.AddWithValue("@Seriennummer", TextBox1.Text)
    9. myCommand.Parameters.AddWithValue("@Nom", TextBox2.Text)
    10. myCommand.ExecuteNonQuery()
    11. myConnection.Close()
    12. End Sub
    13. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    14. Form2.Show()
    15. End Sub
    16. End Class


    Mein Code für Form2 sieht wie folgt aus:

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form2
    3. Dim myConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " & Environment.CurrentDirectory & "\myDatabase.accdb"
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim myConnection As New OleDbConnection(myConnString)
    6. myConnection.Open()
    7. Dim myCommand As New OleDbCommand("UPDATE tbl SET Alter = @Alter, Führerschein = @Führerschein WHERE Seriennummer = @Seriennummer", myConnection)
    8. myCommand.Parameters.AddWithValue("@Seriennummer", TextBox1.Text)
    9. myCommand.Parameters.AddWithValue("@Alter", TextBox2.Text)
    10. myCommand.Parameters.AddWithValue("@Führerschein", CheckBox1.Checked)
    11. myCommand.ExecuteNonQuery()
    12. myConnection.Close()
    13. End Sub
    14. End Class




    Die Fehlermeldung lautet bei myCommand.ExecuteNonQuery() ........ Syntaxfehler in UPDATE-Anweisung


    noch eine Frage wie kann ich den Code als Code posten und nicht so wie ich es jetzt leider tun musste als Text?

    Danke im voraus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „denizium“ ()

    denizium schrieb:

    noch eine Frage wie kann ich den Code als Code posten und nicht so wie ich es jetzt leider tun musste als Text?

    In dem Du Deine Codeabschnitte zwischen [code=vbnet] und [/code] packst.
    Weitere Möglichkeiten bekommst Du als ToolTip, wenn Du die Maus dort wo der grüne Pfeil ist, ein wenig stehen lässt.

    denizium schrieb:

    noch eine Frage wie kann ich den Code als Code posten und nicht so wie ich es jetzt leider tun musste als Text?
    Benutz einfach [code=vbnet]blabla[/code]. Die Info steht auch im Tooltip des Buttons ("<>") beim Posten.

    OleDb unterstützt bei .NET eigentlich keine named Parameter, d.h. du musst
    Dim myCommand As New OleDbCommand("UPDATE tbl SET Alter = ?, Führerschein = ? WHERE Seriennummer = ?", myConnection) verwenden und die Parameter dann in der richtigen Reihenfolge (ohne Namen) hinzufügen.
    Zusätzlich musst du glaube ich noch myCommand.Prepare() vor dem Ausführen aufrufen.

    Ob das SQL dann erfolgreich ist, hängt allerdings noch an der Definition deiner Tabelle ("tbl"), also ob die Datentypen soweit passsen (die kannst du beim Hinzufügen der Parameter auch mit angeben).
    Als kleine Verbesserung würde ich Tabellen- und Spaltennamen nach Möglichkeit nur aus normalen Buchstaben (a-z), Zahlen und Untersichen zusammensetzen. Also ohne Umlaute, Leerzeichen etc. Access ist da zwar recht tolerant, aber es ist keine gute Praxis : )

    PS: Schöne Verbesserung gegenüber deinen letzten Code.
    also bei Insert Into funktioniert alles perfekt so wie ich es oben gepostet habe(da gabs kein Problem mit @)
    beim Updaten habe ich es jetzt etwas umformatiert(@ weggetan):

    VB.NET-Quellcode

    1. Dim myCommand As New OleDbCommand("UPDATE tbl SET Alter = ? , Fuhrerschein = ? WHERE Seriennummer = ? ", myConnection)
    2. myCommand.Parameters.AddWithValue("Alter", TextBox2.Text)
    3. myCommand.Parameters.AddWithValue("Fuhrerschein", CheckBox1.Checked)
    4. myCommand.Parameters.AddWithValue("Seriennummer", TextBox1.Text)


    Reihenfolge passt, aber was du mit "ohne Namen" meinst verstehe ich nicht ganz, wenn ich zb "Alter" weglasse wird der Code unterstrichen!
    so passt es leider auch nicht :S wenn man

    VB.NET-Quellcode

    1. myCommand.Prepare()
    einführen will muss man laut Fehlermeldung, Datentypen angeben, wüsste nicht wie.

    Will noch kurz meine Datenbankformatierung angeben:
    Seriennummer Datentyp:Zahl(Long Integer)
    Nom Datentyp:Text
    Alter Datentyp:Zahl(l.int.)
    Fuhrerschein Datentyp: Ja/Nein Format: Ja/Nein

    bin schon am verzweifeln :(

    Danke für deine Hilfe, hoffentlich kommt da noch was raus

    Ps: Danke man lernt dazu
    Dein ganzer Ansatz ist für Datenbänkerei ziemlich untauglich.
    Ado.Net ist ein GesamtKonzept, was sich um die Dataset-Klasse rankt. Also man hat ein Dataset als Cache, das befüllt man aus der DB, und verarbeitet die Daten im folgenden gänzlich unabhängig vonne DB.
    Erst wenn die Gesamt-Verarbeitung (oder Teilschritte) abgeschlossen ist speichert man mit einem Rutsch alle Änderungen zurück.
    Das Dataset hat extra dafür eine sehr listige Änderungsverfolgung eingebaut.

    So.
    Wenn du also in Form1 einen Datesatz anlegst, dann ist er im Dataset angelegt - noch nicht in der DB (vlt. willst du ihn ja auch wieder verwerfen).
    Wenn du diesen Datensatz auch in Form2 anzeigen willst, dann muss Form2 nicht in die DB grabschen, sondern es muss das Dataset von Form1 übergeben bekommen.
    Grabscht Form2 in die DB, so hast du den blöden Effekt, dass die neuen Daten zwar inne DB sind, aber nicht im Form1 8|

    Also ich empfehle dir, die Datenbänkerei vonne Pike an neu zu erlernen. Das fängt gleich mit einer Riesen-Überraschung an: Für den Einstieg und für den allergrössten Teil des Lernstoffs brauchst du überhaupt keine Datenbank - im Gegenteil: Ein zu früh eingebundener DB-Zugriff verbaut dir komplett die Möglichkeiten, die in Ado.Net eiglich vorgesehen sind.
    Dein Code ist gleich das beste Beispiel: Command.ExecuteNonQuery ist ein Befehl, der nicht mit einem Dataset zusammenarbeitet - also wenn du das auszubauen versuchst, entwickelst du dich zwangsläufig komplett an Ado.Net vorbei.
    In Ado.Net persistiert man Daten mittels DataAdapter.

    gugge Datenbänkerei-Einstieg, und beachte insbesondere die weiterführenden Links, die zeigen nämlich den Löwenanteil des Spektrums (das ganze ist nicht möglich).
    Naja, EDR hat schon zum Teil recht. Falls du es dennoch wie bisher machen willst, probier es mal in etwa so (Quick&Dirty und ungeteset):

    VB.NET-Quellcode

    1. Dim myCommand As New OleDbCommand("UPDATE tbl SET Alter = ? , Fuhrerschein = ? WHERE Seriennummer = ? ", myConnection)
    2. dim param as OleDbParameter
    3. param = new OleDbParameter("Alter", OleDbType.Integer)
    4. param.Value = Int.parse(TextBox2.Text)
    5. myCommand.Parameters.Add(param)
    6. param = new OleDbParameter("Fuhrerschein", OleDbType.Boolean)
    7. param.Value = CheckBox1.Checked
    8. myCommand.Parameters.Add(param)
    9. param = new OleDbParameter("Seriennummer", OleDbType.BigInt)
    10. param.Value = Long.parse(TextBox1.Text)
    11. myCommand.Parameters.Add(param)

    ErfinderDesRades schrieb:

    Erst wenn die Gesamt-Verarbeitung (oder Teilschritte) abgeschlossen ist speichert man mit einem Rutsch alle Änderungen zurück.
    Das Dataset hat extra dafür eine sehr listige Änderungsverfolgung eingebaut.


    Und was ist wenn während der Arbeit der PC (warum auch immer) abstürzt und die Daten sind weg?
    In Access wird doch auch, im Gegensatz zu Excel, sofort in der Datenbank gespeichert.
    Ich mag es, wenn meine Daten sofort nach der Eingabe in der Datenbank gespeichert werden. :)
    Es ist eine Option, nicht jede Datenbewegung sofort wegschreiben zu müssen.
    Es steht dir natürlich weiterhin frei, hinter allen möglichen Control-Events den SaveAll! - Befehl zu hinterlegen, oder mw. auch einen Timer, der jede Sekunde updated.

    Ich habs zB ganz gerne, wenn nicht ohne meinen Willen rückgespeichert wird. So kann ich mehrere evtl. komplexe Arbeitsschritte ausführen, und wenn ich drauf komme, dass ichs total verdaddelt habe, dann klickse ich einfach "Neu laden" und all der Unfug, den ich seit dem letzten Speichern eingegeben habe ist damit verworfen.

    Also eine rudimentäre Undo-Funktion. (Echtes Undo zu proggen ist die Hölle ;) )

    Oder auch annersrum: Bei komplexen Vorgängen, wenn ich einen konsistenten Stand erreicht hab, klickse ich "Save", und meine Arbeit ist im konsistenten Stand gesichert.