Zum Inhalt springen

[C#] Probleme bei Hinzufügen eines Datenbankeintrags


Empfohlene Beiträge

Geschrieben

Erstmal ein herzliches Hallo an alle!

Da ich ab August mit meiner Ausbildung als Fachinformatiker Anwendungsentwicklung anfange, dachte ich mir melde ich mich hier schonmal an. Denn es gibt bestimmt öfters mal Situationen wo man hier nachlesen/nachfragen kann.

Jetzt aber mal zum Topic:

Da ich wie schon gesagt bald mit meiner Ausbildung anfange wollte ich mich etwas mit Datenbanken beschäftigen, da dies ein Thema war, was bei meinem Fachabitur (Elektrotechnik - Schwerpunkt Informationstechnik) nur kurz mal angeschnitten wurde. Um es genau zu sagen haben wir eigentlich nur Modelle entworfen (ERM) und etwas mit SQL ausprobiert.

Ich wollte, bzw. mache gerade, nun ein Programm, welches mit einer Acess Datenbank kommuniziert, um verschiedene Daten abzufragen.

Im folgenden Stelle ich es einfach mal eben vor und mein Problem kommt dann danach.

Vorstellung:

Also das Programm soll eine kleine Lagerverwaltung sein. Man kann die Artikelliste aufrufen (nacher auch drin suchen) und auch neue Artikel hinzufügen.

vorschau_1.png

Um diese Sachen abzuspeichern dient die Access-Datenbank, in der es eine Tabelle mit dem Namen Artikel und eine Tabelle mit dem Namen Artikelgruppe gibt. Diese stehen in einer 1:n Beziehung zueinander.

vorschau_3.png

Also meine bisherige Errungenschaft ist, dass ich die Tabelle Artikelgruppe in einem DataGridView ziegen kann. Außerdem kann ich auch neue hinzufügen, welche sich in der Access-Datenbank auch abspeichern.

OleDbConnection verbindung = new OleDbConnection();

OleDbCommand abfrage = new OleDbCommand();

BindingSource bindingSource = new BindingSource();

OleDbDataAdapter adapter = new OleDbDataAdapter();

OleDbParameter parameter = new OleDbParameter();

DataSet datencontainer = new DataSet();

Methode die die Artikelgruppen-Tabelle ins Datagrid stellt:

private void ArtikelgruppenAufrufen()

{

datencontainer.Clear();

// Festlegen des Kommandos

abfrage.CommandText = "Select * from Artikelgruppe";

// Zuweisen des Kommandos an das DataAdapter-Objekt

adapter.SelectCommand = abfrage;

verbindung.Open();

adapter.Fill(datencontainer, "tabelle");

verbindung.Close();

// BindingSource-Objektes mit der Datenquelle verbinden

bindingSource.DataSource = datencontainer;

bindingSource.DataMember = "tabelle";

// Eigentliche Datenanbindung an das DataGridView

dataGridView1.DataSource = bindingSource;

}

Neue Artikelgruppe hinzufügen:

ArtikelgruppenAufrufen();

DataTable tabelle = datencontainer.Tables["tabelle"];

DataRow zeile = tabelle.NewRow();

zeile["Artikelgruppe"] = textBox5.Text;

zeile["Beschreibung"] = textBox1.Text;

tabelle.Rows.Add(zeile);

abfrage.CommandText = "Insert into Artikelgruppe(Artikelgruppe, Beschreibung) Values (@Artikelgruppe, @Beschreibung)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@Beschreibung", OleDbType.LongVarChar);

parameter.SourceColumn = "Beschreibung";

adapter.InsertCommand = abfrage;

verbindung.Open();

adapter.Update(datencontainer, "tabelle");

verbindung.Close();

Das funktioniert wie gesagt alles Einwandfrei. Doch bei der Tabelle Artikel stoße ich auf ein Problem. Das Aufrufen an sich klappt. Also man sieht, was alles in der Tabelle drin steht. Doch das hinzufügen von neuen Artikel klappt nicht.

Methode, die die Tabelle Artikel im Datagrid darstellt:

private void ArtikelAufrufen()

{

datencontainer.Clear();

// Festlegen des Kommandos

abfrage.CommandText = "Select * from Artikel";

// Zuweisen des Kommandos an das DataAdapter-Objekt

adapter.SelectCommand = abfrage;

verbindung.Open();

adapter.Fill(datencontainer, "tabelle1");

verbindung.Close();

// BindingSource-Objektes mit der Datenquelle verbinden

bindingSource.DataSource = datencontainer;

bindingSource.DataMember = "tabelle1";

// Eigentliche Datenanbindung an das DataGridView

dataGridView1.DataSource = bindingSource;

}

Der Problemfall... Eigentlich sollte ich hiermit einen neuen Artikel hinzufügen:

