none
Mit Visual Basic eine Access Datenbank updaten RRS feed

  • Frage

  • Hallo Helfer.

    Ich habe ein Programm geschrieben in dem Man Geld zählen kann und die Anzahl der Einzelnen Münzen/Noten in eine Datenbank schreibt. Wenn ich dies nun mit "Update" ändern will kommt eine Meldung :"Ungültige Konvertierung von der Zeichenfolge update tb... SET .... in Typ Date.

    Es sollte gar nicht in Date Konvertiert werden.

    Hier der Code:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim cmd As New OleDb.OleDbCommand
            Dim con As New OleDb.OleDbConnection
    
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Ticket\skdb.mdb"
            'Ausrechnen der Summe ****************************************************************************************************
            Dim summe As Double
            summe = 1 * CDbl(txt_1fr.Text) + 2 * CDbl(txt_2fr.Text) + 5 * CDbl(txt_5fr.Text) + 10 * CDbl(txt_10fr.Text) + 20 * CDbl(txt_20fr.Text) + 50 * CDbl(txt_50fr.Text) + 100 * CDbl(txt_100fr.Text) + 200 * CDbl(txt_200fr.Text)
            MsgBox("Sie haben " & summe & " Fr. eingenommen")
            'Datenbankupdate***********************************************************************************************
            Dim anzahl As Integer
            Dim tdate As Date
            tdate = lbl_datumvorschau.Text
            Try
                If Not con.State = ConnectionState.Open Then
                    con.Open()
                End If
                cmd.CommandText =
                    "update tbEinnahmen SET " &
                   "Franken1 = " & CInt(txt_1fr.Text) & "," &
                   "Franken2 = " & CInt(txt_2fr.Text) & "," &
                   "Franken5 = " & CInt(txt_5fr.Text) & "," &
                   "Franken10 = " & CInt(txt_10fr.Text) & "," &
                   "Franken20 = " & CInt(txt_20fr.Text) & "," &
                   "Franken50 = " & CInt(txt_50fr.Text) & "," &
                   "Franken100 = " & CInt(txt_100fr.Text) & "," &
                   "Franken200 = " & CInt(txt_200fr.Text) & "," &
                   "FrankenTotal = " & CInt(summe) & "," &
                   "WHERE Datum = " &
                cmd.Parameters.Add("@p1", OleDb.OleDbType.Date).Value = Date.Parse(Date.Parse(lbl_datumvorschau.Text))
    
                MessageBox.Show(cmd.CommandText)
                anzahl = cmd.ExecuteNonQuery()
                If anzahl > 0 Then
                    MessageBox.Show("Datensatz geändert")
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            con.Close()
        End Sub

    Montag, 14. Oktober 2013 14:46

Antworten

  • Hi,
    im Code gibt es mehrere Probleme:

    1. die Jet will Fragezeichen als Platzhalter in der SQL Anweisung

    2. anstelle CDbl und Parse sollte TryParse genutzt werden, um Fehler zur Ausführungszeit zu vermeiden

    3. in der erzeugten SQL Anweisung fehlen Leerzeichen

    4. dem Command-Objekt wurde nicht mitgeteilt, mit welcher Verbindung es zu arbeiten hat.

    --
    Peter

    • Als Antwort markiert Moneedshelp Donnerstag, 17. Oktober 2013 06:13
    Dienstag, 15. Oktober 2013 08:00
  • Hi,

    die Spalten müssen mit Komma voneinander getrennt werden. Ein UPDATE Statement sieht bspw. so aus:

    UPDATE Tabelle
    SET    Spalte1 = 'Wert1',
           Spalte2 = 'Wert2',
           Spalte3 = 'Wert3'

    In deinem Fall musst Du also auch nur hinter den jeweiligen Wert bzw. vor die weiteren Spaltennamen (bitte aber wieder Parameter verwenden und nicht die Werte direkt ins SQL Statement einbauen) noch ein Komma einfügen.

    cmd.Connection = con
    cmd.CommandText =
        "UPDATE tbEinnahmen SET " &
        "Datum = " & CDate(lbl_datumvorschau.Text) & "" &
        ",Franken1 = " & CInt(txt_1fr.Text) & " " &
        ",Franken2 = " & CInt(txt_2fr.Text) & " " &
        ",Franken5 = " & CInt(txt_5fr.Text) & " " &
        ",Franken10 = " & CInt(txt_10fr.Text) & " " &
        ",Franken20 = " & CInt(txt_20fr.Text) & " " &
        ",Franken50 = " & CInt(txt_50fr.Text) & " " &
        ",Franken100 = " & CInt(txt_100fr.Text) & " " &
        ",Franken200 = " & CInt(txt_200fr.Text) & " " &
        ",FrankenTotal = " & CDbl(summe) & " " &
        "WHERE Datum = " & CDate(lbl_datumvorschau.Text)
    Aber wie gesagt, bitte mit Parametern arbeiten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 16. Oktober 2013 17:27
    Moderator

