tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
18
ZUGRIFFE
822
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Hallo Leute,
    könntet Ihr bitte damal ein Blick darauf werfen.
    Zur Erklärung:
    In der Form sollen Kundendatensätzen dargestellt werden, die von einer SELECT Anweisung kommen.
    Auf der Form ist eine TextBox für das Keyword, zwei RadioButton einmal für Nachname und einmal für den Ort der gesucht wird z.B. ... WHERE nachname LIKE Keyword ...
    Die Abfrage wird beim Button_Click gestartet
    die Form:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    public partial class FrmEditCustomer : Form
      {
      private string parametername;
      private EditCustomer classEC = new EditCustomer();
      
      public FrmEditCustomer()
      {
        InitializeComponent();
      }
      //Konstruktor 
      private void FrmEditCustomer_Load(object sender, EventArgs e)
      {
        //Default RadioButton wird gesetzt
        rdBLastname.Checked = true;
      }
      
      private void txtBKeyword_TextChanged(object sender, EventArgs e)
      {
        //Button erst freigeben, wenn Keyword länger drei Zeichen
        if (txtBKeyword.Text.Length >= 3)
          btnSearch.Enabled = true;
        else
          btnSearch.Enabled = false;
      }
     
      private void btnSearch_Click(object sender, EventArgs e)
      {
        string keyword = txtBKeyword.Text.Trim();
        DataSet dsKunden;
        dsKunden = classEC.getCustomer(parametername, keyword);
        dGVKunden.DataSource = dsKunden.Tables[0];
     
        if (dsKunden.Tables[0].Rows.Count == 0)
          MessageBox.Show("Es wurden keine Einträge gefunden!");
      }
     
      private void rdBLastname_CheckedChanged(object sender, EventArgs e)
      {
        if (rdBLastname.Checked)
          parametername = "nachname";
      }
     
      private void rdBCity_CheckedChanged(object sender, EventArgs e)
      {
        if (rdBCity.Checked)
          parametername = "ort";
      }
    }
    eine Logikklasse für die Form:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    class EditCustomer
    {
      public DataSet getCustomer(string parametername, string value)
      {
        string sqlString = null; ;
     
      switch (parametername)
      {
        case "nachname":
          sqlString = "SELECT * FROM Kunden WHERE nachname LIKE @nachname";
        break;
        case "ort":
          sqlString = "SELECT * FROM Kunden WHERE ort LIKE @ort";
        break;
      }
      SqlCommand Com = new SqlCommand(sqlString);
      Com.Parameters.Add("@"+parametername, SqlDbType.Text, 16, parametername).Value = value + "%";
     
      DataSet dsKunden = dbKunden.dbKunden.SelectCustomer(Com);
      return dsKunden;
      }
    }
    und eine Datenbankklasse:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class dbKunden
    {
      public static DataSet SelectCustomer(SqlCommand Com)
      {
        DataSet dsCustomer = new DataSet("dsKunden");
        daCustomer.SelectCommand = Com;
        daCustomer.SelectCommand.Connection = conCustomer;
        daCustomer.Fill(dsCustomer, "Kunden");
        return dsCustomer;           
      }
    }
    Ich hoffe Ihr kommt so weit durch und habt ein paar Verbesserungsvorschläge!!
    Bis Dann
    Markus
     

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Sowas gehört wohl eher ins allseits beliebte .NET Café.

    Ausserdem ist das Bewerten von Sourcecode - der zusätzlich auch noch aus dem Zusammenhang gerissen ist - immer eine schwierige Sache. Aber ich bin mal nicht so und unterstütze dich ein wenig, da du ja sonst keine Antworten erhalten hast. Vielleicht ergibt sich daraus dann ja eine nette Diskussion

    public partial class FrmEditCustomer
    Edit steht hier für editieren? Dann würd ich wohl eher FormCustomerEditor verwenden. Sprich, keine Verben in Klassennamen verpacken.

    private string parametername
    Schwer zu lesen. Du solltest hier CamelCasing verwendung -> parameterName. Des weiteren solltest du deinen private Fields einen Value zuweisen bzw. instanzieren. Dies passiert zwar bei den Value-Types automatisch (String ist kein ValueType), erhöht jedoch die Übersichtlichkeit.

    private EditCustomer classEC = new EditCustomer();
    EditCustomer? Auch hier wieder -> CustomerEditor. Des weiteren ist classEC ein wenig ungünstig gewählt. Warum nicht customerEditor? Wir sind ja so schön case sensitive in C#.

    public DataSet getCustomer
    Methoden sollten mit einem Großbuchstaben beginnen (PascalCasing). Dient zur besseren Unterscheidung und erhöht die Lesbarkeit.

    public class dbKunden
    {
    public static DataSet SelectCustomer(SqlCommand Com)
    {
    DataSet dsCustomer = new DataSet("dsKunden");
    daCustomer.SelectCommand = Com;
    daCustomer.SelectCommand.Connection = conCustomer;
    daCustomer.Fill(dsCustomer, "Kunden");
    return dsCustomer;
    }
    }
    conCustomer? Hast du etwa für jede Tabelle eine eigene Connecttion? Möglicherweise haben nicht alle soviel RAM wie du ...

    Generell gefällt mir das "Design" deiner Anwendung (obwohl ich da nur einen Teil gesehen habe) überhaupt nicht. Möglicherweise solltest du dich zu diesem Thema ein wenig in die Thematik einlesen. Bücher gibts dazu jede Menge. Beispielsweise kann ich dir Bücher von Martin Fowler ans Herz legen. Er geht jedoch schon von einem doch recht hohem Wissensstand aus.
     

  3. #3
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Danke Norbert,
    für Deine Bemühungen.
    Ja, die Namensvergabe fande ich auch nicht so gut, aber damit muß ich mich wohl noch ein bisschen beschäftigen.
    conCustomer? Hast du etwa für jede Tabelle eine eigene Connecttion? Möglicherweise haben nicht alle soviel RAM wie du ...
    Nein das habe ich nicht, die Datenbank besteht im Moment nur aus einer Tabelle, aber es werden noch mehr werden. Ok die Connection sollte da wohl besser den Namen der Datenbank haben, wie auch noch ein paar andere Dinge.
    Dies ist auch mein erster Versuch in der 3-Tier Architektur, da bin ich halt noch auf ein paar Tip's angewiesen. In Büchern steht zwar alles drin was man braucht, aber ich muß das alles noch in einen Zusammenhang bekommen.
    Zum Beispiel das leidige Thema der Schnittstellen, die man hier vielleicht auch gut gebrauchen könnte, aber ich, als OOP Anfänger sehen da noch keine "Verwendung".
    Ich möchte hier auch nicht über Schnittstellen reden, sonder über mein ersten Versuch in der 3-Tier Architektur.
    Und Danke noch mal!
    Bis dann
    Markus
     

  4. #4
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Deine Versuche da haben jedoch nichts mit einer 3-Tier-Architektur zu tun ....
     

  5. #5
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Interessant, über solche Dinge wie Namensgebung habe ich mir noch nie richtig Gedanken gemacht.....ich hab bislang immer nur darauf geachtet, dass jede Variable ein passendes Präfix erhält.
     
    hihi = -h²

  6. #6
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Solltest du aber, sonst gibts Probleme sobald du mal mit mehreren Leuten zusammen was machst.
     

  7. #7
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Hallo Ihr beiden,
    unter der 3-Tier-Architektur, habe ich bis jetzt "immer" verstanden, das ich eine GUI habe, also eine Form (Schicht 1), die Logik der Form in einer sepataten Klasse (Schicht2) und eine Anbindung zur Datenbank ist auch wieder eine separate Klasse (Schicht 3).
    Es müssen nicht Klassen sein, sondern es können auch seperate umfangreiche eigene Projekte sein.
    Ich habe ja jetzt in meinen kleinen Möglichkeiten:
    eine FrmEditCustomer (Schicht 1), GUI
    eine class EditCustomer (Schicht 2), Logik der GUI
    und eine class dbKunden (Schicht 3), Anbindung zur Datenbank
    Bitte Norbert, erkläre mir was Du unter einer 3-Tier-Architektur verstehst.
    Ich habe da schon mehrfach was von gelesen, aber ich glaubte ich könnte das in drei so "Klassen" erstmal Probeweise unter bringen. Also mich an einem kleinen Projekt, wie so eine Kundenadressverwaltung üben.
    Bis Dann
    Markus
     

  8. #8
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Prinzipiell gehts bei den ganzen Schichtmodellen darum, dass man sie voneinander trennen kann. Sinn und Zweck eines 3-Schicht-Modells ist es, dann man beispielsweise jede Schicht auf einem eigenen Rechner ausführen könnte und sie dennoch zusammenarbeiten.

    Die Präsentation wäre demzufolge auf einem (oder mehrere) Client(s). Businesslogik und Datenschicht wären danach auf dem Server. Bei Ressourcen-Engpässen könnte die Datenschicht dann noch auf einen zweiten Server ausgelagert werden. Das DBMS selbst gehört nicht zur Datenschicht.

    Dein Design kann so nicht aufgeteilt werden.
     

  9. #9
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  10. #10
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Hallo Norbert und cosmo,
    den Sinn eines 3-Schichtmodells habe ich verstanden, aber leider noch nicht deren Umsetzung.
    Ich weiß das ich schon mal so einen ähnliches Thema aufgemacht habe, Entschuldigung!
    Ich dachte erstmal ein kleines überschaubares Projekt erstellen an dem ich das üben kann.
    Ich muss wohl noch weiter fummeln!
    Also bis dann
    Markus
     

  11. #11
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Hallo,
    ich habe mir mal dieses Tutorial angesehn und da ist mir die Idee gekommen, dass ich die Klasse 'dbKunden' ja als Server, wie in diesem Beispiel, machen könnte, nur halt mit dem Unterschied, das er SQL-Anweisungen empfängt und mir die Daten in einem DataSet zurück gibt.
    Oder kann ich da auch ein Windows Dienst für machen?
    Bei VS2005 bietet er mir ja auch eine Windows Dienst Vorlage an?
    Was meint Ihr?
    Bis Dann
    Markus
     

  12. #12
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Wenn dann solltest du den "Server" soweit abstrahieren, dass es im Endeffekt egal ist, ob du ihn als Windows-Dienst, als WebService oder als Windows-Forms-Anwendung laufen läßt.
     

  13. #13
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Ließ Dir das doch mal richtig durch was Du gezeigt bekommst
    und frage nach wenn Du was von nicht verstehst,
    oder was man sich darunter vorstellen soll,
    bevor Du dich dazu entscheidest die Technologie einzusetzen.

    Was willst Du eigentlich machen? Willst Du Datenbankinhalte auf Objekte Mappen?
    Oder brauchst einen Abstaktionslayer damit Du mittels eines Interfaces unterschiedliche
    Datenbanken auf die gleiche Art und Weise ansprechen kannst. Oder gar beides?

    Alle Infos dazu Findest in den geposteten Threads.
    //Edit: Achso, Du möchtest den DB Zugriff also für mehere Anwendungen via eines Services realisieren?
    Dann kannst es via auch Remoting machen.

    Aber was ist denn nun dein genaues Vorhaben?
    Geändert von Christian Kusmanow (04.04.06 um 16:45 Uhr)
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  14. #14
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Hallo cosmo,
    ich möchte nur eine einfache Datenbankanwendung, als 3 Schichtmodel realisieren und da habe ich mir gedachte, als Einstiegsprojekt wäre so eine kleine Kundenverwaltung garnicht schlecht.
    Eine Form und eine Tabelle.
    Die Form, soll vielleicht später mal auf mehreren Clients laufen.
    Ich habe auch schon viel über das 3 Schichtmodel gelesen, nur ich weiß noch nicht genau wie ich es realisieren soll. Jetzt habe ich wie schon oben geschrieben die drei Klassen (eine für jede Schicht) und ich fand meine Idee nicht schlecht die Daten unter den Klassen per DataSet "auszutauschen".
    Also von der Logikklasse zur dbKunden übergebe ich eine Commandobject und zurück bekomme ich ein DataSet, das ich dann zur Form weitergebe um es in der Form als DataSource für eine GridView zu nutzen.

    Eine Sache habe ich schon gemerkt, ich kann nicht alleine die *.exe ausführen, ich muß den ganzen Ordner immer mit umkopieren, weil da die *.DLL Dateien der anderen Klassen auch enthalten sind und da habe ich dies gelesen.
    Ich meine dieser Artikel ist ganz hilfreich, wenn die mal später mehreren Clients alleine laufen soll, aber dazu später mehr.
    Und ich war vielleicht mit den Gedanken etwas zu schnell, aber mal angenommen ich möchte die Klasse DBKunden auch alleine für sich laufen lassen das sie halt SQL Befehle empfängt und die Daten dann per DataSet zurück gibt, aber da war ich noch wohl zu schnell mit meinen Gedanken.
    Also, drei Schichten und ich habe drei Klassen und jetzt stehe ich da!! Wie weiter?
    Bis Dann
     

  15. #15
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    So einfach wie du dir das vorstellst ist das nicht.

    Für das was du vorhast brauchst du eine Datenbank (idealerweise ein DBMS, sprich SQL Server, MySQL, ...). Dann musst du einen Server implementieren (dieser enthält im Normalfall dann die Businesslogik und die Datenschicht). Und natürlich einen Client.

    Was du dann brauchst: Client und Server müssen irgendwie miteinander kommunizieren. Das kannst du via einem eigenen Protokoll tun, oder du verwendest Remoting. Weiters bietet sich an, verschiedene Patterns zu implementieren, die da ganz hilfreich sind. Command-Pattern wäre ganz nett (solltest du beispielsweise Commands hin- und herschicken) etc.

    Wie du siehst, hast du also noch eine Lesezeit vor dir
     

Ähnliche Themen

  1. Antworten: 11
    Letzter Beitrag: 08.01.06, 00:53
  2. Bitte um Anregungen
    Von Ellinar im Forum Werkstatt
    Antworten: 8
    Letzter Beitrag: 13.10.05, 13:55
  3. y-achse-Bitte helft wieder einmal
    Von rzbraun im Forum Cinema 4D
    Antworten: 1
    Letzter Beitrag: 26.10.03, 10:52
  4. ihr wollt fettepixel wieder? bitte...
    Von matt im Forum Smalltalk
    Antworten: 13
    Letzter Beitrag: 07.09.02, 01:04