Announcement

Collapse
No announcement yet.

Klasse,Methode und Array übergeben?

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

  • Klasse,Methode und Array übergeben?

    Hallo,

    ich möchte gerne einiges über OOP lernen. „Normales“ Programmieren kann ich. Ich kann Daten aus einer Datenbank auslesen und anzeigen lassen und und und.


    Ich möchte dies aber nun mit einer Klasse  DB machen.

    Ich habe eine Klasse deklariert.

    Code:
    namespace QoSRoboterTools
    {
        public class QoSRoboterDB
        {
        }
    }
    Dort habe ich eine Methode entwickelt, die die Connection aufbaut.

    Der Server Name wird aus einer Liste übergeben und somit stellt er die Verbindung zum Server her.
    Code:
    private string SQLVerbindungsString;
    
            public string GetDBStatus()
            {
                return SQLVerbindungsString;
            }
    
    
    public string DB_Open(string SQLServer)
            {
                try
                {
                    string SQLVerbindung = String.Format("Integrated Security=SSPI;Persist Security Info=False;Data Source={0}", SQLServer);
    
                    SqlConnection conn = new SqlConnection();
    
                    conn.ConnectionString = SQLVerbindung;
    
                    conn.Open();
    
                    SQLVerbindungsString = SQLVerbindung;
    
                    return SQLVerbindung;
    
                }
                catch (Exception)
                {
                    throw null;
                }
            }
    Nun möchte ich, das er mithilfe der Connection die einzelnen Datenbanken des Server auslesen.

    Mit der SQL-Abfrage
    Code:
    SELECT name FROM [sys].[databases]
    Dieses Ergebnis möchte ich in einer Methode in ein Array Speichern und dann später in der WinForm mittel ComboBox.Items.ADDRANGE(); übergeben.

    Mein derzeitiger ansatz ist wie folgt:

    Code:
            private string[] SQlResultArray;
    
    
            public string[] GetDBTabellen()
            {
                return SQlResultArray;
            }
    
    
    public string DB_DataBases()
            {
                string[] result = new string[255];
                string SQLDatabases = "SELECT name FROM [sys].[databases] WHERE name LIKE 'qos%'";
    
                SqlConnection conn = new SqlConnection(SQLVerbindungsString);
    
                SqlCommand comm = new SqlCommand(SQLDatabases,conn);
    
                SqlDataReader reader = null;
    
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        string result1 = reader["Name"] as string;
                        result1 = result[];
                    }
                    SQlResultArray = result;
                }
         
                return SQLDatabases;
            }
    Also irgend wie funktioniert das nicht so ganz. Ich habe nur einen Teil herauskopiert. Da ich derzeit am verzweifeln bin, wie ich die Werte in das array schreibe und übergeben kann.

    Vielleicht kann mir einer Helfen. Falls er mein Problem versteht und durch den Code blickt^^

    Entweder ahbe ich das mit den Klassen und so noch nicht verstanden oder nun ja.....

    Mit freundlichen Grüßen

    Seby

  • #2
    Hallo,

    mir gefällt Deine Vorgehensweise überhaupt nicht. Das kann aber auch daran liegen, dass Du eben nur einen Teil Deines Codes zeigst. Bitte beachte vor allem, dass unter ADO.NET eine DbConnection immer nur kurzfristig erstellt und geöffnet wird. Eine bevorzugte Arbeitsweise habe ich unter SQLConnection und zwei Forms skizziert und erläutert.

    Der entscheidende Fehler liegt aber darin, dass Du dem DataReader null zuweist, aber keine Abfrage startest:
    Code:
    SqlDataReader reader = comm.ExecuteReader();
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            string result1 = reader["Name"] as string;
            //  und übernehmen
        }
    }
    Zusätzliche Probleme bekommst Du dadurch, dass ein Array unter C# immer eine feste Größe hat. Mit einer List<string> fährst Du bei solchen Abfragen besser:
    Code:
    List<string> SQlResultArray = new List<string>();
    //  und danach:
        while (reader.Read())
        {
            string result1 = reader["Name"] as string;
            if (result1 != null)
                SQlResultArray.Add(result1);
        }
    Außerdem musst Du offensichtlich auf die Rückgabewerte genauer aufpassen. Wozu lässt Du dir den SELECT-Befehl als Ergebnis zurückgeben? So ist es vermutlich gedacht:
    Code:
    public List<string> DB_DataBases()     {
        List<string> SQlResultArray = new List<string>();
        //  Abfrage wie vorgesehen, aber natürlich mit den Korrekturen
    
        //  zum Abschluss aber:
        return SQlResultArray;
    }
    Bitte versuche eine bessere Strukturierung; dann antworte ich gerne weiter. Jürgen

    Nachtrag: Einführende Literatur findest Du unter OpenBook C# und OpenBook Visual C#, dabei in Kap.26 die Datenbankverarbeitung.
    Zuletzt editiert von Jürgen Thomas; 24.10.2007, 11:50. Reason: Nachtrag hinzugefügt

    Comment


    • #3
      Hallo,

      vielen Dank für die Antwort.

      ich guck mir das nochmal alles an.

      meld mich dann nochmal

      Comment


      • #4
        Hallo,

        möchtest Du unbedingt ein Array als Rückgabewert, oder kann es auch eine Liste sein? Was machst Du wenn der Server mehr als 255 Datenbanken hat?

        Falls Du inbedingt ein Array und keine Liste als Rückgabe haben möchtest, wäre der bessere Weg alle Datenbank in eine Liste zu schreiben. Die Liste kannsz Du anschliessend in ein Array umwandeln. Das wäre der sichere Weg.

        Zu zweiten ist mir aufgefallen, dass Du erst überprüfst, ob Überhaupt ergebbnisse existieren und anschliessend läufts Du mit einer While-Schleife nochmals drüber. Die vorherige Abfrage ist überflüssig. Wenn keine Datenbank vorhanden sind, wird die While-Schleife gar nicht ausgeführt.


        Deine Code könnte also folgendermassen aussehen:

        public List<String> GetDataBaseNames( SqlCommand command ) {
        List<String> databaseNames = new List<String>();
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read() ) {
        databaseNames.Add( reader["Name"] as String);
        }

        return databaseNames;
        }
        Gruss

        Mirko

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

        Comment

        Working...
        X