C# Fehler beim abspeichern meiner Daten

Horst1945

Cadet 4th Year
Registriert
Okt. 2014
Beiträge
106
Ich wollte in meiner Testdatenbank folgende Daten einfügen:

Hier die Datenbank:

datenbank.jpg

Code:
        private void PreisBerechnen4(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (Char)Keys.Enter)
            {
                // 1. Artikel berechen
                if (weiter == "1")
                {
                    
                    MwSt1 = 0;
                    txtGesPreis6.Text = myBerechnen.berechnenX(txtMenge6.Text, txtEPreis6.Text, txtRabatt6.Text); // In die Klase
                    //Berechen EPreis
                    myMenge = Convert.ToInt32(txtMenge6.Text);
                    berech = Convert.ToDouble(txtGesPreis6.Text);
                    berech = Math.Round(berech, 2, MidpointRounding.AwayFromZero);
                    myEPreis = Convert.ToDouble(txtEPreis6.Text);
                    myEPreis = Math.Round(myEPreis, 2, MidpointRounding.AwayFromZero);
                    if (Convert.ToDouble(txtRabatt6.Text) > 0)
                    {
                        myrabatt = (Convert.ToDouble(txtMenge6.Text) * Convert.ToDouble(txtEPreis6.Text) / 100) * Convert.ToDouble(txtRabatt6.Text);
                        myrabatt = Math.Round(myrabatt, 2, MidpointRounding.AwayFromZero);
                        //myRabatt = String.Format("{0:0.00}", myrabatt);
                    }
                    else
                    {
                        myrabatt = 0; ;
                    }

                    
                    myVersand = Convert.ToDouble(txtVersand.Text);
                    txtGesPreis6.Text = String.Format("{0:c}", berech);
                    //Zwischensumme schreiben 1.Artikel
                    txtZWSumme.Text = String.Format("{0:c}", berech);
                    //Berechnen der MwSt und schreibem 1.Artikel
                    MwSt1 = (berech / 100) * MwSt;
                    MwSt1 = Math.Round(MwSt1, 2, MidpointRounding.AwayFromZero);
                    //myMwSt = Convert.ToString(MwSt1);
                    txtMwSt.Text= String.Format("{0:c}", MwSt1);                    //Berechnen Gesamt
                    EndErg = berech + MwSt1;
                    myBrutto = berech;
                    myRabatt = myrabatt;
                    myNetto = EndErg;
                    txtGesSumme.Text = String.Format("{0:c}", EndErg);

                    strSQL = "Insert into Rechnung22 (kdnr, renr, lfnr, artnr, bestnr, liefdatum, redatum, menge, epreis) values "; 
                    strSQL += "('" + txtKdnr.Text + "', '" + txtReNr.Text + "' ,'" + lblLfNr.Text + "',  '" + txtArtNr.Text + "' ,'" + lblBestNr.Text + "' ,";
                    strSQL += " '" + lblLiefdat.Text + "', '" + lblReDatum.Text + "', '" + myMenge + "' , '" + myEPreis + "')"; 
                    
                    weiter = "2";
                    txtEPreis7.Focus();
                }

Aber wenn ich der Daten abspeichern will, bekomme ich immer diese Fehlermeldung:


Rechnung.jpg

Was mache ich verkehrt?
 
Hallo Horst,

ich kenn' mich zwar nicht mit der Microsoft DB aus, aber was mir komisch erscheint ist:

1) In deiner Datenbank ist der Epreis ein Float (Gleitkomma 32bit), dein Textfeld konvertierst du aber in einen Double (Gleitkomma 64bit).
Das kannst du machen, macht aber relativ wenig Sinn.
2) Ansonsten erscheint mir deine Interaktion mit der DB recht altertümlich mit der Stringübergabe... vll. liegt hier ja der Fehler?
Kannst du nicht stattdessen eine Add-Methode deines Connectors benutzen?

Wie auch immer mach' dich ran ans Debuggen und schau nach wo er rausfliegt und lies' dir dann die Exception durch, da sollte dann alles Wesentliche drinstehen.

MfG
Henrik
 
Examon schrieb:
Wie auch immer mach' dich ran ans Debuggen und schau nach wo er rausfliegt und lies' dir dann die Exception durch, da sollte dann alles Wesentliche drinstehen.

MfG
Henrik

Da kann ich nur beipflichten, Debugger anschmeißen, Breakpoint setzen am Anfang der Methode und nachvollziehen wann er aussteigt. Alles andere wird vermutlich zur Hexenjagd. :)
 
Spontan würde es mich eher wundern, wenn man string("9,75 €") über convert.todouble konvertieren könnte, ohne dass es einen Fehler gibt.
 
Hallo,

erst einmal ein schönen Dank für Eure Antwort.

Ich habe leider beim Debuggen nur den Fehler "myEPreis" festgestellt, denn als ich im strSQL = "Insert into Rechnung22 (kdnr, renr, lfnr, artnr, bestnr, liefdatum, redatum, menge "entfernt epreis") und myEPreis entfernt habe, da wurden die Daten in der Datenbank geschrieben.

Ausgabe1.jpg
 
Hallo Horst1945,

abgesehen davon, dass die anderen Recht haben, was die Implementierung der Datenbank angeht - hier solltest du eher die SQL Connections von C# nutzen - liegt wohl hier der Fehler:
Code:
 strSQL += "('" + txtKdnr.Text + "', '" + txtReNr.Text + "' ,'" + lblLfNr.Text + "', '" + txtArtNr.Text + "' ,'" + lblBestNr.Text + "' ,";
strSQL += " '" + lblLiefdat.Text + "', '" + lblReDatum.Text + "', '" + myMenge + "' , '" + myEPreis + "')"
Du speicherst myEPreis als string ab, die Datenbank erwartet aber einen Float wert. Außerdem fehlt in dem Code am Ende innerhalb des SQL Commands sowie am ende des Codes der Zeile 46 ein Semikolon. Ich habe Sie in mein Beispiel eingefügt.
Versuchs doch mal so:
Code:
 strSQL += "('" + txtKdnr.Text + "', '" + txtReNr.Text + "' ,'" + lblLfNr.Text + "', '" + txtArtNr.Text + "' ,'" + lblBestNr.Text + "' ,";
strSQL += " '" + lblLiefdat.Text + "', '" + lblReDatum.Text + "', '" + myMenge + "' , " + myEPreis + ");";
 
- Preise speichert man nicht als Gleitkommazahl, viel zu ungenau. Man nimmt entweder einen Ganzzahl oder Decimal.
- Die Menge als Ganzzahl zu speichern kann je nach Art der Ware auch mal nach hinten losgehen.
- Das Datum als Zeichenkette...
 
Das layout der Tabelle ist eigentlich mist, das stimmt. Aber Preise als Ganzzahl? Du meinst integer? Wie soll er da Komma Preise berücksichtigen?
 
Wenn man zwei Nachkommastellen möchte, einfach mit 100 multiplizieren bzw. dividieren.
Das ist natürlich nur eine simple Methode, besser sind Datenstrukturen wie Decimal.
 
Auf jeden Fall ist da dezimal besser. Ist doch total käse wenn das jedes mal umgerechnet wird. Das ist verschwendete Leistung. Das mag bei einem Rechner nichts ausmachen aber wenn das komplex wird merkt man den käse. Dann lieber gleich richtig.

Um beim Thema zu bleiben:
Schau dir mal Datenbank Strukturen an. Datum im Datumsformat in die Tabelle. Artikelnummern wenn sie numerisch aus als integer, dass Steve bei Kunden-, Rechnungs- und Bestellnummer .
Wie gesagt solltest du auch versuchen die vorhandenen Prozeduren von C# nutzen um die Daten in die Datenbank zu schreiben. Das ist nicht nur komfortabler sondern auch deutlich performamter.
 
BCBO1991 schrieb:
Auf jeden Fall ist da dezimal besser. Ist doch total käse wenn das jedes mal umgerechnet wird. Das ist verschwendete Leistung. Das mag bei einem Rechner nichts ausmachen aber wenn das komplex wird merkt man den käse. Dann lieber gleich richtig.

Um beim Thema zu bleiben:
Schau dir mal Datenbank Strukturen an. Datum im Datumsformat in die Tabelle. Artikelnummern wenn sie numerisch aus als integer, dass Steve bei Kunden-, Rechnungs- und Bestellnummer .
Wie gesagt solltest du auch versuchen die vorhandenen Prozeduren von C# nutzen um die Daten in die Datenbank zu schreiben. Das ist nicht nur komfortabler sondern auch deutlich performamter.

ich hatte zuvor mein Faktura-Programm im VB 6 geschrieben und habe dieses über 10 Jahre genutzt. Aber es hat sich mittlerweile vieles auf dem
Computermarkt und Software geändert!

Ich wollte also mein Faktura-Programm deshalb auch ein neuen anstrich verpassen und versuche es in C# zu realisieren.

Da ich Neuling in C#, habe ich halt meine Schwierigkeiten mit C#.

Die Routine "Lieferschein schreiben/editieren " "Stammtdaten schreiben/editieren" klapp, nur mit der Rechnung schreiben haperte es so.
 
