Announcement

Collapse
No announcement yet.

SQLConnection und zwei Forms

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQLConnection und zwei Forms

    Hallo,
    ich wollte mich mal auf Neuland begeben und mich mit C# auseinander setzen. Und nun bin ich auch mein erstes Problem gestoßen.. (Ich arbeite mit Visual Studio 2005)

    Folgendes:
    Ich habe auf Form1(Startformular) mir eine SQLConnection angelegt die sich auch sehr schön mit meinem SQL Server verbindet. Nun noch DataAdapter GridView etc rauf und alles läuft bestens.

    Nun wollte ich auf Form2 dito ein GridView etc anlegen. Dem DataAdapter wollte ich als Connection meine SQLConnection von Form1 geben... Nur leider wird mir die nicht angeboten. Hab auch auf Form1 die SQLConnection als public.

    Warum bekomme ich da keinen Zugriff drauf?
    Oder mache ich etwas von der Grundidee aus Falsch?

    Und wodrin besteht eigentlich der Unterschied eine DB-Verbindung mit SQL-Connection zu machen oder Über das Menü "Daten/Neue Datenquelle hinzufügen"? Da kann ich ja gleich alles in ein Dataset reinladen.. Nur leider finde ich dabei keine Zeile Code in meinem Projekt wieder, wo das Programm die Verbindung öffnet und schließt. Da muss es doch auch ein Connection.Open() geben?


    Hat jemand für einen Neuling in C# einen heißen Tipp??

    Danke im Vorraus

    Tihalck

  • #2
    Zentrale Datenzugriffe

    Hi,

    Dem DataAdapter wollte ich als Connection meine SQLConnection von Form1 geben... Nur leider wird mir die nicht angeboten. Hab auch auf Form1 die SQLConnection als public.

    schreibe eine zentrale Klasse für den Zugriff auf die Daten und binde diese in die Forms ein. Die Connection als Staffel von Form zu Form weiterzugeben, halte ich nicht für guten Stil.
    Von dieser Klasse legst Du eine Instanz in jeder form an und hast Zugriff auf die Connction. Eine Instanz der Form1 in Form2 zu deklarieren, kann nicht sinnvoll sein, oder? ;-)

    Über das Menü "Daten/Neue Datenquelle hinzufügen"? Da kann ich ja gleich alles in ein Dataset reinladen.. Nur leider finde ich dabei keine Zeile Code in meinem Projekt wieder

    Die Automatismen von Microsoft funktionieren nach meinen Erfahrungen nur in sehr einfachen Fällen, Fehler findet man in solchen black-boxes nur schwer. Ich würde das Ganze vergessen.

    Gruss Oskar

    Comment


    • #3
      Hi,

      erstmal Danke für die erste Anregung

      schreibe eine zentrale Klasse für den Zugriff auf die Daten und binde diese in die Forms ein

      Habe ich dabei nicht das Problem, dass ich auf jeder Form die Verbindung neu Öffnen und schließen muss??

      Habe eben nochmal etwas anderes getestet:
      Ich hab in der Program.cs mir eine SQlConnection angelegt. Diese dann beim Load der Form1 mit einem ConnectionString gefüttert und dann gestartet. Wenn ich aber dann ein DataAdapter auf die Form packe, zeigt er mir die Verbindung nicht mit an. Kann ich ich die da irgendwie bekannt machen??

      Würde ungern im Code mir ständig neue DataAdapter, DataSet etc erzeugen.


      Muss mal anmerken: Habe vorher fast immer mit Delphi gearbeitet. Aber davon will ich jetzt langsam mal weg. Ist schon ne gleine Umstellung auf C#. Bei Delphi konnte man das Thema Objektorientierung mal gut vernachlässigen

      Gruß Tihalc

      Comment


      • #4
        Entschuldige, wenn ich mich nur auf ein paar Hinweise beschränke (ich habe den Kopf gerade mit eigenen Problemen voll):

        Unter ADO.NET wird eine DbConnection nur bei Bedarf geöffnet und nach Erledigung eines DbCommand sofort wieder geschlossen. (Warum das sinnvoll ist, darüber gibt es viele Diskussionen.)

        ADO.NET arbeitet grundsätzlich mit 3 Ebenen: der Datenmenge in der Datenbank, der Datenmenge im Arbeitsspeicher und der Verbindung zwischen beiden. Die DB wird sozusagen repräsentiert durch die DbConnection, der Arbeitsspeicher durch DataSet/DataTable, die Verbindung dazwischen durch den DbDataAdapter. (Es gibt noch andere Bestandteile, z.B. den DataReader; aber so geht das Verständnis schneller.)
        Würde ungern im Code mir ständig neue DataAdapter, DataSet etc erzeugen.
        Für den DataAdapter ist das aber Standard. Das DataSet sollte in der Tat nur einmal pro Anwendungsbereich existieren, deshalb auch Oskars Vorschlag für die eigene Klasse. Am praktischsten empfinde ich es, für jede Datenbank eine eigene dieser Klasse zu erstellen, dazu ein passendes DataSet zu nehmen und darin alle Arbeiten damit zu kapseln. Für die DbConnection wird innerhalb der DB etwa so gearbeitet:
        Code:
        public int DatasetReadAdress(int id) {
          int Result = 0;
          using(DbConnection conn = new DbConnection(connstring)) {
            DbDataAdapter da = new DbDataAdapter(conn);
            DbCommand cmd = new DbCommand(da);
            cmd.CommandText = "SELECT * FROM Adresses WHERE ID = @ID";
            cmd.Parameters.AddWithValue("@ID", id);
            conn.Open();
            Result = da.Fill(myDataSet, "Adress");
            conn.Close();
            da.Dispose();
          }
          return Result;
        }
        Ich hoffe, ich konnte trotz der Kürze etwas helfen. Jürgen

        PS. Den Code habe ich nur so hingeschrieben. Du musst natürlich alles an Deine Bedürfnisse anpassen. Außerdem gibt es viele Varianten, wie die einzelnen Objekte miteinander verbunden werden.

        Comment


        • #5
          Hi,

          Habe ich dabei nicht das Problem, dass ich auf jeder Form die Verbindung neu Öffnen und schließen muss??
          nicht unbdingt.

          Wenn du in der Datenzugriffsklasse alle Daten holst, brauchst Du den Forms nur die jeweiligen Tabellen zu übergeben.

          In der Datezugriffsklasse stellst Du z.B. das Dataset zur Verfügung und kannst dann in der Form zuweisen:

          Code:
          this.DataGridview.Datasource = meinDatenzugriff.Get().Dataset.tables["xy"]
          ist ein bisschen viel, das hier alles in Kürze zu erklären....Sorry.

          OSKAR

          Comment


          • #6
            Als Ergänzung zu den letzten Beiträgen:

            Es kann sinnvoll sein, das DataSet nicht in die Datenzugriffsklasse zu integrieren, sondern die "eigene" Klasse direkt von DataSet abzuleiten und das Ganze als Singleton zu verwenden:
            Code:
            public class MyDatenzugriff : DataSet {
              private MyDatenzugriff instance = new MyDatenzugriff();
              public MyDatenzugriff Instance {
                get { return instance; }
              }
              private string connString = String.Empty;
              private MyDatenzugriff() {
                //  hier kommen alle Details, z.B. ReadXmlSchema()
                //  hole connString aus app.config oder woher auch immer
              }
            }
            Eine Einführung gibt es z.B. in OpenBook Visual C# Kap.26

            Gruß Jürgen

            Comment


            • #7
              Hi,

              danke für Eure Antworten. Ich werd mich dann mal die Tage damit beschäftigen.

              Werd mir auch mal das Openbook anschauen. Hab mir damals ein C# Buch gekauft, indem sowas leider nicht drin steht.


              Vielen Dank!!!

              Comment


              • #8
                Hallo,

                Wie rufst Du den das Form2 auf? Öffnest Du es aus Form1 heraus?

                Falls dies der Fall ist, solltest Du die SqlConnection im Konstruktor als Parameter mit übergeben. Das wäre das einfachste. Dann brauchst Du die Connection in Form1 auch nicht public zu setzen. Es verwenden dann beide Formulare die gleiche SqlConnection. Dies liegt daran, dass SqlConnection ein Reference-Type ist.

                Das bedeutet. Solltest Du in Form1 die Connection Zur Datenbank schliessen, ist sie auch in Form2 geschlossen.

                Hoffe Du kannst damit etwas anfangen.
                Gruss

                Mirko

                Mappen statt hacken mit dem .NET O/R Mapper Invist

                Comment

                Working...
                X