Laden...

Hilfe-Datenbankprogrammierung in C#- Hilfe

Erstellt von lissy vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.236 Views
L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren
Hilfe-Datenbankprogrammierung in C#- Hilfe

Hallo,

Ich habe folgende Aufgabe bekommen und bin hoffnungslos überfordert. Ich hoffe ihr könnt mir helfen. Wir arbeiten mit Visual Basic C# 2008 und in Windows Forms.

Aufgabe:
Schreiben Sie ein Programm, das die Telefonnumern der Mitarbeiter einer kleinen Firma anzeigt. Das Programm besteht aus einem Textfeld, in das nur der erste Buchstabe des Nachnamens eingegeben werden muss, es sollen dann in einer Listview alle Mitarbeiter erscheinen, deren Nachnamen mit dem Buchstaben beginnt. Wird ein Mitarbeiter ausgewählt, soll seine Telefonnummer angezeigt werden.
(Tipp: Lesen Sie die Telefonnummern mit den Namen ein und speichern Sie diese in einem Feld)

a.) Erstellen sie die Form
b.) Erstellen Sie eine Klasse für die Datenbankzugriffe
c.) Schreiben und testen Sie das Programm
d.) Erweitern Sie das Programm so, dass Adressen der Datenbank hinzugefügt werden können.

Als Zusatz haben wir eine Access Datenbank zur Verfügungung gestellt bekommen.
Außerdem den Screenshot.

Danke und lg
Yvonne

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

wo ist jetzt das genaue Problem? Was hast du schon versucht bzw. wo klemmt es?

Eine fertige Lösung für die Aufgabe wirst du hier nicht bekommen. Siehe auch [Hinweis] Wie poste ich richtig?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren

Als erstes habe ich die Klasse "Leute " erstellt mit: AdressenNr int, Nachname string, Vorname string, Telefonnummer int und Geburtstag int.
dazu jeweils Felder, Eigenschaften und eine Methode "Leute " + 1 Überladung.

Und jetzt weiß ich nicht weiter.
Eigentlich müsste ich jetzt die Datenbank öffnen, oder??
Und wie bekomme ich hin, das er wenn ich einen Buchstaben eingebe in der ListView alle Nachnamen mit diesem Anfangsbuchstaben ausgibt??

Danke

L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren

ich kann euch ja mal alles reinstellen was ich bisher geschrieben habe und welche Fehler er sagt.

Klasse Leute:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    public class Leute
    {
        private int _AdressenNr;
        private string _Vorname;
        private string _Nachname;
        private string _Telefonnummer;
        private DateTime _Geburtstag;

        public Leute()
        {
            
        }

        public Leute(int AdressenNr, string Vorname, string Nachname, string Telefonnummer, DateTime Geburtstag)
        {
            this.AdressenNr = AdressenNr;
            this.Vorname = Vorname;
            this.Nachname = Nachname;
            this.Telefonnummer = Telefonnummer;
            this.Geburtstag = Geburtstag;
        }
       
        public int AdressenNr
        {
            get
            {
                return _AdressenNr;
            }
            set
            {
                _AdressenNr = value;
            }
        }

        public int Geburtstag
        {
            get
            {
                return _Geburtstag;
            }
            set
            {
                _Geburtstag = value;
            }
        }

        public string Nachname
        {
            get
            {
                return _Nachname;
            }
            set
            {
                _Nachname = value;
            }
        }

        public string Vorname
        {
            get
            {
                return _Vorname;
            }
            set
            {
                _Vorname = value;
            }
        }

        public int Telefonnummer
        {
            get
            {
                return _Telefonnummer;
            }
            set
            {
                _Telefonnummer = value;
            }
        }
    }
}

Klasse DbModel:

