Benutzer mit den meisten Antworten
Mit Visual Basic eine Access Datenbank updaten

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
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
-
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
- Bearbeitet Stefan FalzModerator Mittwoch, 16. Oktober 2013 17:43
- Als Antwort markiert Moneedshelp Donnerstag, 17. Oktober 2013 06:12
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. -
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 -
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?
-
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
-
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
-
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 -
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 -
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 -
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 -
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
- Bearbeitet Stefan FalzModerator Mittwoch, 16. Oktober 2013 17:43
- Als Antwort markiert Moneedshelp Donnerstag, 17. Oktober 2013 06:12
-
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