Alle Antworten

  • Hallo,
    erstmal hast du ein & zuviel:
                   "WHERE Datum = " &
    Lösche das weg. Dann ist in deiner Abfrage kein Parameter @p1 zu sehen, du fügst iohn aber hinzu. Weiterhin solltest du alles über Parameter machen, um SQL-Injection zu verhindern.
    cmd.CommandText =
      "update tbEinnahmen SET " &
      "Franken1 = @pFranken1," &
      "Franken2 = @pFranken2," &
      '...
      "WHERE Datum = @p1"
    cmd.Parameters.Add("@p1", OleDb.OleDbType.Date).Value = Date.Parse(Date.Parse(lbl_datumvorschau.Text))
    cmd.Parameters.Add(...
    
                


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 14. Oktober 2013 15:39
    Moderator
  • Hi,
    zuerst solltest Du Option Strict On setzen, um implizite Typkonvertierungen zu vermeiden. Als Nächstes solltest Du auf CInt verzichten, um wegen unzulässigen Eingaben in den TextBoxes Programmabstürze zu vermeiden und nur TryParse einsetzen. Weiterhin solltest Du konsequent nur mit Parametern und entsprechenden Platzhaltern in der SQL Anweisung arbeiten, um SQL Injection zu verhindern.

    Die Fehlerausschrift "Ungültige Konvertierung ... in Date ..." zeigt, dass die Verknüpfung mit der Where Klausel falsch ist. Wenn der gezeigte Code wirklich so angewandt wird, dann ist die Ursache dieser Fehlermeldung der Rückgabewert der Add-Funktion, der bei dem gesetzten Option Strict Off implizit die ToString-Methode aufruft, die den Namen des Objektes liefert, was sich wirklich nicht in ein Datum umwandeln lässt.

    Beginne mit Option Strict On und nutze nur Parameter Objekte, denen die Daten nach einem TryParse zugewiesen werden.

    --
    Peter

     
    Dienstag, 15. Oktober 2013 03:57
  • Hi Tom,
    bei der Jet muss das Fragezeichen als Platzhalter in der SQL Anweisung genutzt werden.

    --
    Peter

    Dienstag, 15. Oktober 2013 03:59
  • Hallo und Danke erst mal für die Hilfe

    ich habe deinen Rat nun zu Herzen genommen und Habe es so gemacht:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim cmd As New OleDb.OleDbCommand
            Dim con As New OleDb.OleDbConnection
    
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Ticket\skdb.mdb"
            'Ausrechnen der Summe ****************************************************************************************************
            Dim summe As Double
            summe = 1 * CDbl(txt_1fr.Text) + 2 * CDbl(txt_2fr.Text) + 5 * CDbl(txt_5fr.Text) + 10 * CDbl(txt_10fr.Text) + 20 * CDbl(txt_20fr.Text) + 50 * CDbl(txt_50fr.Text) + 100 * CDbl(txt_100fr.Text) + 200 * CDbl(txt_200fr.Text)
            MsgBox("Sie haben " & summe & " Fr. eingenommen")
            'Datenbankupdate***********************************************************************************************
            Dim anzahl As Integer
            Dim tdate As String
            tdate = lbl_datumvorschau.Text
            Try
                If Not con.State = ConnectionState.Open Then
                    con.Open()
                End If
                cmd.CommandText =
                    "UPDATE tbEinnahmen SET " &
                    "Datum = @pdatum" &
                   "Franken1 = @pFranken1" &
                   "Franken2 = @pFranken2" &
                   "Franken5 = @pFranken5" &
                   "Franken10 = @pFranken10" &
                   "Franken20 = @pFranken20" &
                   "Franken50 = @pFranken50" &
                   "Franken100 = @pFranken100" &
                   "Franken200 = @pFranken200" &
                   "FrankenTotal = @pSumme" &
                   "WHERE Datum = @p1"
                cmd.Parameters.Add("@pdatum", OleDb.OleDbType.Date).Value = Date.Parse(Date.Parse(lbl_datumvorschau.Text))
                cmd.Parameters.Add("@pFranken1", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_1fr.Text))
                cmd.Parameters.Add("@pFranken2", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_2fr.Text))
                cmd.Parameters.Add("@pFranken5", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_5fr.Text))
                cmd.Parameters.Add("@pFranken10", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_10fr.Text))
                cmd.Parameters.Add("@pFranken20", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_20fr.Text))
                cmd.Parameters.Add("@pFranken50", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_50fr.Text))
                cmd.Parameters.Add("@pFranken100", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_100fr.Text))
                cmd.Parameters.Add("@pFranken200", OleDb.OleDbType.Date).Value = Integer.Parse(Integer.Parse(txt_200fr.Text))
                cmd.Parameters.Add("@pSumme", OleDb.OleDbType.Date).Value = Double.Parse(Double.Parse(summe))
                cmd.Parameters.Add("@p1", OleDb.OleDbType.Date).Value = Date.Parse(Date.Parse(lbl_datumvorschau.Text))
    
                MessageBox.Show(cmd.CommandText)
                anzahl = cmd.ExecuteNonQuery()
                If anzahl > 0 Then
                    MessageBox.Show("Datensatz geändert")
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            con.Close()
        End Sub

    Ich habe in meiner Datenbank als erste Spalte Datum, dann erst Franken1 ,Franken2.... und zuletzt Summe.
    Ich habe darum zu oberst nocheinmal das Datum Hinzugefügt, dass bleibt aber gleich ist ja nur ein Label das zeigen soll wo man gerade dran ist.

    Meine Neue Fehlermeldung ist ein wenig verwirrend:

    Nachdem ok Klicken kommt:

    Woran kann das liegen und wie kann ich das beheben?

    Dienstag, 15. Oktober 2013 07:02
  • Hi,
    im Code gibt es mehrere Probleme:

    1. die Jet will Fragezeichen als Platzhalter in der SQL Anweisung

    2. anstelle CDbl und Parse sollte TryParse genutzt werden, um Fehler zur Ausführungszeit zu vermeiden

    3. in der erzeugten SQL Anweisung fehlen Leerzeichen

    4. dem Command-Objekt wurde nicht mitgeteilt, mit welcher Verbindung es zu arbeiten hat.

    --
    Peter

    • Als Antwort markiert Moneedshelp Donnerstag, 17. Oktober 2013 06:13
    Dienstag, 15. Oktober 2013 08:00
  • Hallo Peter

    Ich danke vielmal für deine Antwort, aber da ich alles was ich kann bereits in meinem momentanen Code stehen habe, wollte ich fragen ob du mir ein Beispiel machen kannst nur mit einer Zeile so das ich das für die restlichen übernehmen kann.

    Gruss Moreno

    Dienstag, 15. Oktober 2013 08:23
  • Hallo Peter,

    bei der Jet muss das Fragezeichen als Platzhalter in der SQL Anweisung genutzt werden.

    man muss kein Fragezeichen verwenden. @Abc geht auch, allerdings ist das dann nur Schall und Rauch, da die Namen keinerlei Einfluss haben, die Reihenfolge der Parameter muss exakt übereinstimmen (allerdings mit der Einschränkung, dass Abfragen von innen nach außen aufgelöst werden müssen, siehe hier)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 15. Oktober 2013 10:09
    Moderator
  • Hi,

    sind wirklich alle deine Spalten vom Typ Date? Denn bei jedem Parameter, den Du hinzugefügt hast, gibst Du Date als Typ an.

    Ich würde zudem eher mit cmd.Parameters.AddWithValue( "...", ... ) arbeiten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 15. Oktober 2013 10:12
    Moderator
  • Nein, es sind nicht alle Spalten vom Typ Date ^^. diesen Fehler habe ich schon behoben.

    die untere Fehlermeldung bekomme ich leider immer noch und mir gehen langsam aber sicher die Ideen aus wie ich dies beheben kann.

     

    Mittwoch, 16. Oktober 2013 06:07
  • Hi,

    Peter hatte dir das doch schon geschrieben. Du hast deinem cmd Objekt nirgends gesagt, welche Verbndung es verwenden soll.

    cmd.Connection = con
    sollte da helfen. Ich würde das vor die Zeile mit:
    cmd.CommandText = ...
    schreiben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 16. Oktober 2013 09:12
    Moderator
  • Danke Stefan für den Tipp habe leider bei Peter nicht genau verstanden das er das mein :(.

    Nun habe ich noch ne kleine Frage. Ich war bis jetzt dran das am probieren jedoch bekomme ich erneut eine Fehlermeldung.

    Ich habe zusätzlich noch vorgeschrieben bekommen das ich es nicht mit den Parameter machen soll sondern so:

    cmd.Connection = con
                cmd.CommandText =
                    "UPDATE tbEinnahmen SET " &
                    "Datum = " & CDate(lbl_datumvorschau.Text) & "" &
                    "Franken1 = " & CInt(txt_1fr.Text) & " " &
                    "Franken2 = " & CInt(txt_2fr.Text) & " " &
                    "Franken5 = " & CInt(txt_5fr.Text) & " " &
                    "Franken10 = " & CInt(txt_10fr.Text) & " " &
                    "Franken20 = " & CInt(txt_20fr.Text) & " " &
                    "Franken50 = " & CInt(txt_50fr.Text) & " " &
                    "Franken100 = " & CInt(txt_100fr.Text) & " " &
                    "Franken200 = " & CInt(txt_200fr.Text) & " " &
                    "FrankenTotal = " & CDbl(summe) & " " &
                    "WHERE Datum = " & CDate(lbl_datumvorschau.Text)

    Kannst du mir bitte auch bei diesem Problem helfen? :D
    Mittwoch, 16. Oktober 2013 15:26
  • Hi,

    die Spalten müssen mit Komma voneinander getrennt werden. Ein UPDATE Statement sieht bspw. so aus:

    UPDATE Tabelle
    SET    Spalte1 = 'Wert1',
           Spalte2 = 'Wert2',
           Spalte3 = 'Wert3'

    In deinem Fall musst Du also auch nur hinter den jeweiligen Wert bzw. vor die weiteren Spaltennamen (bitte aber wieder Parameter verwenden und nicht die Werte direkt ins SQL Statement einbauen) noch ein Komma einfügen.

    cmd.Connection = con
    cmd.CommandText =
        "UPDATE tbEinnahmen SET " &
        "Datum = " & CDate(lbl_datumvorschau.Text) & "" &
        ",Franken1 = " & CInt(txt_1fr.Text) & " " &
        ",Franken2 = " & CInt(txt_2fr.Text) & " " &
        ",Franken5 = " & CInt(txt_5fr.Text) & " " &
        ",Franken10 = " & CInt(txt_10fr.Text) & " " &
        ",Franken20 = " & CInt(txt_20fr.Text) & " " &
        ",Franken50 = " & CInt(txt_50fr.Text) & " " &
        ",Franken100 = " & CInt(txt_100fr.Text) & " " &
        ",Franken200 = " & CInt(txt_200fr.Text) & " " &
        ",FrankenTotal = " & CDbl(summe) & " " &
        "WHERE Datum = " & CDate(lbl_datumvorschau.Text)
    Aber wie gesagt, bitte mit Parametern arbeiten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 16. Oktober 2013 17:27
    Moderator
  • Danke viel mal für eure Hilfe Leute.

    Es hat nun Funktioniert und ich habe auch mit Parameter gearbeitet.

    Lösung:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim cmd As New OleDb.OleDbCommand
            Dim con As New OleDb.OleDbConnection
    
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Ticket\skdb.mdb"
            'Ausrechnen der Summe ****************************************************************************************************
            Dim summe As Double
            summe = 1 * CDbl(txt_1fr.Text) + 2 * CDbl(txt_2fr.Text) + 5 * CDbl(txt_5fr.Text) + 10 * CDbl(txt_10fr.Text) + 20 * CDbl(txt_20fr.Text) + 50 * CDbl(txt_50fr.Text) + 100 * CDbl(txt_100fr.Text) + 200 * CDbl(txt_200fr.Text)
            MsgBox("Sie haben " & summe & " Fr. eingenommen")
            'Datenbankupdate***********************************************************************************************
            Dim anzahl As Integer
            Try
                If Not con.State = ConnectionState.Open Then
                    con.Open()
                End If
                cmd.Connection = con
                cmd.CommandText =
                    "UPDATE tbEinnahmen SET " &
                    "Datum = @pdatum" &
                   ",Franken1 = @pFranken1 " &
                   ",Franken2 = @pFranken2 " &
                   ",Franken5 = @pFranken5 " &
                   ",Franken10 = @pFranken10 " &
                   ",Franken20 = @pFranken20 " &
                   ",Franken50 = @pFranken50 " &
                   ",Franken100 = @pFranken100 " &
                   ",Franken200 = @pFranken200 " &
                   ",FrankenTotal = @pSumme " &
                   "WHERE Datum = @p1 "
                cmd.Parameters.AddWithValue("@pdatum", Date.Parse(lbl_datumvorschau.Text))
                cmd.Parameters.AddWithValue("@pFranken1", Integer.Parse(txt_1fr.Text))
                cmd.Parameters.AddWithValue("@pFranken2", Integer.Parse(txt_2fr.Text))
                cmd.Parameters.AddWithValue("@pFranken5", Integer.Parse(txt_5fr.Text))
                cmd.Parameters.AddWithValue("@pFranken10", Integer.Parse(txt_10fr.Text))
                cmd.Parameters.AddWithValue("@pFranken20", Integer.Parse(txt_20fr.Text))
                cmd.Parameters.AddWithValue("@pFranken50", Integer.Parse(txt_50fr.Text))
                cmd.Parameters.AddWithValue("@pFranken100", Integer.Parse(txt_100fr.Text))
                cmd.Parameters.AddWithValue("@pFranken200", Integer.Parse(txt_200fr.Text))
                cmd.Parameters.AddWithValue("@pSumme", summe)
                cmd.Parameters.AddWithValue("@p1", Date.Parse(lbl_datumvorschau.Text))
    
    
                MessageBox.Show(cmd.CommandText)
                anzahl = cmd.ExecuteNonQuery()
                If anzahl > 0 Then
                    MessageBox.Show("Datensatz geändert")
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            con.Close()
        End Sub

    Donnerstag, 17. Oktober 2013 06:14