ArtikelAufrufen();

DataTable tabelle = datencontainer.Tables["tabelle1"];

DataRow zeile = tabelle.NewRow();

zeile["Artikelgruppe"] = comboBox1.Text;

zeile["ArtikelNr"] = 0;

zeile["Einkaufspreis"] = textBox3.Text;

zeile["Artikelbezeichnung"] = textBox2.Text;

zeile["Mengeneinheit"] = textBox4.Text;

tabelle.Rows.Add(zeile);

abfrage.CommandText = "Insert into Artikel(Artikelgruppe, ArtikelNr, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @ArtikelNr, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@ArtikelNr", OleDbType.Integer);

parameter.SourceColumn = "ArtikelNr";

parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";

parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";

parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";

adapter.InsertCommand = abfrage;

verbindung.Open();

adapter.Update(datencontainer, "tabelle1");

verbindung.Close();

Der Fehler der immer kommt, wenn ich einen Artikel hinzufügen will ist:

Parameter @Artikelbezeichnung hat keinen Standartwert

Ich denke mal, dass hat irgendwas damit zu tun, dass ja die ArtikelNr ein

AutoWert hat. Deswegen habe ich Sie auch nicht als Parameter o.ä. angegben. Denn eigentlich sollte doch die Datenbank dem Programm sagen, dass dort die fortlaufende Zahl hinkommt. Wahrscheinlich liege ich da aber falsch. Ich hoffe mal mir kann irgendwer helfen, damit ich das Programm bis zum Ausbildungsbeginn noch hinbekomme :D

Ach was noch zu sagen ist... Da ja die Artikelgruppe in Beziehung steht muss man ja erst eine Artikelgruppe der Datenbank hinzufügen, damit man einen Artikel hinzufügen kann. Danach wählt der Benutzer in der ComboBox die Artikelgruppe aus. Also da kann eigentlich kein Fehler sein.

Hier eben noch der Code dafür:

private void CBAktualisieren()

{

abfrage.CommandText = "Select Artikelgruppe from Artikelgruppe";

verbindung.Open();

OleDbDataReader datenleser = abfrage.ExecuteReader();

comboBox1.Items.Clear();

while (datenleser.Read())

{

comboBox1.Items.Add(datenleser["Artikelgruppe"]);

}

datenleser.Close();

verbindung.Close();

}

Mit freundlichen Grüßen,

Andi

Geschrieben

Hallo Andi,

das Problem ist hier erstmal, dass Du Deinen Parameter immer überschreibst:

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@ArtikelNr", OleDbType.Integer);

parameter.SourceColumn = "ArtikelNr";

parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";

parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";

parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";

Somit hast Du nur den letzten Wert in "parameter" gespeichert (ebenso wie dafür die Eigenschaften festgelegt.

Gruß,

Thomas

Geschrieben

Hey,

ArtikelgruppenAufrufen();

DataTable tabelle = datencontainer.Tables["tabelle"];

DataRow zeile = tabelle.NewRow();

zeile["Artikelgruppe"] = textBox5.Text;

zeile["Beschreibung"] = textBox1.Text;

tabelle.Rows.Add(zeile);

abfrage.CommandText = "Insert into Artikelgruppe(Artikelgruppe, Beschreibung) Values (@Artikelgruppe, @Beschreibung)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@Beschreibung", OleDbType.LongVarChar);

parameter.SourceColumn = "Beschreibung";

adapter.InsertCommand = abfrage;

verbindung.Open();

adapter.Update(datencontainer, "tabelle");

verbindung.Close();

Aber das mache ich hier doch auch und da kommt kein Fehler. Hier speichert er alles vernünftig ab.

Geschrieben

Du Zuweisung an parameter ist überflüssig.

Bei einem OleDbCommand ist die Reihenfolge der Parameter maßgebend.

Deine Version:

abfrage.CommandText = "Insert into Artikel(Artikelgruppe, ArtikelNr, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @ArtikelNr, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@ArtikelNr", OleDbType.Integer);

parameter.SourceColumn = "ArtikelNr";

parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";

parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";

parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";

Es sollte so aussehen:


abfrage.CommandText = "Insert into Artikel(Artikelgruppe, ArtikelNr, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @ArtikelNr, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";


parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";


parameter = abfrage.Parameters.Add("@ArtikelNr", OleDbType.Integer);

parameter.SourceColumn = "ArtikelNr";


parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";


parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";



parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";


Die Parameter müssen in der Reihenfolge hinzugefügt werden wie sie im CommandText stehen. Du hast Einkaufspreis und Artikelbezeichnung verdreht.

Gruß,

Thomas

Geschrieben

Hallo,

Du kannst anstatt der benannten Parameter auch einfach Fragezeichen nutzen.


INSERT INTO Artikel (Wert1, Wert2) VALUES(?,?)

