myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Wie kann ich bei einem Datenbank-Update-Query mit OleDb alle erforderlichen Parameter mitgeben?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich bei einem Datenbank-Update-Query mit OleDb alle erforderlichen Parameter mitgeben?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
knrd__ knrd__ ist männlich
myCSharp.de-Mitglied

Dabei seit: 12.05.2020
Beiträge: 3


knrd__ ist offline

Wie kann ich bei einem Datenbank-Update-Query mit OleDb alle erforderlichen Parameter mitgeben?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: <SQL>

Hallo erstmal, ich bin neu hier, also geht gut mit mir um, wenn ich etwas falsch mache. Ich muss mich hier erstmal einfinden :)
Ich habe alle grundlegenden Regeln und Hinweise gelesen, bitte aber trotzdem um Entschuldigung, wenn ich etwas falsch gemacht habe. Bitte weist mich auch darauf hin- Vielen Dank :)

Ich bin gerade in meiner Ausbildung und im Zuge dieser Ausbildung gerade in einer Projektarbeit, in der man ein Lagersystem programmieren soll.
Dazu sollen wir die "Forms-Apps" nutzen, in der ich das auch hier gerade programmiere.
Mein Fehler gerade besteht darin, dass ich keine Ahnung habe, wieso mir die ganze zeit die folgende Fehlermeldung ausgegeben wird:

Fehlermeldung:
System.Data.OleDb.OleDbException: "Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."

Ich versuche gerade mithilfe eines OleDBCommands und eines Update-Befehls, Daten in die Datenbank zu schreiben. Das Prinzip und alles ist klar, aber irgendwo muss ich, laut der Fehlermeldung, etwas vergessen haben.
Wäre cool, wenn mir jemand oder wenn ihr mir weiterhelfen könntet.
Hier der vollständige Code der Form "ArtikelBearbeiten":
Tut mir leid, falls das etwas unaufgeräumt aussieht, aber das liegt dann an der Seite, weil ich immer versuche meinen Code perfekt ordentlich zu halten :)
Der Fehler tritt also in den letzten Zeilen auf, bei der "cmd.ExecuteNonQuery();" steht.

