Problem bei Rückgabewert einer Methode



  • Hallo Leute,

    ich habe ein Problem mit der Auslagerung von Anweisungen in eine eigene Methode und der Nutzung deren Rückgabewerte.

    Ich möchte eine Verbindung zu einer Datenbank herstellen und Daten aus dieser lesen. Das klappt soweit ganz gut.

    Um den Quelltext nicht aufzublähen und mehrfach tippen zu müssen, wollte ich die Funktionalitäten zum Verbindungsaufbau einfach in eine Funktion auslagern, sodass ich später lediglich noch diese Funktion aufrufen muss und die return-Werte zum eigentlichen Verbindungsaufbau nutzen.

    Das klappte auf Anhieb nicht, da ich Probleme mit den Namensräumen (Scopes) hatte. Nun habe ich den Quelltext etwas umgestellt, der Compiler läuft durch, das Programm startet, doch beim Versuch eine Verbindung aufzubauen fliegt mir folgende Exception um die Ohren: "Der Objektverweis wurde nicht auf eine Objektinstanz hinterlegt".

    Ich glaube einfach das es Probleme beim Rückgabewert der Methode gibt, da es mir nicht mal gelingt, eine Meldung mit den return-Werten auszugeben.

    Kann mir wer einen Denkansatz geben?

    Meine Methode:

    //Variablen
            string CrLF;
            SqlConnection con;
    
            //Methode für DB-Aufbau
            public string InitialConnection()
            {
    
                //Erzeugt NewLine in MessageBox
                string CrLF = Environment.NewLine;
    
                SqlConnection con = new SqlConnection();
    
                con.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
                                       @"AttachDbFilename=..." +
                                        "Integrated Security=True;" +
                                        "Connect Timeout=30;" +
                                        "User Instance=True";
    
                return CrLF + con;
            }
    

    ...DB Aufruf bei Klick eines Buttons:

    //Button zum Öffnen der Verbindung
            private void btn_con1_Click_1(object sender, RoutedEventArgs e)
            {
    
                //Fehlerbehandlung beim Öffnen der Verbindung
                try
                {
                    InitialConnection();
    
                    con.Open();
    
                    MessageBox.Show("Die Verbindung wurde erfolgreich hergestellt!" + 
                                    CrLF + CrLF +
                                    "Data Source: " + con.DataSource +
                                    CrLF +
                                    "Server Version: " + con.ServerVersion);
    
                    con.Close();
                }
    
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Fehler!");
                }
    
                finally
                {
    
                    con.Close();
                }
            }
    


  • In deiner Methode InitialConnection definierst du die lokalen Variablen CrLF und con. Diesen weist du dann einen Wert zu. Diese Variablen verpuffen, nachdem die Funktion ausgeführt wurde. Wenn du in der InitialConnection den Membervariablen deiner Klasse Werte zuweisen willst, musst du den Datentyp vor den Variablennamen weg lassen, da es sonst eine Definition und keine Zuweisung ist:

    //Methode für DB-Aufbau
    public string InitialConnection()
    {
    
    	//Erzeugt NewLine in MessageBox
    	CrLF = Environment.NewLine; // hier kein Datentyp
    
    	con = new SqlConnection(); // hier auch kein Datentyp
    
    	con.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
    						   @"AttachDbFilename=..." +
    							"Integrated Security=True;" +
    							"Connect Timeout=30;" +
    							"User Instance=True";
    
    	return CrLF + con;
    }
    

    Und wieso hat die Methode InitialConnection einen Rückgabewert, wenn er gar nicht verwendet wird?



  • Kann man eine SqlConnection implizit in einen String umwandeln?



  • Wie so ziemlich jeden Typen der von Object erbt, da das Framework (zumindest in der Art und Weise wie der TE es zurück gibt) einfach .ToString() des Objektes aufruft. Auch wenn das jetzt nicht das Thema sein sollte.


Anmelden zum Antworten