using System.Data.OleDb;
using System.Windows.Forms;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    public class DbModel
    {
        private static string pfadname = "..\\..\\..\\telefon.mdb";
        private string CONNECTIONSTR =
                "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + pfadname;
        private OleDbConnection connection;
        private OleDbCommand command;
        private OleDbDataReader dbreader;

        public DbModel()
        {
            openDB();
        }

        public bool openDB()
        {
            try
            {
                connection = new OleDbConnection(CONNECTIONSTR);
                connection.Open();
            }
            catch (OleDbException error)
            {
                MessageBox.Show("Fehler beim Öffnen der DB" +
                                error.ToString());
                return false;
            }
            return true;
        }

     

        public ArrayList getLeute()
        {
            ArrayList getLeute = new ArrayList();

            command = new OleDbCommand();
            command.CommandText = "SELECT AdressenNr, Vorname, Nachname, Telefonnummer, Geburtstag From Leute";
            command.Connection = connection;

            try
            {
                dbreader = command.ExecuteReader();
                while (dbreader.Read())
                {
                    int AdressenNr;
                    string Vorname;
                    string Nachname;
                    string Telefonnummer;
                    DateTime Geburtstag;
                    Object[] daten = new Object[5];
                    dbreader.GetValues(daten);
                    AdressenNr = int.Parse(daten[0].ToString());
                    Vorname = daten[1].ToString();
                    Nachname = daten[2].ToString();
                    Telefonnummer= daten[3].ToString();
                    Geburtstag = [COLOR]DateTime.Parse(daten[4].ToString());
[/color]
                    	
                    Leute misterx = new Leute(AdressenNr, Vorname, Nachname, [COLOR]Telefonnummer, Geburtstag[/COLOR]);
                    getLeute.Add(misterx);
                }
            }
            catch (OleDbException fehler)
            {
                MessageBox.Show("Fehler in getLeute" + fehler.ToString());
                return null;
            }
            return getLeute;
        }
    }
}

Fehler 1 Eine implizite Konvertierung vom Typ "int" in "string" ist nicht
möglich.
Fehler 2 Die beste Übereinstimmung für die überladene
WindowsFormsApplication1.Leute.Leute(int, string, string, int,
int)-Methode hat einige ungültige Argumente.

Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DbModel model;
        

        public Form1()
        {
            InitializeComponent();

            model = new DbModel();
            // leute = model.getLeute();
                       
        }

     


        private void textBuchstabe_TextChanged(object sender, EventArgs e)
        {
            string Buchstabe = textBuchstabe.Text;

        }

        private void textTelefonausgabe_TextChanged(object sender, EventArgs e)
        {

        }
      
    }

}
6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

Edit: Hab gerade bemerkt dass du inzwischen noch eine Antwort erstellt hast.
Wenn du Code postest bitte formatiere diesen auch mit den

[csharp]-Tags oder über das #-Symbol oben. Stell auch nicht den ganzen Code hier rein - der interessiert niemanden 😉 Gibt konkret an wo es Problem gibt. Siehe hiezu auch https://mycsharp.de/forum/threads/26594/wie-poste-ich-richtig

Weiters habe ich gesehen dass du Access als Datenbank verwendest. Da kann ich dir leider nicht weiterhelfen, da ich das nicht verwende.

Telefonnummer int und Geburtstag int.

Für Datum gibt es DateTime - das sollte auch für den Geburtstag verwendet werden.
Die Telefonnummer würde ich auch als string speichern denn die meisten Nummern habe eine führende 0 - bei einem int wird diese nicht berücksichtigt.

Datenbankzugriffe

Wie sollen die Datenbankzugriffe erfolgen. Es gibt ja viele Möglichkeiten: ADO.net, Linq to Sql, ADO.net Entity Framework, ... Wenn du freie Wahl hast mit was kennst du dich aus?

Eigentlich müsste ich jetzt die Datenbank öffnen, oder??

Siehe voriges Zitat.

Und wie bekomme ich hin, das er wenn ich einen Buchstaben eingebe in der ListView alle Nachnamen mit diesem Anfangsbuchstaben ausgibt??

Grundsätzlich dadurch dass die Daten in der Datenbank derart gefiltert werden (WHERE) dass nur die Einträge zurückgegeben werden die mit dem Buchstaben beginnen.
Die Details davon unterscheiden sich nach der Art der Datenbankzugriffe.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren

Hi,

Danke erstmal für deine Antwort =)
Zu den Datenbankzugriffen, ehrlich gesagt weiß ich gar nicht wie die heißt die wir benutzen. Wir haben bisher mit OleDb gearbeitet. Hört sich laut google stark nach ADO.net an was wir benutzen. Vielleicht kannst du das in meinem Code in der DbModel-Klasse erkennen. Viel Erfahrung habe ich bisher noch nicht.

ADO.net, Linq to Sql, ADO.net Entity Framework, ...

Ansonsten habe ich Telefonnummer jetzt in string und Geburtstag in DateTime geändert und nun gibt er keine Fehler mehr aus. Allerdings wie mache ich jetzt weiter???

Danke, Yvonne

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

hab mal deinen Code kurz überflogen.

Verwende keine ArrayList mehr. Besser wäre List<T> da diese stark typisiert ist. D.h. mit ArrayList hast du nur Objekte während mit List<Leute> du konkret Leute verwenden kannst. Also vergiss ArrayList möglichst schnell wieder.