C#-Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace Projektarbeit2020
{
    public partial class ArtikelBearbeiten : Form
    {
        OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=database.accdb");
        OleDbCommand cmd = new OleDbCommand();
        OleDbDataReader dr = null;
        OleDbDataAdapter adapter = new OleDbDataAdapter();
        DataSet ds0 = new DataSet();
        DataSet ds1 = new DataSet();
        DataSet ds2 = new DataSet();
        public ArtikelBearbeiten()
        {
            InitializeComponent();
        }

        private void ArtikelBearbeiten_Load(object sender, EventArgs e)
        {
            NummerComboBox.Items.Clear();
            try
            {
                //Füllen der Combobox (Nummern)
                cmd = new OleDbCommand("SELECT Artikel_Nummer FROM Artikel", con);
                con.Open();
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    NummerComboBox.Items.Add(dr.GetInt32(0));
                }
                con.Close();
            }
            catch (Exception a)
            {
                MessageBox.Show("Combobox-Füll-Fehler: \n" + a);
                con.Close();
            }

            //Einheitstabelle füllen
            try
            {
                adapter = new OleDbDataAdapter("SELECT Einheit_Nummer, Einheit_Bezeichnung FROM Einheit", con);
                adapter.Fill(ds0, "EinheitUebersicht");
                Einheitstabelle.DataSource = ds0;
                Einheitstabelle.DataMember = "EinheitUebersicht";
            }
            catch (Exception a)
            {
                MessageBox.Show("Einheitstabelle-Füll-Fehler: \n" + a);
            }

            //Lagertabelle füllen
            try
            {
                adapter = new OleDbDataAdapter("SELECT Lager_Nummer, Lager_Bezeichnung FROM Lager", con);
                adapter.Fill(ds1, "LagerUebersicht");
                Lagertabelle.DataSource = ds1;
                Lagertabelle.DataMember = "LagerUebersicht";
            }
            catch (Exception a)
            {
                MessageBox.Show("Lagertabelle-Füll-Fehler: \n" + a);
            }


        }

        private void NummerComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                adapter = new OleDbDataAdapter("SELECT * FROM Artikel WHERE Artikel_Nummer=" + NummerComboBox.SelectedItem, con);
                ds2.Clear();
                adapter.Fill(ds2, "Artikel");
                Bezeichnung.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Bezeichnung"].ToString();
                Lagerpreis.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Lagerpreis"].ToString();
                Einkaufspreis.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Einkaufpreis"].ToString();
                Meldebestand.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Meldebestand"].ToString();
                AktuellerBestand.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Aktueller_Bestand"].ToString();
                Einheitsnummer.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Einheit_Nummer"].ToString();
                Lagernummer.Text = ds2.Tables["Artikel"].Rows[0]["Artikel_Lager_Nummer"].ToString();
                AktivCheckb.Checked = (bool)ds2.Tables["Artikel"].Rows[0]["Artikel_Ist_Aktiv"];
            }
            catch(Exception a)
            {
                MessageBox.Show("NummerComboBox-Füll-Fehler: \n" + a);
            }
        }

        private void Speichern_Click(object sender, EventArgs e)
        {
            bool CbZustand;
            if (AktivCheckb.Checked == true)
            {
                CbZustand = true;
            }
            else
            {
                CbZustand = false;
            }
            /*
            adapter.UpdateCommand = new OleDbCommand("UPDATE Artikel SET Artikel_Bezeichnung=" + Bezeichnung.Text + ", Artikel_LagerPreis=" + Lagerpreis.Text + ", Artikel_EinkaufPreis=" + Einkaufspreis.Text + ", Artikel_Meldebestand=" + Meldebestand.Text + ", Artikel_Aktueller_Bestand=" + AktuellerBestand.Text + ", Artikel_Einheit_Nummer=" + Einheitsnummer.Text + ", Artikel_Lager_Nummer=" + Lagernummer.Text + ", Artikel_Ist_Aktiv=" + CbZustand + " WHERE Artikel_Nummer='" + NummerComboBox.SelectedItem + "'", con);


            con.Open();
            adapter.UpdateCommand = con.CreateCommand();
            adapter.UpdateCommand.CommandText = "update Artikel set Artikel_Bezeichnung=Hallo where Artikel_Nummer=1";
            adapter.UpdateCommand.ExecuteNonQuery();
            con.Close();
            */


            con.Open();
            OleDbCommand cmd = new OleDbCommand("UPDATE Artikel SET Artikel_Bezeichnung=" + Bezeichnung.Text + ", Artikel_LagerPreis=" + Lagerpreis.Text + ", Artikel_EinkaufPreis=" + Einkaufspreis.Text + ", Artikel_Meldebestand=" + Meldebestand.Text + ", Artikel_Aktueller_Bestand=" + AktuellerBestand.Text + ", Artikel_Einheit_Nummer=" + Einheitsnummer.Text + ", Artikel_Lager_Nummer=" + Lagernummer.Text + ", Artikel_Ist_Aktiv=" + CbZustand + " WHERE Artikel_Nummer='" + NummerComboBox.SelectedItem.ToString() + "'", con);
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }
}

Falls ihr noch Informationen braucht, bin ich aufgeschlossen diese bereitzustellen :)
Danke LG
knrd
12.05.2020 13:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.817
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du gibst an, dass Du mit SQL arbeitest - MSSQL?
Wenn ja, wieso verwendest Du dann OleDb? Es gibt für alle großen SQL Server ordentliche ADO.NET Implementierungen.
OleDb brauchst Du fast nie (wenn dann zB für Excel oder Access).

Ansonsten: bitte keine String-Frickerelein bei SQL Statements.
 [Artikelserie] SQL: Parameter von Befehlen
Dein Code ist voll von SQL Injection Risks - neben Folgefehlern von Typbehandlungen (Du behandelst quasi alle Strings im SQL Command falsch).

Wenn Du ordentlich mit Parametern arbeitest, dann wird vermutlich der Fehler von alleine verschwinden.

