cubic83
Goto Top

CSharp - Queries an MSSQL DB in einer rekursiven Funktion

Hallo,

ich habe mal wieder ein kleines Problem. Ich habe auf unserem MSSQL Server eine DB mit einer Tabelle. Diese Tabelle stellt eine Ordnerstruktur mit Referenz auf sich selbst dar.

[folder]
idfolder (int)
fitopfolder (int)
dtname

Wie kriege ich das nun richtig mit c# ausgelesen? Mein aktueller code lautet:

private void GetSubFolders(String folderid) {
  SqlCommand SelectCommand = new SqlCommand("SELECT idfolder, dtname FROM folder WHERE fitopfolder='" + folderid.ToString() + "' ORDER BY dtname ASC", sqlconnection);  
  SqlDataReader reader = SelectCommand.ExecuteReader();
   while (reader.Read())
   {
           GetSubFolders(Convert.ToString(reader.GetValue(0));
    }
    reader.Close();
}

Ich kriege die Exception (steht auch so in der Doku) dass reader zunächst geschlossen sein muss bevor er erneut benutzt werden kann. Wie muss ich meine Funktion jetzt aufbauen? Google jetzt schon fast den ganzen Nachmittag ohne dass ich etwas gefunden habe. Das ist das erste Mal dass ich mit c# auf einen Datenbank Server zugreife und finde das leider alles etwas verwirrend.


Vielen Dank

Content-Key: 177472

Url: https://administrator.de/contentid/177472

Printed on: April 23, 2024 at 18:04 o'clock

Member: vorstieg
vorstieg Dec 08, 2011 at 15:50:45 (UTC)
Goto Top
Hi

Speicher doch die Daten in einer List und schließ den reader bevor du sie Funktion erneut aufrufst.

Gruß
Mitglied: 32067
32067 Dec 08, 2011 at 16:13:37 (UTC)
Goto Top
Zitat von @vorstieg:
Hi
> Speicher doch die Daten in einer List und schließ den reader bevor du sie Funktion erneut aufrufst.
Gruß

Würde ich auch so machen.

Dann hast du auch immer nur eine aktive DB-Verbindung und nicht mehrere, in Abhängigkeit von deiner Schachtelungstiefe.
Member: Cubic83
Cubic83 Dec 09, 2011 at 06:23:50 (UTC)
Goto Top
Hallo,

wie sehe dann der Code dazu aus?

Wenn ich den Reader.close in die Schleife nehme, dann funktionniert ja das reader.read() nicht mehr?

private void GetSubFolders(String folderid) {
  SqlCommand SelectCommand = new SqlCommand("SELECT idfolder, dtname FROM folder WHERE fitopfolder='" + folderid.ToString() + "' ORDER BY dtname ASC", sqlconnection);  
  SqlDataReader reader = SelectCommand.ExecuteReader();
   while (reader.Read())
   {
           String myValue = Convert.ToString(reader.GetValue(0);
           reader.Close();
           GetSubFolders(myValue);
    }

}

Oder verstehe ich das falsch?

mfG
Member: vorstieg
vorstieg Dec 09, 2011 at 09:23:41 (UTC)
Goto Top
Ja, eine List vor der while Schleife erstellen und in der while: List.Add(reader.Value) //Achtung nur Pseudocode

danach(nach der while) mit foreach() die List durchlaufen

Aber generell musst du die abgerufenen Daten ja irgendwo ablegen, oder? Deine Funktion hat nur void als Rückgabewert.
Member: Cubic83
Cubic83 Dec 09, 2011 at 13:31:30 (UTC)
Goto Top
Danke, das funktionniert jetzt auch soweit. Aber ich brech mir einen ab mit der Funktion. Eigentlich will ich einen TreeView mit den Daten füllen.

private void GetSubFolders(String folderid) {
   try
   {
      SqlCommand SelectCommand = new SqlCommand("SELECT idfolder, dtname FROM folder WHERE fitopfolder='" + folderid.ToString() + "' ORDER BY dtname ASC", sqlconnection);  
      SqlDataReader reader = SelectCommand.ExecuteReader();
      if (reader.HasRows)
      {

         List<String> myList = new List<String>();

         while (reader.Read())
         {
            TreeNode newNode = new TreeNode();
            newNode.Text = Convert.ToString(reader.GetValue(1));
            newNode.Tag = reader.GetValue(0);
            newNode.SelectedImageIndex = '0';  

            myList.Add(Convert.ToString(reader.GetValue(0)));

            myTreeNode.Add(newNode);  
                        
         }
         reader.Close();
                    
         for (int i = 0; i < myList.Count; i++)
         {
             GetSubFolders(myList[i]);
         }
                    
    	}
    	if (!reader.IsClosed)
    	{
         reader.Close();
      }
   }
   catch (Exception err)
   {
      MessageBox.Show(err.ToString());
   }
}

Wie muss ich das aufbauen, damit mit das Treeview (mytree ist das TreeView auf dem Form) recursiv aufgebaut wird? Normalerweis würde ich das jetzt ausprobieren bis es klappt, aber hier bin ich langsam am Verzweifeln. Wäre auch cool, wenn ich vorm Wochenende noch was aufzuweisen hätte ;)

Vielen Dank,
Member: vorstieg
vorstieg Dec 09, 2011 at 14:23:20 (UTC)
Goto Top
schau dir mal http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx an, das hilft dir vielleicht weiter.
Mit TreeViews hab ich selber nicht gearbeitet.

Gruß