D.h. statt

public ArrayList getLeute()
public List<Leute> GetLeute()

Methoden fangen auch immer mit Großbuchstaben an - so die Konvention.

Die Connection zur Datenbank solle nicht 1x geöffnet und offen gehalten werden, sondern erst dann geöffnet falls diese benötigt wird und dann wieder geschlossen. Die Begründung dafür spare ich mir hier denn das würde zu weite gehen (Stichwort: ConnectionPooling).

Die Abfrage nach den Leuten mit den Anfangsbuchstaben geht in der Art so


SELECT *
FROM Tabelle
WHERE Name LIKE '@1%'

Google mal nach "WHERE LIKE" dann wirst du schon fündig.

Mehr kann/will ich dazu nicht beisteuern 😉

PS: lissy od. Yvonne?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren

Meinst du so??? Könnte das klappen?? Übrigens.. Yvonne =)

command.Text = "SELECT Vorname, Nachname, Telefonnummer"
                           FROM Adressenliste
                           WHERE " + " Nachname" + " LIKE [B]...[/B]";
[B]... kommt da dann  a,b,c,.. hin oder geht das auch kürzer??[/B]

try
{
  datareader = (...);
  while (datareader.Read())
  {
    person x = new Person ();
    Object[] daten = new Object[3];
    datareader.getValues(daten);
[B]// Datareader oder dbreader????[/B]
    
                   x.Vorname = (string) daten[0];
                   x.Nachname = (string) daten[1];
                   x.Telefonnummer= (string)daten[2];
                    
   }
}
6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

das hab ich jetzt erst gesehen:

Wir arbeiten mit Visual Basic C# 2008

Es gibt Visual Basic und C# - die Kombination gibts nicht 😉


SELECT *
FROM Leute
WHERE Name LIKE 'G%'

Allerdings sollte Parameter verwendet werden. Siehe [Artikelserie] Parameter von SQL Befehlen

Edit: Siehe auch [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren

Ich meinte Visual C# 2008

1.552 Beiträge seit 2010
vor 13 Jahren
   
while (datareader.Read())  
{  
    person x = new Person ();  
    Object[] daten = new Object[3];  
    datareader.getValues(daten);  
  
    x.Vorname = (string) daten[0];  
    x.Nachname = (string) daten[1];  
    x.Telefonnummer= (string)daten[2];  
}  

Ähm! Verwende besser eine der folgende Schreibweisen:


x.Vorname = datareader.GerString(0);

x.Vorname = datareader["SpaltennameFürVorname"];

wobei erstere Variante schneller ist, da nicht der akutelle Datensatz des Readers nach der Spalte durchsucht werden muss. Jedoch ist die zweite Variante verständlicher

kommt da dann a,b,c,.. hin oder geht das auch kürzer??

Was meinst du damit? Ordnen nach dem Alphabet? Wenn ja, dann verwende

ORDER BY nachname, vorname

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
lissy Themenstarter:in
7 Beiträge seit 2010
vor 13 Jahren

Hi,

kommt da dann a,b,c,.. hin oder geht das auch kürzer??

Was meinst du damit? Ordnen nach dem Alphabet? Wenn ja, dann verwende

ORDER BY nachname, vorname

Wir sollen in einem Textfeld den ersten Buchstaben des Nachnamens angeben und es soll dann in der Listview rechts daneben alle Mitarbiter mit dem Anfangsbuchstaben des Nachnamens erscheinen. Deshalb frage ich wei ich das hinbekomme, wenn ich einen Buchstaben eingebe, das die passenden Nachnamen dann angezeigt werden.

Lg Yvonne =)

1.552 Beiträge seit 2010
vor 13 Jahren

Das wurde schon besprochen

SELECT *
FROM Tabelle
WHERE Name LIKE 'G%'

Ich denke mal dass du dich mit den Grundsätzen von SQL vertraut machen solltest.

Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

2.760 Beiträge seit 2006
vor 13 Jahren

Ich denke mal dass du dich mit den Grundsätzen von SQL vertraut machen solltest.

Und zwar erstmal nicht in deinem Programmcode sondern am besten (wenn du Access benutzt in Access) und beim SQL Server z.B. im SQL Server Management Studio bzw. irgendeiner anderen kompatiblem GUI deiner Wahl.
Da musst du dann nicht jedesmal neu kompilieren und bekommst auch nur die SQL-Fehler angezeigt (die du im Code erst nach dem Ausführen mit einer Exception mitgeteilt bekommst).