Allgemein: Datenbank-Code hat im UI Code nichts zu suchen.
 [Artikel] Drei-Schichten-Architektur

PS: aus

C#-Code:
bool CbZustand;
            if (AktivCheckb.Checked == true)
            {
                CbZustand = true;
            }
            else
            {
                CbZustand = false;
            }

Kann man einfach

C#-Code:
bool CbZustand = AktivCheckb.Checked;

machen.

Prefixe an Variablen macht man in C# normalerweise nicht; das kommt leider aus anderen Sprachen rüber geschwappt.
 [Artikel] C#: Richtlinien für die Namensvergabe
12.05.2020 13:56 Beiträge des Benutzers | zu Buddylist hinzufügen
knrd__ knrd__ ist männlich
myCSharp.de-Mitglied

Dabei seit: 12.05.2020
Beiträge: 3

Themenstarter Thema begonnen von knrd__

knrd__ ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Alles klar, danke.
Es ist bloß so, dass ich noch so ziemlich am Anfang bin und wir lernen das so. Da kann ich ja nichts dafür :D
In meiner Ausbildung bekommen wir das so beigebracht. Vielleicht sind die Lehrer auch einfach etwas weniger in der heutigen Zeit vorhanden ;D

Ich hatte das vorher einfach auch verwechselt. Wir arbeiten mit einer Access Datenbank im Hintergrund. Somit hilft mir das leider nicht.
-> Wir lernen das leider so und anders kenne ich das auch nicht.

Man soll zwar nicht nach fertigen Antworten fragen, aber ich habe den Post extra erstellt um diesen Fehler aus der Welt zu bringen.
Ich habe an diesem Fehler auch schon 4 Stunden gesessen, weil mein Teampartner und ich das nicht herausfinden, wo dieser Fehler herkommt.

Ist mir denn ein so offensichtlicher Fehler im Code unterlaufen, dass wir beide den komplett übersehen. Nach dem Motto: "Zu einfach für das Gehirn" :D

LG
12.05.2020 14:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.817
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Offensichtlich Fehler ist primär:
Ihr erzeugt nicht nur potentiell unsicheren SQL Code, sondern vor allem auch ungültigen SQL Code, weil ihr den SQL Command - besonders im Falle der Strings - falsch zusammen baut.
Die Werte der Typen landen nicht im korrekten Format im SQL Code, zB. fehlen überall bei Strings Hochkomma => Resultiert im SQL Fehler.

Das kann nicht passieren, wenn ihr mit Parametern arbeitet.
Steht alles in  [Artikelserie] SQL: Parameter von Befehlen
Geht auch mit Access.

Umschreiben werde ich Dir Deine Hausaufgaben aber nicht, sorry :-)
Du sollst selbst was dabei lernen.
12.05.2020 14:40 Beiträge des Benutzers | zu Buddylist hinzufügen
knrd__ knrd__ ist männlich
myCSharp.de-Mitglied

Dabei seit: 12.05.2020
Beiträge: 3

Themenstarter Thema begonnen von knrd__

knrd__ ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hier nochmal das Bild, zur Vollständigkeit zu liebe

knrd__ hat dieses Bild (verkleinerte Version) angehängt:
l_rHRz1jQySWsm8IANGM2A.jpg
Volle Bildgröße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von knrd__ am 12.05.2020 14:51.

12.05.2020 14:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.817
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich hab das extern verlinkte Bild gemäß der Hinweise in  [Hinweis] Wie poste ich richtig? entfernt.

Aber nochmal:
Verwende Parameter und der Fehler ist vermutlich weg.
12.05.2020 14:47 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.817
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Welchen Sinn hat es, dass Du meinen Beitrag mit dem Kommentar meldest, dass ich Deine Frage nicht beantworten würde?
12.05.2020 14:58 Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.378
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du solltest dir die verlinkten Artikel wirklich mal anschauen, bevor du dich beschwerst. Abt hat die ja nicht für umsonst gepostet.
12.05.2020 15:04 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.05.2020 17:17