Ich bitte mal wieder um Anregungen!

Reverent

Erfahrenes Mitglied
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:
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:
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:
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
 
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.
 
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
 
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.
 
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
 
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.
 
[thread=227773]Probleme mit Daten die in entsprechende Klassen unter zubringen ! - Thread[/thread]
Aber naja. ;)
//Edit: [thread=215873]Umstellung auf 3-Tier-Architektur - Thread[/thread]
 
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
 

Neue Beiträge

Zurück