Wenn Du die Reihenfolge einhälts passt das so.

Viel Spaß noch! :)

Gruß,

Thomas

Geschrieben

So ich hab das jetzt mal ausprobiert, aber jetzt zeigt er mir den gleichen Fehler an nur mit ArtikelNr.

Habe es wie du gezeigt hast eingesetzt. Doch ich denke mal das die ArtikelNr halt nicht geht, weil es ja mit diesem AutoWert in der Acesstabelle angegeben ist. Ich hab jetzt auch erstmal eine 1 gemacht

(zeile["ArtikelNr"] = 1;)

weil ich halt eben nicht wusste wie man das an dieser Stelle macht.

ArtikelAufrufen();

DataTable tabelle = datencontainer.Tables["tabelle1"];

DataRow zeile = tabelle.NewRow();

zeile["Artikelgruppe"] = comboBox1.Text;

zeile["ArtikelNr"] = 1;

zeile["Artikelbezeichnung"] = textBox2.Text;

zeile["Einkaufspreis"] = textBox3.Text;

zeile["Mengeneinheit"] = textBox4.Text;

tabelle.Rows.Add(zeile);

abfrage.CommandText = "Insert into Artikel(Artikelgruppe, ArtikelNr, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @ArtikelNr, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@ArtikelNr", OleDbType.Integer);

parameter.SourceColumn = "ArtikelNr";

parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";

parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";

parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";

adapter.InsertCommand = abfrage;

verbindung.Open();

adapter.Update(datencontainer, "tabelle1");

verbindung.Close();

GUIAktualisieren();

Geschrieben (bearbeitet)

Hi,

lass die Spalte mit dem Autowert beim Command einfach weg:


Insert into Artikel(Artikelgruppe, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";


parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";


parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";


parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";



parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";


So sollte es gehen...

Gruß,

Thomas

Bearbeitet von .NETter
Schreibfehler :-)
Geschrieben

So wir sind schon ein Stückchen weiter :P

Jetzt kommt der Fehler:

"Anzahl der Abfragewerte und Zielfelder stimmt nicht überein!"

Das erkläre ich mir mal damit, dass die ArtikelNr ebenhalt nicht mit eingesetzt wird...

ArtikelAufrufen();

DataTable tabelle = datencontainer.Tables["tabelle1"];

DataRow zeile = tabelle.NewRow();

zeile["Artikelgruppe"] = comboBox1.Text;

zeile["Artikelbezeichnung"] = textBox2.Text;

zeile["Einkaufspreis"] = textBox3.Text;

zeile["Mengeneinheit"] = textBox4.Text;

tabelle.Rows.Add(zeile);

abfrage.CommandText = "Insert into Artikel(Artikelgruppe, ArtikelNr, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";

parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";

parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";

adapter.InsertCommand = abfrage;

verbindung.Open();

adapter.Update(datencontainer, "tabelle1");

verbindung.Close();

GUIAktualisieren();

}

Geschrieben

Das liegt an diesem Statement:


abfrage.CommandText = "Insert into Artikel(Artikelgruppe, [B][I][U]ArtikelNr[/U][/I][/B], Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";


Hier steht immernoch die ArtikelNr!

Geschrieben (bearbeitet)

Wenn man die ArtikelNr wegmacht, dann kommt wieder der Fehlet mit dem Parameter aber diesmal mit @Artikelbezeichnung...

abfrage.CommandText = "Insert into Artikel(Artikelgruppe, Artikelbezeichnung, Einkaufspreis, Mengeneinheit) Values (@Artikelgruppe, @Artikelbezeichnung, @Einkaufspreis, @Mengeneinheit)";

parameter = abfrage.Parameters.Add("@Artikelgruppe", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelgruppe";

parameter = abfrage.Parameters.Add("@Artikelbezeichnung", OleDbType.LongVarChar);

parameter.SourceColumn = "Artikelbezeichnung";

parameter = abfrage.Parameters.Add("@Einkaufspreis", OleDbType.LongVarChar);

parameter.SourceColumn = "Einkaufspreis";

parameter = abfrage.Parameters.Add("@Mengeneinheit", OleDbType.LongVarChar);

parameter.SourceColumn = "Mengeneinheit";

Ich hoffe ich nerv dich jetzt nicht noch.... ich wollte halt nur noch irgendwie das Ding ans laufen kriegen...

Aber ich danke dir sehr auch wenn es nur schleppen vorran geht.

Die nächste Antwort kommt erst heute Abend, weil ich jetzt zum Schwimmen bin. Aber ich würde mich freuen, wenn man das Problem noch köst.

Vielen Dank aber ...

Edit:

Ich hab jetzt einfach mal die Projektdatei dran gehangen

Klicke Hier

Bearbeitet von Der.Andi

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...