Guten Abend, ich bin neu hier im Forum und hoffe, dass mir jemand helfen kann 😃
Meine Situation ist, dass ich mit einem OleDbCommand auf eine Access Datenbank zugreife und Werte mit einem Command reinschreibe. Doch irgendwie weigert sich der Commander, einen Double (bonus) in die DB zu schreiben, nehme ich aus dem INSERT den Double raus, funktioniert er.
Mein Code:
if (bonus >= 1)
{
cmd = bk.Command("INSERT INTO Lohnabrechnung (LaNr, LaDatMon, LaDatJahr, LaStunden, LaLgNr, LaMitAbt, LaMitVName, LaMitName, LaStadt, LaStrasse, LaPlz, LaHausnr, LaBonus) VALUES (" + mitnr + ", " + mon + "," + jahr + "," + arbeitstunden + "," + mlgnr + "," + abtnr + ",'" + vname + "','" + name + "','" + stadt + "','" + strasse + "'," + plz + "," + hausnr + ","+bonus+");");
}
}
catch (Exception)
{
throw;
}
So konvertiere ich den Double
string combobox = Convert.ToString(comboBox1.SelectedItem);
combo = combobox.Substring(combobox.IndexOf(',') + 1);
bonus = Convert.ToDouble(combo);
Die Exception:> Fehlermeldung:
Ein Ausnahmefehler des Typs "System.ApplicationException" ist in Lohnabrechnung.exe aufgetreten.
Zusätzliche Informationen: Write ErrorSystem.Data.OleDb.OleDbException (0x80040E14): Number of query values and destination fields are not the same.
bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
bei System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
bei System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
Könnt ihr mir sagen, wo der Fehler ist?
Schreib das Statement erst in eine String Variable und die schau dir im Debugger an.
(Ein double wird als string so 3,45 dargestellt, was im Statement aber als 2 unterschiedliche Werte interpretiert wird)
Darum (und auch wegen SQL-Injection, Performance, ...) verwendet man Parameter
Schau dir mal meine Antwort zu diesem Thema auf stackoverflow an
Danke für deine Antwort, wie du gesagt hast, zeigt er mir den Double als String mit Komma an.
Ich habe aber im Insert einen Haltepunkt gesetzt, der Double hat da einen Punkt als Trennzeichen (was ja auch so richtig ist). Wieso funktioniert der Insert dann nicht? 🤔
Du musst dir nicht den double Wert im Debugger anschauen, sondern das, was an die Command Methode übergeben wird, und das ist ein string (der wo der double Wert mit dem Komma drin ist, darum solltest du dir den ja ansehen).
Nimm Parameter und es wird funktionieren auch wenn sich die aktuelle Culture ändert (die hat nämlich Auswirkung darauf, wie z.B. ein double Wert in einen string umgewandelt wird)
Hallo ISH666,
Bitte wähle in Zukunft einen passenden Titel und benutze die richtigen Code-Tags. [Hinweis] Wie poste ich richtig?
du solltest zudem Access als DB vermeiden. Es gibt bessere Alternativen.
Mit den Parametern sparst du dir auch das Konvertieren von Double nach xyz, je nachdem was bei dir in den Comboboxen steht. Sowas kann schnell ins Auge gehen.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck