Laden...

Hinzufügen eines Datenbankeintrags

Erstellt von Der.Andi vor 13 Jahren Letzter Beitrag vor 12 Jahren 5.800 Views
D
Der.Andi Themenstarter:in
2 Beiträge seit 2010
vor 13 Jahren
Hinzufügen eines Datenbankeintrags

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.

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.

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["Artikelbezeichnung"] = textBox2.Text;
                zeile["Einkaufspreis"] = textBox3.Text;
                zeile["Mengeneinheit"] = textBox4.Text;
                tabelle.Rows.Add(zeile);

              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";


                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

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();
}

Anbei ist noch 1 Bild, was das Programm, die Datenbank und die Beziehung zeigt.
Vieleicht hilft das noch weiter.

Mit freundlichen Grüßen,
Andi

C
2.121 Beiträge seit 2010
vor 13 Jahren

Hi auch

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.

Warum sollte der Fehler mit der ArtikelNr zusammenhängen? Die Meldung bezieht sich auf die Artikelbezeichnung, ich würde erst mal da anfangen zu suchen, ob da auch wirklich ein Wert eingetragen wird.
Hab mir den ganzen Code aber nicht komplett durchgesehen, ist ein bisschen viel für die Wärme hier 😉

D
Der.Andi Themenstarter:in
2 Beiträge seit 2010
vor 13 Jahren

Ich denke das, weil ich ja die ArtikelNr nicht angebe und somit nicht alle Werte im neuen Eintrag vorhanden sind. Zudem denkt das Programm dann, dass das was im Feld ArtikelNr steht vom Parameter Artikelbezechnung gelifert wird. Doch der hat irgendwie den falschen Wert.

Wie gesagt bin ich in der Sache noch ein Jungspund und kann mir nicht zusammenreimen wie es geht.
Das Zufügen von Artikelgruppen klappt ja. Doch da gibt es auch keine Beziehung und keinen AutoWert.

C
2.121 Beiträge seit 2010
vor 13 Jahren

Zudem denkt das Programm dann, dass das was im Feld ArtikelNr steht vom Parameter Artikelbezechnung gelifert wird.

Lustiger Gedankengang 😃 Ich denke wenn da steht dass die Bezeichung fehlt, dann könnte es sich schon lohnen das auch erst mal zu glauben. Warum denkst du da so quer?

Das Zufügen von Artikelgruppen klappt ja. Doch da gibt es auch keine Beziehung und keinen AutoWert.

Das ist ja auch wieder etwas ganz anderes. Ich würde bei der Suche nach einem Fehler schon erst mal bei den Informationen bleiben die mir gegeben werden.
Trag doch z.B. mal in deinem INSERT einen festen Wert für die Bezeichung ein. Dann siehst du was passiert, ob eine weitere Meldung kommt oder nicht. Je nach dem kannst du dann weitersuchen.

5.299 Beiträge seit 2008
vor 13 Jahren

hi Andi!

Du kannst dir mal "Datenbank in 10 Minuten" auf Movie-Tuts angugge, und später noch die anderen Tuts auf der Site.

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren
Abspeichern von Daten direkt in DB

Hallo,
ich habe mit dem Datenbankassistenten eine Datenbank in meiner Windows Form eingebunden.
Jetzt sehe ich in der Entwurfsansicht von Visual Studio 2010 meine angefertigte Datenbank.
Durch das Hinzufügen haben sich auch einige Button hinzugefügt, wie zum Beispiel die Diskette für das Abspeichern.
Nur jetzt soll der Benutzer in der Datenbank Einträge hinzufügen können. Und ich habe bis jetzt keine Idee wie das geht. Hier im Forum, wird nur beschrieben, das die Datenbank per kompletten Quelltext aufgerufen wird, und nicht so in der Art, in der ich das jetzt gelöst habe.
Wäre lieb wenn mir einer einige Links zur Verfügung stellt, in denen ich mich einlesen kann um das Problem zu lösen.

Danke schon einmal im vorraus.

5.299 Beiträge seit 2008
vor 12 Jahren

geht der Link von meim tut nicht mehr?

Hier im Forum, wird nur beschrieben, das die Datenbank per kompletten Quelltext aufgerufen wird... kannichmirnixrechtes drunter vorstellen "Datenbank per kompletten Quelltext aufrufen"

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

mit dem Quelltext mein ich das ich von Visual Studio den Datenbankassistenten verwendet habe:
Schaltfläche Daten-Datenquelle hinzufügen usw.

und nicht richtig als Quelltext ausgeschrieben habe, somit erhalte ich dann direkt in meinem Form-Entwurf, die Oberfläche von meiner Datenbank mit entsprechenden Icons.
Nur jetz wollte ich darin noch editieren, und wie ich das genau anstellen soll, benötige ich Hilfe. 😃

5.299 Beiträge seit 2008
vor 12 Jahren

und jetzt noch meine annere Frage beantworten 🙂

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

Der Link funktioniert soweit wohl, nur ist das nicht alles mit SQL Programmierung?

5.299 Beiträge seit 2008
vor 12 Jahren

probiers doch mal.

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

soweit ich das seh is das alles mit einer älteren Visual Studio Version programmiert worden und mit Visual Basic, leider programmiere ich mit C#, und das Konventieren der einzelnen Programme mislingt, somit kann ich mir die Beispiele nicht angucken..:(

5.299 Beiträge seit 2008
vor 12 Jahren

und wenn du die Site mal durchliest?

weil da gibts ja auch eine c# - solution

Der frühe Apfel fängt den Wurm.

F
10.010 Beiträge seit 2004
vor 12 Jahren

Nein Paddy hat in seinem anderen, bereits gesperrten Thread, gezeigt, das er keine Lust hat Grundlagen zu erlernen, sondern die Lösung haben will.

P
62 Beiträge seit 2011
vor 12 Jahren

@ FZelle,

mit deiner Aussage hast du Unrecht, ich habe im Forum gelesen, das Openbook durchgelesen, und bin danach immer noch nicht auf die Lösung gekommen.
Nach etlichem ausprobieren, habe ich jetzt eine Verbindung zu meiner Datenbank, es hat zwar sehr lange dauert, aber irgendwann hatte ich es dann auch.
Und fertige Lösungen verlange ich wirklich nicht, ich möchte im nächsten Jahr eine Ausbildung als Fachinformatiker-Anwendungsentwicklung machen, und ich weiß selber das ich mir das alles erlernen muss, bzw ausprobieren muss, also erzähl mir bitte nicht das ich fertige Lösungen haben will.

Nun jedoch zu meiner Nächsten Frage:
Mein Programm soll eine sehr einfache Bedienung haben, da ich nun den Aufbau zu meiner Datenbank habe, möchte ich noch durch einen Button eine Aktion durchführen.
Also wenn der Benutzer auf den Button klickt, möchte ich das Microsoft Access 2007 damit gestartet wird, um dort die Filterfunktion nutzen zu können.
Nun öffnet sich beim Klick auf den Button ein Fenster in der ich die Access Datei auswählen kann, jedoch passiert dann nichts mein C# Code:

Ich bitte noch einmal um Hilfe 😃

 private void button5_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Datenbanken (*.accdb)|*accdb|Alle Dateien (*.*)|*.*";
            ofd.Title = "öffnen einer Datenbank";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    StreamReader sr = new StreamReader(ofd.FileName);
                    sr.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, " Datenbank ");
                }
            }
        }
C
131 Beiträge seit 2007
vor 12 Jahren

eine externe Anwendung öffnest du mit


System.Diagnostics.Process.Start(@"c:\windows\notepad.exe");

Gruß
CyberHunter

5.299 Beiträge seit 2008
vor 12 Jahren

...ich habe im Forum gelesen, das Openbook durchgelesen, und bin danach immer noch nicht auf die Lösung gekommen...

Soo viel Recherche-Arbeit hast du schon geleistet, aber am gegebenen Tut scheiterst du?
Weil die Tuts beschäftigen sich genau und ausführlich und grundlegend mit der Thematik "Designergestützte DB-Programmierung".
Habich damals extra gemacht, weils nämlich kaum was vernünftiges zum thema gibt.

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

Okay, mit Process.Start funktionierts einwandfrei.
Danke. 😃
Da ich die Datenbank über den Datenbankassistenten hinzugefügt habe und meine Datenbank dementsprechend lang ist, möchte ich noch das filtern innerhalb meines Programms machen. Dazu habe ich eine Combobox hinzugefügt.
Zunächst habe ich gelesen das ich dann die Combobox mit dem "DataGridView" verknüpfen muss. In einigen Beispielen habe ich gelesen, dass andere Leute das ohne den Datenbankassistenten gelöst haben. Meine Frage ist jetzt, geht das auch, wenn ich den Datenbankassistenten verwendet habe?

5.299 Beiträge seit 2008
vor 12 Jahren

ja und nein.

nein: du kannst keine Combo mit einem DGV verknüpfen. Du kannst sie allerdings an eine BindingSource binden, auch an eine, an die gleichzeitig ein DGV gebunden ist.

Aber du solltest deine Frage genauer stellen, denn es gibt 2 Arten, zu filtern: Einmal über die DataRelations, und einmal, indem man codeseitig einen FilterAusdruck generiert, und an BindingSource.Filter zuweist.

Also was willst du Filtern, und welche FilterBedingung soll erfüllt sein?

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

Ich möchte innerhalb meiner Datenbank eine Spalte filtern.

Um mein Programm mal kurz zu beschreiben, weil ich mit den beiden Begriffen so jetzt nichts anfangen kann:

Der Benutzer soll verschiedene Daten eines Auftrags editieren:
Dazu gehört die Vorgangsnummer, Tätigkeit,Position usw.

Jedoch gibt es später Vorgangnsnummern mit dem selben Namen bzw derselben Zahl, jedoch verschiedene Tätigkeiten. Zur Nachkalkulation soll der Benutzer innerhalb der kompletten Datenbank nur die gesuchte Vorgangsnummer angezeigt bekommen, also wollte ich dann die Spalte "Vorgangsnummer" filtern.

Ich hoffe ich konnte damit ein wenig weiterhelfen. 😃

5.299 Beiträge seit 2008
vor 12 Jahren

Vorgangsnummer ist also eine DataRelation, d.h. es gibt sie als Primkey bei der Vorgang-Tabelle und als ForeignKey bei der Auftrag-Tabelle?

Oder ist Vorgangnummer der Primkey der Auftrag-Tabelle, und es gibt noch untergeordnete Tabellen, die per ForeignKey auf diesen Primkey verweisen?

Du darfst gerne noch weiter Informationen preisgeben, etwa wie die Tabelle heißt, die als PrimKey die Spalte Vorgangsnummer hat.
Und auch wie die anneren Tabellen heißen, die auf diese Vorgangsnummer hin gefiltert werden sollen.
Und auch den Namen des ForeignKeys jeder dieser untergeordneten Tabellen - könntejasein, du hast den ForeignKeys abweichende Namen gegeben.
Auch brauchich den Namen der DataRelation zwischen den zu verknüpfenden Tabellen (Rechtsklick im Dataset-Designer - "Relations-Bezeichnungen anzeigen")

Weil hier wird man wohl die DataRelation ausnutzen, um 2 BindingSources aneinanderzustöpseln. An die übergeordnete BS wird die Combo gebunden, an die untergeordnete BS das DGV.
Dann filtert das.

Sone Filterung ist auch inne Sample-Solution des Tutorials anzugugge, nur wird die übergeordnete BindingSouce "KategorienBindingSource" nicht über eine Combo gesteuert, sondern dieselbe Funktion erfüllt dort das KategorienDatagridView.

Und das ArtikelGrid zeigt die auf KategorieID gefilterten Artikel

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

Sorry, aber in deiner Beschreibung tauchen schon wieder soviele Befehle auf, mit denen ich soweit nichts anfangen kann 😦
ich beschreibe am besten noch einmal mein Programm von vorne und mein Problem:

Funktion meines Programms:
Mit Access 2007 habe ich eine einzige Datenbank erstellt mit folgenden Spalten:
ID-Vorgangsnummer-Position-Tätigkeit-Stückzahl gesamt-TE-TR-TP.
Diese Datenbank habe ich in Visual Studio 2010 mit dem Datenbankassistenten in meine Form übergeben.
Das Programm soll in einem Unternehmen eingesetzt werden. Jeder Auftrag erhällt eine Vorgangsnummer, die editiert werden soll in meinem Programm. Da ein Auftrag öfter mehrere Tätigkeiten hat, wird dieser auch öfter editiert, d.h ein Auftrag muss zum Beispiel erst gefräst werden, danach entgraten werden, und danach im Versand verpackt werden. Somit ist das immernoch dieselbe Vorgangsnummer, aber eben verschiedene Tätigkeiten.
TE-TR-TP sind Zeitspalten, in denen der Benutzer die einzelnen Zeiten für einen Vorgang eingibt.

Mein Problem:
Ich möchte, dass wenn das Programm ausgeführt wird, die Spalte "Vorgangsnummer" als Drop-Down-Feld gemacht wird, sodass der Benutzer, die gesuchte Vorgangsnummer auswählen kann und alle Einträge von der Vorgangsnummer angezeigt werden.

5.299 Beiträge seit 2008
vor 12 Jahren

mir scheint, du mußt nochmal gründlichst, das Main.Doc des Tutorials studieren, damit du eine Vorstellung von Datenmodellierung bekommst.
Oder auch andere Quellen hinzuziehen.

In deiner Praxis gibt es Aufträge, und jeder Auftrag beinhaltet mehrere Tätigkeiten. Das kann man nicht mit nur einer Datenbank-Tabelle modellieren, sondern man muß deren zwei anlegen, und eine relationale Beziehung zwischen beiden.

Sorry, solange dir die Begriffe Relation, Primkey, ForeignKey, Normalisierung, ER-Model, Redundanzverbot nicht geläufig sind, kannst du einfach keine DB-Anwendung entwickeln.

Der frühe Apfel fängt den Wurm.

P
62 Beiträge seit 2011
vor 12 Jahren

Okay, ich versuche dann mal durch google, die funktionen der einzelnen Begriffe anzueignen bzw zu verstehen. 😃

Aber soweit ist meine Aufgabenstellung bzw meine Problemdiagnose verständlich?! 😃

5.299 Beiträge seit 2008
vor 12 Jahren

Ich möchte, dass wenn das Programm ausgeführt wird, die Spalte "Vorgangsnummer" als Drop-Down-Feld gemacht wird, sodass der Benutzer, die gesuchte Vorgangsnummer auswählen kann und alle Einträge von der Vorgangsnummer angezeigt werden. Das ist ein Standard-Task, genannt ParentChild-View.
Die SampleSolution des Tuts zb zeigt einen ParentChildView.
Nur dass statt einer Combo gleich ein DatagridView genommen wird, um die übergeordneten Datensatz auszuwählen.
Könnteman ebensogut eine Combo reinmachen.
Das Main.Doc haste gelesen und verstanden? Da wird das Zeug ja auch angerissen. Fürs Verständnis der Grundidee überhaupt gugge vlt. die relationale GrundIdee

So wird vlt auch deutlich, dass das Grundkonzept von Datenmodellierung garnix mit c# zu tun hat. Die ganze gewaltige DB-Unterstützung von .Net nützt einem nicht die Bohne, wenn man nicht weiß, wofürs gut ist.

Der frühe Apfel fängt den Wurm.