Zuletzt bearbeitet:
Heißt der Neuanstrich "C#" oder meinst damit "geeignete Datentypen und Methoden". Der größte Unterschied zw. C# und VB ist mMn die Syntax. Es gibt in beiden Sprachen equivalente Datentypen, also hast du auch schon in VB Daten als Zeichenketten gespeichert?

So wie ich das sehe, versuchst du nur mit ach und krach ein VB-Programm nach C# zu portieren. "Hauptsache es läuft". Die Features, die dir C# bzw. das .Net Framework zu bieten hat nutzt du dagegen nicht. Wenn du dadurch C# lernen willst, wäre das doch ideal, sich auch damit zu befassen. Ideen wurden ja schon mehrfach auch in deinen anderen Threads genannt.
 
So ich habe meine Daten / Tabelle geändert:

datenbank_neu.jpg

und so die Preisberechnen geändert.

Im der Insert-Klause sind 15 Tabellen-Felder und entsprechen so viele Values-Klause

Insert-Klausel

Code:
strSQL = "Insert into Rechnung22 (jahr, kdnr, renr, lfNr, artnr, bestnr, liefdatum, redatum, menge, epreis, rabatt, rbsum, brutto, mwst, netto)";

Values-Klause

Code:
strSQL += " values( " + myJahr + ", '" + txtKdNr.Text + "', '" + txtReNr.Text + "', '" + txtLfNr.Text + "',";
                    strSQL += " '" + txtArtNr.Text + "', '" + txtBestNr.Text + "', '" + txtLfDatum.Text + "', '" + lblReDatum.Text + "', " + myMenge + ", " + myEPreis + ", ";
                    strSQL += " '" + txtRabatt.Text + "', " + myProzent + ", " + myGesSum + ",  " + myMwSt + ", " + myEndPreis + ")";

Obwohl auch 15 Daten in der Values-Klause stehen, bekomme ich die Fehlermeldung:

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.

Horst
 
Zuletzt bearbeitet:
Warum hast du das Jahr als nchar und nicht als integer? Das Jahr ist doch immer eine Zahl? Des Weiteren solltest du bei Rechnungs- und Lieferdatum den Datentyp auf DateTime setzen.
Wenn du das Programm produktiv nutzen willst rate ich dir dich mit relationalen Datenbank Strukturen zu beschäftigen.
Um die Daten sauber in die Datenbank zu schreiben schatz die die System.Data.SqlConnection Klasse an.
Hier findest du ein how-to wie du so eine Verbindung aufbaust.
 
BCBO1991 schrieb:
Warum hast du das Jahr als nchar und nicht als integer? Das Jahr ist doch immer eine Zahl? Des Weiteren solltest du bei Rechnungs- und Lieferdatum den Datentyp auf DateTime setzen.
Wenn du das Programm produktiv nutzen willst rate ich dir dich mit relationalen Datenbank Strukturen zu beschäftigen.
Um die Daten sauber in die Datenbank zu schreiben schatz die die System.Data.SqlConnection Klasse an.
Hier findest du ein how-to wie du so eine Verbindung aufbaust.

Alles gut und schön, must ich mir einmal überlegen bzw. einmal darüber nachdenken.

Das Rechnungsmodul ist z.Z. nur eine Testversion und da habe ich eben meine kleine Schwierigkeiten. die Fehlermeldung ist derzeit mein Problem und den muss ich erst einmal beheben. Aber vor lauter Baustellen finde ich den Fehler nicht!
Ergänzung ()

So jetzt bin ich Schrittweis mit dem abspeichern vorgegangen, es hat auch bist Rabatt geklappt.

Wenn ich ein das Tabellen-Feld "RBSum" in der Insert-Klause hinzufüge und in der Values-Klause " + myPronzent + " einfüge
und das abspeichern will bekomme ich die Fehlermeldung

Hier die Übersicht der Abspeicherung:

abspeichern.jpg

Horst
 
BCBO1991 schrieb:
Welche Fehlermeldung kommt denn?

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.
 
Gib doch einfach nach dem erstellen von strSQL den String einmal in der Konsole aus: Console.WriteLine(strSQL)
 
So nach langem hin und her habe ich festgestellt das die TextBox EPreis ein Komma intus hat und aus diesem Grund bei der Abspeicherung den Fehler verursacht :

Code:
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";
                }

Wie muss ich das machen, das der Fehler behoben wird.
 
Zuletzt bearbeitet:
Datum sagte ich ja: nimm die in C# dafür vorgesehene Funktion. Du hast sonst immer wieder Fehlerquellen dein die total unnötig sind.
 
Zurück
Oben