C# Fehler beim abspeichern meiner Daten

So ich habe es einmal mit Parameters versucht:

Code:
SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
                    mySqlCommand.CommandText = "insert into 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;

und erscheint die Fehlermeldung : "Falsche Syntax in nähe von 'rechnung'"
Ergänzung ()

Ich hatte wieder einen klein Fehler eingebaut, anstatt Insert into, hatte ich Insert imto geschrieben
Ergänzung ()

Kann ich das folgende:

Code:
SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
                    mySqlCommand.CommandText = "insert into rechnung (jahr, monat, kdnr, renr,lfnr, artnr, bestnr, liefdatum, redatum, menge, epreis, rabatt, rbsum, brutto, mwst, netto)";
                    mySqlCommand.CommandText += " values (@jahr, @Monat, @Kdnr, @ReNr, @LFnr, @Artnr, @bestNr, @LFDatum, @ReDatum, @Menge, @Epreis, @Rabatt, @RbSum, @Brutto, @MwSt, @Netto)";
                    mySqlCommand.Parameters.Add("@jahr", SqlDbType.Int);
                    mySqlCommand.Parameters.Add("@Monat", SqlDbType.Int);
                    mySqlCommand.Parameters.Add("@Kdnr", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@ReNr", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@LFnr", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@ArtNr", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@BestNr", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@LFDatum", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@ReDatum", SqlDbType.NChar, 10);
                    mySqlCommand.Parameters.Add("@Menge", SqlDbType.Int);
                    mySqlCommand.Parameters.Add("@EPreis", SqlDbType.Float);
                    mySqlCommand.Parameters.Add("@Rabatt", SqlDbType.NChar, 2);
                    mySqlCommand.Parameters.Add("@RbSum", SqlDbType.Float);
                    mySqlCommand.Parameters.Add("@Brutto", SqlDbType.Float);
                    mySqlCommand.Parameters.Add("@MwSt", SqlDbType.Float);
                    mySqlCommand.Parameters.Add("@netto", SqlDbType.Float);
                    
                    

                    mySqlCommand.Parameters["@jahr"].Value = myNJahr;
                    mySqlCommand.Parameters["@Monat"].Value = myMMomat;
                    mySqlCommand.Parameters["@Kdnr"].Value = txtKdNr.Text;
                    mySqlCommand.Parameters["@ReNr"].Value = txtReNr.Text;
                    mySqlCommand.Parameters["@LFnr"].Value = txtLfNr.Text;
                    mySqlCommand.Parameters["@ArtNr"].Value = txtArtNr.Text;
                    mySqlCommand.Parameters["@Bestnr"].Value = txtBestNr.Text;
                    mySqlCommand.Parameters["@LFDatum"].Value = txtLfDatum.Text;
                    mySqlCommand.Parameters["@ReDatum"].Value = lblReDatum.Text;
                    mySqlCommand.Parameters["@Menge"].Value = myMenge;
                    mySqlCommand.Parameters["@Epreis"].Value = myEPreis;
                    mySqlCommand.Parameters["@Rabatt"].Value = txtRabatt.Text;
                    mySqlCommand.Parameters["@RbSum"].Value = myProzent;
                    mySqlCommand.Parameters["@Brutto"].Value = myGesSum;
                    mySqlCommand.Parameters["@MwSt"].Value = myMwSt;
                    mySqlCommand.Parameters["@Netto"].Value = myEndPreis;


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


in einer Klasse oder in einer Functiom unterbringen?

Denn es können bis zu 10 Datensätze gespeichert werden.
 
Zuletzt bearbeitet:
Es geht, ob du es kannst ist eine andere Frage. Ich hätte gedacht, dass du mittlerweile schon etwas versiert bist, was die Syntax von C# angeht. Oder wo genau liegt das Problem?

Besondere Herausforderung: Erstelle eine Methode, die einen SqlParameter mit Parametername, Typ und Wert erstellt. Dadurch würde dein obiger Code um fast die Hälfte schrumpfen.
 
Darlis schrieb:
Es geht, ob du es kannst ist eine andere Frage. Ich hätte gedacht, dass du mittlerweile schon etwas versiert bist, was die Syntax von C# angeht. Oder wo genau liegt das Problem?

Besondere Herausforderung: Erstelle eine Methode, die einen SqlParameter mit Parametername, Typ und Wert erstellt. Dadurch würde dein obiger Code um fast die Hälfte schrumpfen.

Na, wenn das gehen soll, dann gebe mir doch einmal ein Beispiel zur Hand. das wäre für mich ein schöne Hilfe.
 
Ich spar mir mal den Link zu einem Tutorial:
Code:
private void schreibeDatenInDieDatenbank(int jahr, byte monat, etc., ...){
  // hier dein Code
}
Ergänzung ()

Ach ja, bevor die nächste Frage kommt: Aufruf mit
Code:
schreibeDatenInDieDatenbank(myNJahr, myMMonat, ect., ...);
 
Darlis schrieb:
Besondere Herausforderung: Erstelle eine Methode, die einen SqlParameter mit Parametername, Typ und Wert erstellt. Dadurch würde dein obiger Code um fast die Hälfte schrumpfen.

Ist gar nicht nötig.

Code:
SqlParameterCollection.Add()
gibt den erstellten Parameter zurück. Man kann diesen also direkt verwenden:

Code:
mySqlCommand.Parameters.Add("@jahr", SqlDbType.Int).Value = myNJahr;

Damit ich dich komplett verwirre:
Am Besten wäre es eine Klasse zu haben, welche die Daten aus der Datenbank abbildet.

Dann kannst du ein Array/Liste an eine Methode geben und den Insert Befehl zusammen bauen:

Code:
INSERT INTO Fakturen (Id, Name) VALUES (@Id0, @Name0), (@Id1, @Name1)

Code:
private void WriteToDatabase(SqlConnection connection, IList<Faktura> fakturen)
{
    // Grund SQL-Abfrage
    var sql = "INSERT INTO... VALUES";

    // Liste mit Value strings
    var valueList = new List<string>();

    for (int index = 0; index < fakturen.Count; index++)
    {
        // sql für aktuelle Werte bestimmen
        string values = "(@Id" + i + ", @Name" + i + ")";

        // aktuelle Values zu der Liste hinzufügen
        valueList.Add(values);

        // benötigte Parameter setzen
        command.Parameters.Add("@Id" + i, SqlDbType.int).Value = fakturen[i].Id;
        command.Parameters.Add("@Name" + i, SqlDbType.nchar, 120);
        if (string.IsNullOrEmpty(fakturen[i].Name))
        {
             command.Parameters["@Name" + i] = DBNull.Value;
        }
        else
        {
            command.Parameters["@Name" + i] = fakturen[i].Name;
        }
    }
    // sql zusammen fügen
    sql+= " " + string.Join(",", valueList) + ";";

    // sql abschicken
    SqlCommand command = connection.CreateCommand();
    command.CommandText = sql;
    [...]
}

Falls dir das zu kompliziert ist, dann würde ich es so veruschen:
1. SQL Query zusammen bauen und Parameter hinzufügen. (Zeile 1-19 aus deinem obigen Beispiel) und den Command in deiner Klasse als Variable halten
2. In einer 2. Methode die Werte der Parameter setzen (Zeile 23-43) und den Query abschicken. Diese 2. Methode kannst du dann so oft du willst abschicken.

Kleine Anmerkung noch am Rande: Der Value eines Parameters darf nicht "null" sein. Solltest du also leere Felder haben, dann musst du statt "null"
Code:
DBNull.Value
speichern.
 
Zuletzt bearbeitet:
Zurück
Oben