Anzeige

Fehler beim speichern in der Datenbank

#1
Ich bekomme immer eine Fehlermeldung beim abspeichern in der Datenbank.

strSQL = "Insert into Rechnung (jahr, kdnr, renr, lfNr, artnr, bestnr, liefdatum, redatum, menge, epreis, rabatt, rbSum)";
strSQL += " values( " + myNJahr + ", '" + txtKdNr.Text + "', '" + txtReNr.Text + "', '" + txtLfNr.Text + "'";
strSQL += " , '" + txtArtNr.Text + "', '" + txtBestNr.Text + "', '" + txtLfDatum.Text + "', '" + lblReDatum.Text + "', ";
strSQL += " " + myMenge + ", " + myEPreis + ", '" + txtRabatt.Text + "', " + myProzent+ ")";

Die Fehler lautet:

In der INSERT-Anweisung sind weniger Spalten angegeben als Werte in der VALUES-Klausel. Die Anzahl von Werten in der VALUES-Klausel und die Anzahl von in der INSERT-Anweisung angegebenen Spalten müssen übereinstimmen.

Um eine Lösung zu finden , bin ich in einzelschritten vorgegangen und haben die Daten von Tabellen-Feld zu Tabellen-Feld abgespeichert, erst als ich das Tabellen-Feld rbsum hinzugefügt hatte, bekam ich diese Fehlermeldung
 

Spyke

Capoeirista
Premium-User
#2
Sieht erstmal richtig aus.
Prüf mal den Inhalt der Textboxen, könnte mir vorstellen das dort irgendeine Zeichenkosntellation enthalten ist welche deine SQL Anweisung "versaut".
Beispielsweise wenn in der Textbox ebenfalls ein ' enthalten ist.

Problem könnte auch sein das du bei myProzent die Deutsche Formatierung mit Komma als Dezimaltrennzeichen zurückbekommst, das würde dann auch als extra Spalte interpretiert werden.
 
#4
Folgen sie der Code so aus:

C#:
private void Preisberechen(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
if (weiter == "1")
{
myMenge = Convert.ToInt16(txtMenge.Text);
myRabatt = Convert.ToInt16(txtRabatt.Text);
myEPreis = Convert.ToDecimal(txtEPreis.Text);
// Gesamtpreis Artikel
myGesPreis = myMenge * myEPreis;
myProzent = (myGesPreis / 100) * myRabatt;
myGesSum = myGesPreis - myProzent;
txtRBSum.Text = String.Format("{0:c}", myProzent);
txtGesPreis.Text = String.Format("{0:c}", myGesSum);

// MwSt berechnen
myMwSt = (myGesPreis / 100) * MwSt;
myZwSum = myGesPreis;
txtZWSumme.Text = String.Format("{0:c}", myGesSum);
txtMwSt.Text = String.Format("{0:c}", myMwSt);
//Endpreis
myEndPreis = myGesPreis + myMwSt;
txtEndPreis.Text = String.Format("{0:c}", myEndPreis);
//strSQL Insert-Datem
strSQL = "insert into Rechnung (jahr, kdnr, renr, lfnr, artnr, bestnr, liefDatum, redatum, menge, epreis) values ( " + myNJahr + ", '" + txtKdNr.Text + "', '" + txtReNr.Text + "', '" + txtLfNr.Text + "', ";
strSQL += " '" + txtArtNr.Text + "', '" + txtBestNr.Text + "', '" + txtLfDatum.Text + "', '" + lblReDatum.Text + "',";
strSQL += " " + myMenge + ", " + myEPreis + ")";
txtEPreis2.Focus();
weiter = "2";
}
 
Zuletzt bearbeitet von einem Moderator:

Spyke

Capoeirista
Premium-User
#5

Spyke

Capoeirista
Premium-User
#7
Hier mal ein Beispiel direkt mit Insert, für eine Access Datenbank.
http://stackoverflow.com/questions/5893837/using-parameters-inserting-data-into-access-database
(Die Antwort mit dem grünen Haken)

Du hast im Prinzip dein DbCommand (in diesem Beispiel dort ein OleDbCommand).
Übergibst dem DbCommandText deine SQL Anweisung und die Parameter.

Die Parameter im SQL sind mit dem @ als Präfix gekennzeichnet.

Hier auch nochmal was von den galileo books (genauere Erklärung der Paramter)
http://openbook.galileo-press.de/visual_csharp/visual_csharp_26_003.htm
(ich gebs zu ich habs jetzt nur kurz überflogen aber im Grunde sind die Leute bei galileo schon gut bei Dokumentationen)
 
#8
Ich habe es mit Parameters versucht

SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
mySqlCommand.CommandText = "insert imto rechnung (jahr, kdnr) values (@jahr, @Kdnr)";
mySqlCommand.Parameters.Add("@jahr", SqlDbType.Int);
mySqlCommand.Parameters.Add("@Kdnr", SqlDbType.NChar, 10);
mySqlCommand.Parameters["@jahr"].Value = myNJahr;
mySqlCommand.Parameters["@Kdnr"].Value = txtKdNr.Text;

mySqlConnection.Open();
mySqlCommand.ExecuteNonQuery();

und die Fehlermeldung "Falsche Syntax in Nähe vom 'Rechnung'" erscheint
 
Zuletzt bearbeitet:
#9
Hallo Horst1945

Bitte manchmal auch selber kurz durchlesen, die Fehlermeldung sagt dir ja sogar wo du schauen musst:
Code:
"insert imto rechnung (jahr, kdnr) values (@jahr, @Kdnr)";
Viele Grüsse
Cromon
 
#11
Hallo Horst1945

Wenn du mySqlConnection.Open aufrufst musst du vor dem nächsten Aufruf von mySqlConnection.Open die Verbindung schliessen. Oder aber du öffnest sie nur einmal.

Grüsse
Cromon
 
#12
Folgen sie der Code so aus:

C#:
private void Preisberechen(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
if (weiter == "1")
{
myMenge = Convert.ToInt16(txtMenge.Text);
myRabatt = Convert.ToInt16(txtRabatt.Text);
myEPreis = Convert.ToDecimal(txtEPreis.Text);
// Gesamtpreis Artikel
myGesPreis = myMenge * myEPreis;
myProzent = (myGesPreis / 100) * myRabatt;
myGesSum = myGesPreis - myProzent;
txtRBSum.Text = String.Format("{0:c}", myProzent);
txtGesPreis.Text = String.Format("{0:c}", myGesSum);

// MwSt berechnen
myMwSt = (myGesPreis / 100) * MwSt;
myZwSum = myGesPreis;
txtZWSumme.Text = String.Format("{0:c}", myGesSum);
txtMwSt.Text = String.Format("{0:c}", myMwSt);
//Endpreis
myEndPreis = myGesPreis + myMwSt;
txtEndPreis.Text = String.Format("{0:c}", myEndPreis);
//strSQL Insert-Datem
strSQL = "insert into Rechnung (jahr, kdnr, renr, lfnr, artnr, bestnr, liefDatum, redatum, menge, epreis) values ( " + myNJahr + ", '" + txtKdNr.Text + "', '" + txtReNr.Text + "', '" + txtLfNr.Text + "', ";
strSQL += " '" + txtArtNr.Text + "', '" + txtBestNr.Text + "', '" + txtLfDatum.Text + "', '" + lblReDatum.Text + "',";
strSQL += " " + myMenge + ", " + myEPreis + ")";
txtEPreis2.Focus();
weiter = "2";
}
 
Anzeige
Anzeige