2016-04-21 10 views
1

Ich bin derzeit ein Student, und lernen C# und Datenbank. Leider wird die Schule, in die ich gehe, nicht mit C# interagieren, um mit einer Datenbank zu interagieren. Also lerne ich das alleine.Best Practice beim Umgang mit Datenbank

Ich habe ein paar kleine Programme geschrieben, die eine Datenbank und C# verwenden. Sie funktionieren gut und tun, was ich will, auch wenn sie wahrscheinlich nicht richtig strukturiert sind. Ich schreibe jetzt ein neues Programm, das mein bisher größtes sein wird, und ich möchte, dass es korrekt ist. Das Programm hat viele Windows-Formulare, Klassen und eine SQL-Datenbank mit 18 Tabellen. Die Art, wie ich es jetzt strukturiert habe, ist, dass meine Windows Form normalerweise eine neue Instanz einer Klasse erstellt. Sagen wir Kunde. Wenn Sie auf die Schaltfläche zum Speichern klicken, wird ein neuer Kunde erstellt, den Eigenschaften werden Werte zugewiesen, und dieses Objekt wird zusammen mit einer Combobox oder was auch immer ich gerade arbeite, an eine öffentliche Methode in der Kundenklasse gesendet. Ich habe auch eine Klasse namens Datenbank, die alle meine SQL-Abfragen enthält, die ich geschrieben habe. So ist alles ein Ort. Normalerweise sende ich der Datenbankklasse ein Wörterbuch als Parameter zum Ausfüllen und benutze es dann zurück in der Kundenklasse, um eine Combobox zu füllen. Ich verwende keine Datasets, Datatables oder ähnliches. Ich arbeite direkt mit der Datenbank.

Wird dies als akzeptabel oder nicht in der realen Welt betrachtet? Ich hoffe wirklich, dass ich das in naher Zukunft für meinen Lebensunterhalt machen kann, also würde ich das gerne richtig lernen. Ich habe viel alleine gelesen, und ich habe viele Unterschiede in der Art und Weise gesehen, wie Leute es tun. Wenn jemand auch Vorschläge für gutes Lesen hat, würde ich es begrüßen.

Bearbeiten, Hinzufügen von Code-Snippet gemäß einer Empfehlung

Auf meinem Formular einen neuen Kunden hinzuzufügen, habe ich einen Platz für sie in ihrer Adresse zu setzen. Ich habe zwei Comboboxen, einen für den Staat und einen für die Stadt. Ich lasse die Stadt filtern, so dass sie nur Städte anzeigt, die sich in dem Staat befinden, der in der State-Combobox ausgewählt ist. Also habe ich in meiner Form-Klasse eine Methode, wenn der Statusbox-Index geändert wird. Es sieht aus wie das .

private void cboStates_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Address.GetFilteredCities(cboCity, (int)cboStates.SelectedValue); 
    } 

cboCity ist die Stadt-Combobox. In der Adressklasse habe ich eine Methode, die so aussieht. Cities ist ein Wörterbuch, das ein int für den Schlüssel und eine Zeichenfolge für den Wert enthält. Der Int ist die ID der Stadt, die in meiner Datenbank gespeichert ist. Der Wert ist der Name der Stadt, der in der Combobox angezeigt wird.

public static void GetFilteredCities(ComboBox box, int stateID) 
    { 
     cities.Clear(); 
     Database.GetFilteredCities(cities, stateID); 

     if (cities.Count > 0) 
     { 
      box.DataSource = new BindingSource(cities, null); 
      box.ValueMember = "Key"; 
      box.DisplayMember = "Value"; 
     } 

     else 
     { 
      box.DataSource = new BindingSource(null, null); 
     } 
    } 

Dann in der Datenbank-Klasse,

public static void GetFilteredCities(Dictionary<int, string> cities, int stateID) 
    { 
     try 
     { 
      using (SqlConnection conn = new SqlConnection(connString)) 
      { 
       conn.Open(); 
       SqlCommand grab = new SqlCommand("SELECT CityID, CityName FROM tblCities WHERE StateID = " + stateID, conn); 
       using (SqlDataReader read = grab.ExecuteReader()) 
       { 
        while (read.Read()) 
        { 
         cities.Add((int)read["CityID"], read["CityName"].ToString()); 
        } 
       } 
      } 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error getting cities", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

Gibt es eine richtige Art und Weise, dies zu tun, oder ist dies eine akzeptable Art und Weise in Betracht gezogen? Ich neige dazu, in meinen Wegen stecken zu bleiben. Wenn es einen besseren Weg gibt, würde ich es lieber lernen. Zum Beispiel: Verwenden Sie einen Datenadapter und eine Datentabelle aus irgendeinem Grund besser? Ändert eine Datentabelle während der Verwendung des Programms und bindet sie dann nicht an die Datenbank, bis Sie das Programm aus irgendeinem Grund besser beenden?

+0

Ich habe nicht abgestimmt, aber halte diese Frage für zu breit und meinungsorientiert. Seien Sie spezifischer, zeigen Sie Code oder mehrere Möglichkeiten und fragen Sie nach rationelleren Gründen, warum etwas gut ist oder nicht. –

+0

Es gibt fast unendliche Möglichkeiten, dies zu tun, weshalb Programmierung ein gewisses Maß an Kreativität erfordert.Im Allgemeinen ist es akzeptabel, bis es nicht funktioniert. Wenn es funktioniert und du kein Problem hast, hast du keine Frage. Mein Kommentar ist ungefähr so ​​breit wie deine Frage, aber du hast die Idee. – SeanOB

Antwort

1

Sehr wenige moderne apps enthalten überhaupt sql, sie verwenden oft Tools, die den sql für Sie generieren. Suchen Sie nach einigen Beispielen für die Verwendung von "entity framework" oder "nhibernate" als ein paar Beispiele. Vielleicht können Sie sogar mit einer Objektdatenbank wie RavenDB spielen ... wo Ihre Klassen effektiv direkt in der Datenbank gespeichert werden können.

+0

Die Frage nicht sql in der App als Voraussetzung, und ich war im Hinblick auf die Kenntnis der Person, die die Frage gestellt. Wenn jemand, der neu im Programmieren ist, eine solche Frage stellt, besteht eine sehr hohe Chance, dass er solche Tools nicht kennt und Stunden/Wochen damit verbringen könnte, in die falsche Richtung zu gehen. –

+0

Wenn jemand, der mit Programmierung nicht vertraut ist, nicht auf moderne Werkzeuge verweist, wird er wahrscheinlich zum nächsten ignoranten Programmierer, der Tonnen von redundantem Code schreibt. Mit EF oder NHibernate ist die Richtung kaum falsch. – TomTom

0

Sie können gespeicherte Prozeduren auch aufrufen. Ich glaube, dass Sie das in einigen Legacy-Apps wahrscheinlich sehen werden.