ERLEDIGT
NEIN
NEIN
ANTWORTEN
18
18
ZUGRIFFE
822
822
EMPFEHLEN
-
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:
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 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"; } }
und eine Datenbankklasse: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; } }
Ich hoffe Ihr kommt so weit durch und habt ein paar Verbesserungsvorschläge!!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; } }
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
Edit steht hier für editieren? Dann würd ich wohl eher FormCustomerEditor verwenden. Sprich, keine Verben in Klassennamen verpacken.public partial class FrmEditCustomer
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 string parametername
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#.private EditCustomer classEC = new EditCustomer();
Methoden sollten mit einem Großbuchstaben beginnen (PascalCasing). Dient zur besseren Unterscheidung und erhöht die Lesbarkeit.public DataSet getCustomer
conCustomer? Hast du etwa für jede Tabelle eine eigene Connecttion? Möglicherweise haben nicht alle soviel RAM wie du ...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;
}
}
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.
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.conCustomer? Hast du etwa für jede Tabelle eine eigene Connecttion? Möglicherweise haben nicht alle soviel RAM wie du ...
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
-
Deine Versuche da haben jedoch nichts mit einer 3-Tier-Architektur zu tun ....
-
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²
-
Solltest du aber, sonst gibts Probleme sobald du mal mit mehreren Leuten zusammen was machst.
-
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.
-
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...
-
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
-
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
-
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.
-
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...
-
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
-
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
-
Bitmuster darstellen (auf Bits zugreifen). Bitte um Anregungen.
Von spiderflo im Forum C/C++Antworten: 11Letzter Beitrag: 08.01.06, 00:53 -
Bitte um Anregungen
Von Ellinar im Forum WerkstattAntworten: 8Letzter Beitrag: 13.10.05, 13:55 -
y-achse-Bitte helft wieder einmal
Von rzbraun im Forum Cinema 4DAntworten: 1Letzter Beitrag: 26.10.03, 10:52 -
ihr wollt fettepixel wieder? bitte...
Von matt im Forum SmalltalkAntworten: 13Letzter Beitrag: 07.09.02, 01:04





Zitieren
Login





