Laden...

SQL-Insert mit Double-Wert wird nicht ausgeführt

Erstellt von ISH666 vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.698 Views
I
ISH666 Themenstarter:in
2 Beiträge seit 2017
vor 7 Jahren
SQL-Insert mit Double-Wert wird nicht ausgeführt

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?

D
985 Beiträge seit 2014
vor 7 Jahren

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

I
ISH666 Themenstarter:in
2 Beiträge seit 2017
vor 7 Jahren

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? 🤔

D
985 Beiträge seit 2014
vor 7 Jahren

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)

J
251 Beiträge seit 2012
vor 7 Jahren
2.207 Beiträge seit 2011
vor 7 Jahren

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